ngx-signal-query 1.1.0 → 1.2.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngx-signal-query.mjs +62 -12
- package/fesm2022/ngx-signal-query.mjs.map +1 -1
- package/index.d.ts +36 -2
- package/package.json +1 -1
|
@@ -779,10 +779,20 @@ function injectQuery(optionsFn, options) {
|
|
|
779
779
|
const seed = cache.getOrCreate(untracked(defaultedOptions).queryKey);
|
|
780
780
|
applyInitialData(seed);
|
|
781
781
|
const query = signal(seed, ...(ngDevMode ? [{ debugName: "query" }] : []));
|
|
782
|
+
// Data of the last query that had any, fed to the placeholderData function
|
|
783
|
+
// on key change (mirrors TanStack's lastQueryWithDefinedData). Captured
|
|
784
|
+
// synchronously before the switch so it can't miss a just-resolved value.
|
|
785
|
+
const lastData = signal(undefined, ...(ngDevMode ? [{ debugName: "lastData" }] : []));
|
|
782
786
|
effect(() => {
|
|
783
787
|
const key = defaultedOptions().queryKey;
|
|
784
788
|
const q = untracked(() => cache.getOrCreate(key));
|
|
785
|
-
untracked(() =>
|
|
789
|
+
untracked(() => {
|
|
790
|
+
const prev = query();
|
|
791
|
+
if (prev !== q && prev.state().data !== undefined) {
|
|
792
|
+
lastData.set(prev.state().data);
|
|
793
|
+
}
|
|
794
|
+
applyInitialData(q);
|
|
795
|
+
});
|
|
786
796
|
query.set(q);
|
|
787
797
|
});
|
|
788
798
|
// Memoized: only emits when the flag itself flips, so ordinary data
|
|
@@ -833,19 +843,37 @@ function injectQuery(optionsFn, options) {
|
|
|
833
843
|
}, interval);
|
|
834
844
|
onCleanup(() => clearInterval(id));
|
|
835
845
|
});
|
|
846
|
+
// Placeholder layer: while the query is pending with no data, present
|
|
847
|
+
// placeholderData as already-successful data. Purely presentational — the
|
|
848
|
+
// cache entry stays 'pending' and the fetch proceeds, so isFetching keeps
|
|
849
|
+
// reporting the real request and the placeholder is dropped on resolve.
|
|
850
|
+
const resolved = computed(() => {
|
|
851
|
+
const state = query().state();
|
|
852
|
+
const { placeholderData } = defaultedOptions();
|
|
853
|
+
if (placeholderData !== undefined &&
|
|
854
|
+
state.data === undefined &&
|
|
855
|
+
state.status === 'pending') {
|
|
856
|
+
const data = typeof placeholderData === 'function'
|
|
857
|
+
? placeholderData(lastData())
|
|
858
|
+
: placeholderData;
|
|
859
|
+
if (data !== undefined) {
|
|
860
|
+
return { data, status: 'success', isPlaceholderData: true };
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
return { data: state.data, status: state.status, isPlaceholderData: false };
|
|
864
|
+
}, ...(ngDevMode ? [{ debugName: "resolved" }] : []));
|
|
836
865
|
return {
|
|
837
|
-
data: computed(() =>
|
|
838
|
-
status: computed(() =>
|
|
866
|
+
data: computed(() => resolved().data),
|
|
867
|
+
status: computed(() => resolved().status),
|
|
839
868
|
error: computed(() => query().state().error),
|
|
840
869
|
isFetching: computed(() => query().state().isFetching),
|
|
841
|
-
// First fetch in-flight: fetching with no resolved data yet.
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
isError: computed(() => query().state().status === 'error'),
|
|
870
|
+
// First fetch in-flight: fetching with no resolved data yet. An active
|
|
871
|
+
// placeholder counts as data — the UI shows it, not a loading state.
|
|
872
|
+
isLoading: computed(() => query().state().isFetching && resolved().status === 'pending'),
|
|
873
|
+
isPending: computed(() => resolved().status === 'pending'),
|
|
874
|
+
isSuccess: computed(() => resolved().status === 'success'),
|
|
875
|
+
isError: computed(() => resolved().status === 'error'),
|
|
876
|
+
isPlaceholderData: computed(() => resolved().isPlaceholderData),
|
|
849
877
|
failureCount: computed(() => query().state().failureCount),
|
|
850
878
|
failureReason: computed(() => query().state().failureReason),
|
|
851
879
|
// Force a fresh fetch regardless of staleTime, cancelling any in-flight
|
|
@@ -1034,6 +1062,28 @@ function queryOptions(options) {
|
|
|
1034
1062
|
return options;
|
|
1035
1063
|
}
|
|
1036
1064
|
|
|
1065
|
+
/**
|
|
1066
|
+
* Placeholder function that keeps the previous query's data visible while the
|
|
1067
|
+
* next one loads — pass as `placeholderData` to avoid flicker when the query
|
|
1068
|
+
* key changes (e.g. pagination, search).
|
|
1069
|
+
*
|
|
1070
|
+
* While the placeholder is shown, `status` reads `'success'` and
|
|
1071
|
+
* `isPlaceholderData()` is `true`; `isFetching()` stays `true` so the UI can
|
|
1072
|
+
* indicate the data is stale.
|
|
1073
|
+
*
|
|
1074
|
+
* @example
|
|
1075
|
+
* ```ts
|
|
1076
|
+
* readonly todos = injectQuery(() => ({
|
|
1077
|
+
* queryKey: ['todos', this.page()],
|
|
1078
|
+
* queryFn: () => this.http.get<Todo[]>(`/api/todos?page=${this.page()}`),
|
|
1079
|
+
* placeholderData: keepPreviousData,
|
|
1080
|
+
* }))
|
|
1081
|
+
* ```
|
|
1082
|
+
*/
|
|
1083
|
+
function keepPreviousData(previousData) {
|
|
1084
|
+
return previousData;
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1037
1087
|
/**
|
|
1038
1088
|
* Identity helper that defines a typed, reusable set of {@link MutationOptions}.
|
|
1039
1089
|
*
|
|
@@ -1090,5 +1140,5 @@ function withDefaultOptions(options) {
|
|
|
1090
1140
|
* Generated bundle index. Do not edit.
|
|
1091
1141
|
*/
|
|
1092
1142
|
|
|
1093
|
-
export { QueryClient, QueryClientFeatureKind, injectIsFetching, injectIsMutating, injectMutation, injectQuery, injectQueryClient, mutationOptions, provideQueryClient, queryOptions, withDefaultOptions };
|
|
1143
|
+
export { QueryClient, QueryClientFeatureKind, injectIsFetching, injectIsMutating, injectMutation, injectQuery, injectQueryClient, keepPreviousData, mutationOptions, provideQueryClient, queryOptions, withDefaultOptions };
|
|
1094
1144
|
//# sourceMappingURL=ngx-signal-query.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-signal-query.mjs","sources":["../../../projects/ngx-signal-query/src/lib/core/cache.ts","../../../projects/ngx-signal-query/src/lib/core/utils.ts","../../../projects/ngx-signal-query/src/lib/core/retryer.ts","../../../projects/ngx-signal-query/src/lib/core/query.ts","../../../projects/ngx-signal-query/src/lib/core/query-cache.ts","../../../projects/ngx-signal-query/src/lib/core/mutation.ts","../../../projects/ngx-signal-query/src/lib/core/mutation-cache.ts","../../../projects/ngx-signal-query/src/lib/core/injection-tokens.ts","../../../projects/ngx-signal-query/src/lib/core/query-client.ts","../../../projects/ngx-signal-query/src/lib/features/feature.ts","../../../projects/ngx-signal-query/src/lib/core/provider.ts","../../../projects/ngx-signal-query/src/lib/core/inject-query-client.ts","../../../projects/ngx-signal-query/src/lib/core/inject-query.ts","../../../projects/ngx-signal-query/src/lib/core/inject-mutation.ts","../../../projects/ngx-signal-query/src/lib/core/inject-is-fetching.ts","../../../projects/ngx-signal-query/src/lib/core/inject-is-mutating.ts","../../../projects/ngx-signal-query/src/lib/core/query-options.ts","../../../projects/ngx-signal-query/src/lib/core/mutation-options.ts","../../../projects/ngx-signal-query/src/lib/features/with-default-options.ts","../../../projects/ngx-signal-query/src/public-api.ts","../../../projects/ngx-signal-query/src/ngx-signal-query.ts"],"sourcesContent":["import { signal } from '@angular/core'\n\n/** @internal */\nexport abstract class Cache<TEntry> {\n readonly #entries = signal<TEntry[]>([])\n\n // Reactive snapshot of all entries; updated on add/remove/clear so that\n // findAll() (and its computed consumers like isFetching) react to the\n // collection. Protected: only subclasses read it, never external code.\n protected readonly entries = this.#entries.asReadonly()\n\n readonly #entriesMap = new Map<string, TEntry>()\n\n getAll(): TEntry[] {\n return Array.from(this.#entriesMap.values())\n }\n\n clear(): void {\n this.#entriesMap.clear()\n this.#sync()\n }\n\n protected addEntry(key: string, entry: TEntry): TEntry {\n this.#entriesMap.set(key, entry)\n this.#sync()\n\n return entry\n }\n\n protected getEntry(key: string): TEntry | undefined {\n return this.#entriesMap.get(key)\n }\n\n protected removeEntry(key: string): boolean {\n const removed = this.#entriesMap.delete(key)\n\n if (removed) this.#sync()\n\n return removed\n }\n\n #sync(): void {\n this.#entries.set(Array.from(this.#entriesMap.values()))\n }\n}\n","import type { QueryKey, Updater } from './types'\n\n// Resolves an updater: calls it with the previous value if it's a function,\n// otherwise uses it as the value directly.\n/** @internal */\nexport function functionalUpdate<TInput, TOutput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as (input: TInput) => TOutput)(input)\n : updater\n}\n\n// True when `filter` is a (deep) prefix of `key`, e.g. ['app'] matches\n// ['app', 1]. Used to invalidate/find groups of queries by partial key.\n/** @internal */\nexport function partialMatchKey(key: QueryKey, filter: QueryKey): boolean {\n return partialDeepEqual(key, filter)\n}\n\nfunction partialDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== typeof b) return false\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n return Object.keys(b).every((key) =>\n partialDeepEqual(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n }\n\n return false\n}\n\n/** @internal */\nexport function hashKey(key: QueryKey): string {\n return JSON.stringify(key, (_, value) =>\n isPlainObject(value)\n ? Object.keys(value)\n .sort()\n .reduce<Record<string, unknown>>((result, k) => {\n result[k] = value[k]\n\n return result\n }, {})\n : value,\n )\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isPlainObject(o: any): o is Record<PropertyKey, unknown> {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has no constructor\n const ctor = o.constructor\n\n if (ctor === undefined) {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOf')) {\n return false\n }\n\n // Handles Objects created by Object.create(<arbitrary prototype>)\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction hasObjectPrototype(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n","import type { RetryDelayValue, RetryValue } from './types'\n\n// Exponential backoff capped at 30s, matching TanStack's default.\n/** @internal */\nexport function defaultRetryDelay(failureCount: number): number {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\n/** @internal */\nexport function shouldRetry<TError>(\n retry: RetryValue<TError>,\n failureCount: number,\n error: TError,\n): boolean {\n if (typeof retry === 'function') return retry(failureCount, error)\n if (typeof retry === 'number') return failureCount < retry\n\n return retry\n}\n\n/** @internal */\nexport function resolveRetryDelay<TError>(\n retryDelay: RetryDelayValue<TError>,\n failureCount: number,\n error: TError,\n): number {\n return typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n}\n","import { signal } from '@angular/core'\nimport {\n defer,\n from,\n retry as retryOperator,\n take,\n throwIfEmpty,\n timer,\n type Observable,\n type Subscription,\n} from 'rxjs'\n\nimport type { QueryCache } from './query-cache'\nimport { defaultRetryDelay, resolveRetryDelay, shouldRetry } from './retryer'\nimport type { QueryKey, QueryState, RetryDelayValue, RetryValue } from './types'\n\nconst DEFAULT_GC_TIME = 5 * 60 * 1000\n\n/** @internal */\nexport class Query<TData, TError = Error> {\n readonly #state = signal<QueryState<TData, TError>>({\n data: undefined,\n status: 'pending',\n error: null,\n isFetching: false,\n isInvalidated: false,\n failureCount: 0,\n failureReason: null,\n updatedAt: 0,\n })\n\n // `state` must follow `#state`: a public field can't precede the private\n // field it reads during initialization (field init order).\n // eslint-disable-next-line @typescript-eslint/member-ordering\n readonly state = this.#state.asReadonly()\n\n #subscription: Subscription | null = null\n #observers = 0\n #gcTime = DEFAULT_GC_TIME\n #gcTimer: ReturnType<typeof setTimeout> | null = null\n readonly #cache: QueryCache\n\n constructor(\n readonly key: QueryKey,\n readonly queryHash: string,\n cache: QueryCache,\n ) {\n this.#cache = cache\n }\n\n get observerCount(): number {\n return this.#observers\n }\n\n setGcTime(ms: number): void {\n this.#gcTime = ms\n }\n\n addObserver(): void {\n this.#observers++\n this.#clearGcTimer()\n }\n\n removeObserver(): void {\n if (this.#observers === 0) return\n\n this.#observers--\n\n // No observers left: cancel any in-flight fetch (nobody is waiting for it)\n // and schedule gc to dispose the query if no observer returns.\n if (this.#observers === 0) {\n this.cancel()\n this.#scheduleGc()\n }\n }\n\n fetch(\n queryFn: () => Observable<TData> | Promise<TData>,\n retry: RetryValue<TError> = 0,\n retryDelay: RetryDelayValue<TError> = defaultRetryDelay,\n cancelRefetch = false,\n ): void {\n if (this.#subscription && !this.#subscription.closed) {\n // Already in-flight: dedupe unless the caller explicitly wants a fresh\n // fetch (e.g. invalidate/refetch) — then cancel the old one and restart.\n if (!cancelRefetch) return\n this.cancel()\n }\n\n this.#state.update((state) => ({\n ...state,\n isFetching: true,\n failureCount: 0,\n failureReason: null,\n }))\n\n // defer + from: normalize Observable/Promise and re-invoke queryFn on each\n // retry (a Promise is one-shot, so retry must produce a fresh one).\n this.#subscription = defer(() => from(queryFn()))\n .pipe(\n take(1),\n retryOperator({\n delay: (error, retryCount) => {\n // retryCount (1-based) is the number of failures so far; the retry\n // predicate/delay take a 0-based attempt index (0 = first retry).\n this.#state.update((state) => ({\n ...state,\n failureCount: retryCount,\n failureReason: error as TError,\n }))\n\n const attemptIndex = retryCount - 1\n\n if (!shouldRetry(retry, attemptIndex, error as TError)) throw error\n\n return timer(\n resolveRetryDelay(retryDelay, attemptIndex, error as TError),\n )\n },\n }),\n throwIfEmpty(\n () => new Error('Query function completed without emitting a value'),\n ),\n )\n .subscribe({\n next: (data) =>\n this.#state.set({\n data,\n status: 'success',\n error: null,\n isFetching: false,\n isInvalidated: false,\n failureCount: 0,\n failureReason: null,\n updatedAt: Date.now(),\n }),\n error: (err) =>\n this.#state.update((state) => ({\n ...state,\n status: 'error',\n error: err,\n isFetching: false,\n })),\n })\n }\n\n setData(data: TData, updatedAt: number = Date.now()): void {\n this.#state.update((state) => ({\n ...state,\n data,\n status: 'success',\n error: null,\n isInvalidated: false,\n failureCount: 0,\n failureReason: null,\n updatedAt,\n }))\n\n // Keep an orphaned query (no observers) alive for another gcTime so a\n // setQueryData write isn't collected before anyone subscribes.\n if (this.#observers === 0) this.#scheduleGc()\n }\n\n invalidate(): void {\n this.#state.update((state) => ({ ...state, isInvalidated: true }))\n }\n\n shouldFetch(staleTime: number): boolean {\n const state = this.state()\n\n return (\n state.status !== 'success' ||\n state.isInvalidated ||\n this.#isStale(staleTime)\n )\n }\n\n cancel(): void {\n this.#subscription?.unsubscribe()\n this.#subscription = null\n\n // The fetch is no longer running; clear the in-flight flag so isFetching\n // doesn't stay stuck true after a cancellation.\n if (this.state().isFetching) {\n this.#state.update((state) => ({ ...state, isFetching: false }))\n }\n }\n\n destroy(): void {\n this.cancel()\n this.#clearGcTimer()\n }\n\n // Inclusive: data fetched exactly `staleTime` ago is already stale. This\n // matters for seeded data (initialData is stamped with the current time), so\n // the default staleTime of 0 still means \"stale at once\" → background\n // refetch, rather than depending on whether a millisecond happened to pass.\n #isStale(staleTime: number): boolean {\n return Date.now() - this.state().updatedAt >= staleTime\n }\n\n #scheduleGc(): void {\n this.#clearGcTimer()\n\n this.#gcTimer = setTimeout(() => {\n this.#gcTimer = null\n this.#cache.remove(this)\n }, this.#gcTime)\n }\n\n #clearGcTimer(): void {\n if (this.#gcTimer === null) return\n\n clearTimeout(this.#gcTimer)\n this.#gcTimer = null\n }\n}\n","import { Injectable } from '@angular/core'\n\nimport { Cache } from './cache'\nimport { hashKey, partialMatchKey } from './utils'\nimport { Query } from './query'\nimport type { QueryFilters, QueryKey } from './types'\n\n/** @internal */\n@Injectable()\nexport class QueryCache extends Cache<Query<unknown, unknown>> {\n getOrCreate<TData, TError = Error>(key: QueryKey): Query<TData, TError> {\n const queryHash = hashKey(key)\n const exist = this.getEntry(queryHash)\n\n if (exist) return exist as Query<TData, TError>\n\n return this.addEntry(queryHash, new Query(key, queryHash, this)) as Query<\n TData,\n TError\n >\n }\n\n get<TData, TError = Error>(key: QueryKey): Query<TData, TError> | undefined {\n return this.getEntry(hashKey(key)) as Query<TData, TError> | undefined\n }\n\n findAll(filters: QueryFilters = {}): Array<Query<unknown, unknown>> {\n const { queryKey, exact } = filters\n\n // Reads the reactive `entries()` so findAll() works inside computed().\n const all = this.entries()\n\n if (!queryKey) return all\n\n if (exact) {\n const queryHash = hashKey(queryKey)\n\n return all.filter((query) => query.queryHash === queryHash)\n }\n\n return all.filter((query) => partialMatchKey(query.key, queryKey))\n }\n\n remove(query: Query<unknown, unknown>): void {\n // Guard on identity, not just the hash: a stale instance (already removed\n // and recreated under the same key) must not evict the current query.\n if (this.getEntry(query.queryHash) === query) {\n this.removeEntry(query.queryHash)\n }\n }\n\n override clear(): void {\n this.getAll().forEach((query) => query.destroy())\n super.clear()\n }\n}\n","import { type Signal, signal } from '@angular/core'\nimport {\n defer,\n from,\n retry as retryOperator,\n take,\n throwIfEmpty,\n timer,\n type Observable,\n type Subscription,\n} from 'rxjs'\n\nimport type { MutationCache } from './mutation-cache'\nimport { defaultRetryDelay, resolveRetryDelay, shouldRetry } from './retryer'\nimport type { RetryDelayValue, RetryValue } from './types'\n\n/** Lifecycle status of a mutation: not yet run, running, succeeded, or failed. */\nexport type MutationStatus = 'idle' | 'pending' | 'success' | 'error'\n\n/** Selects which mutations an operation applies to (e.g. `injectIsMutating`). */\nexport type MutationFilters = {\n /** Match mutations in this status. */\n status?: MutationStatus\n}\n\n/** Full state snapshot of a mutation (the reactive source behind {@link MutationResult}). */\nexport type MutationState<TData, TError, TVariables, TContext> = {\n /** Current {@link MutationStatus}. */\n status: MutationStatus\n /** Data resolved by the last successful run, or `undefined`. */\n data: TData | undefined\n /** Error of the last failed run, or `null`. */\n error: TError | null\n /** Variables passed to the most recent `mutate()` call. */\n variables: TVariables | undefined\n /** Value returned by `onMutate` for the current run. */\n context: TContext | undefined\n /** Number of failed attempts in the current run. */\n failureCount: number\n /** Error of the most recent failed attempt, or `null`. */\n failureReason: TError | null\n /** Timestamp (ms) when the current run was submitted; `0` if never. */\n submittedAt: number\n}\n\n/**\n * Configuration for a mutation, passed to {@link injectMutation} /\n * {@link mutationOptions}. The hooks fire in order: `onMutate` →\n * (`onSuccess` | `onError`) → `onSettled`. The value returned by `onMutate`\n * is passed as `context` to the later hooks — handy for rollback.\n */\nexport type MutationOptions<TData, TError, TVariables, TContext> = {\n /** Performs the write; receives `mutate()`'s argument. Returns `Observable`/`Promise`. */\n mutationFn: (variables: TVariables) => Observable<TData> | Promise<TData>\n /** Retry policy. Defaults to no retry (writes are not idempotent). */\n retry?: RetryValue<TError>\n /** Delay between retries. See {@link RetryDelayValue}. */\n retryDelay?: RetryDelayValue<TError>\n /** Runs before `mutationFn`; its return value becomes `context` (e.g. for optimistic rollback). */\n onMutate?: (variables: TVariables) => TContext | undefined\n /** Runs after a successful `mutationFn`. */\n onSuccess?: (\n data: TData,\n variables: TVariables,\n context: TContext | undefined,\n ) => void\n /** Runs after a failed `mutationFn`. */\n onError?: (\n error: TError,\n variables: TVariables,\n context: TContext | undefined,\n ) => void\n /** Runs after success or error — for cleanup that should happen either way. */\n onSettled?: (\n data: TData | undefined,\n error: TError | null,\n variables: TVariables,\n context: TContext | undefined,\n ) => void\n}\n\n/** Reactive result returned by {@link injectMutation}; state fields are signals. */\nexport type MutationResult<TData, TError, TVariables> = {\n /** Triggers the mutation with the given variables. */\n mutate: (variables: TVariables) => void\n /** Resets state back to `idle`, cancelling any in-flight run. */\n reset: () => void\n /** Data from the last successful run, or `undefined`. */\n data: Signal<TData | undefined>\n /** Error from the last failed run, or `null`. */\n error: Signal<TError | null>\n /** Variables from the most recent `mutate()` call. */\n variables: Signal<TVariables | undefined>\n /** Current {@link MutationStatus}. */\n status: Signal<MutationStatus>\n /** Whether the mutation has not been run yet. */\n isIdle: Signal<boolean>\n /** Whether the mutation is currently running. */\n isPending: Signal<boolean>\n /** Whether the last run succeeded. */\n isSuccess: Signal<boolean>\n /** Whether the last run failed. */\n isError: Signal<boolean>\n /** Consecutive failures in the current run. */\n failureCount: Signal<number>\n /** Error of the most recent failed attempt, or `null`. */\n failureReason: Signal<TError | null>\n}\n\n/** @internal */\nexport function getInitialState<\n TData,\n TError,\n TVariables,\n TContext,\n>(): MutationState<TData, TError, TVariables, TContext> {\n return {\n status: 'idle',\n data: undefined,\n error: null,\n variables: undefined,\n context: undefined,\n failureCount: 0,\n failureReason: null,\n submittedAt: 0,\n }\n}\n\n/** @internal */\nexport class Mutation<\n TData = unknown,\n TError = Error,\n TVariables = void,\n TContext = unknown,\n> {\n readonly #state =\n signal<MutationState<TData, TError, TVariables, TContext>>(\n getInitialState(),\n )\n\n // `state` must follow `#state`: a public field can't precede the private\n // field it reads during initialization (field init order).\n // eslint-disable-next-line @typescript-eslint/member-ordering\n readonly state = this.#state.asReadonly()\n\n #subscription: Subscription | null = null\n #observers = 0\n readonly #options: MutationOptions<TData, TError, TVariables, TContext>\n readonly #cache: MutationCache\n\n constructor(\n readonly mutationId: number,\n options: MutationOptions<TData, TError, TVariables, TContext>,\n cache: MutationCache,\n ) {\n this.#options = options\n this.#cache = cache\n }\n\n get observerCount(): number {\n return this.#observers\n }\n\n addObserver(): void {\n this.#observers++\n }\n\n /**\n * Unlike a query, losing its last observer does not cancel a mutation: the\n * write has most likely reached the server already, so it must be allowed to\n * land and run its hooks. It is only dropped from the cache once it has both\n * settled and been abandoned — whichever of the two happens last.\n */\n removeObserver(): void {\n if (this.#observers === 0) return\n\n this.#observers--\n\n this.#disposeIfDone()\n }\n\n /** Runs the mutation once. `variables` are passed straight to `mutationFn`. */\n execute(variables: TVariables): void {\n const context = this.#options.onMutate?.(variables)\n // Mutations default to no retry (not idempotent — a retried POST could\n // create a duplicate); opt in explicitly via options.retry.\n const retry = this.#options.retry ?? 0\n const retryDelay = this.#options.retryDelay ?? defaultRetryDelay\n\n this.#state.set({\n status: 'pending',\n data: undefined,\n error: null,\n variables,\n context,\n failureCount: 0,\n failureReason: null,\n submittedAt: Date.now(),\n })\n\n // defer + from: normalize Observable/Promise and re-invoke mutationFn on\n // each retry (a Promise is one-shot, so retry must produce a fresh one).\n this.#subscription = defer(() => from(this.#options.mutationFn(variables)))\n .pipe(\n take(1),\n retryOperator({\n delay: (error, retryCount) => {\n this.#state.update((state) => ({\n ...state,\n failureCount: retryCount,\n failureReason: error as TError,\n }))\n\n const attemptIndex = retryCount - 1\n\n if (!shouldRetry(retry, attemptIndex, error as TError)) throw error\n\n return timer(\n resolveRetryDelay(retryDelay, attemptIndex, error as TError),\n )\n },\n }),\n throwIfEmpty(\n () =>\n new Error('Mutation function completed without emitting a value'),\n ),\n )\n .subscribe({\n // `finally`: a hook that throws must not leave the mutation stranded in\n // the cache (where injectIsMutating would keep counting it forever).\n next: (data) => {\n this.#state.update((state) => ({ ...state, status: 'success', data }))\n\n try {\n this.#options.onSuccess?.(data, variables, context)\n this.#options.onSettled?.(data, null, variables, context)\n } finally {\n this.#disposeIfDone()\n }\n },\n error: (error: TError) => {\n this.#state.update((state) => ({ ...state, status: 'error', error }))\n\n try {\n this.#options.onError?.(error, variables, context)\n this.#options.onSettled?.(undefined, error, variables, context)\n } finally {\n this.#disposeIfDone()\n }\n },\n })\n }\n\n cancel(): void {\n this.#subscription?.unsubscribe()\n this.#subscription = null\n }\n\n /**\n * A run nobody observes any more, and which is no longer in flight, has\n * nothing left to report — drop it. Called from both ends, since the two\n * conditions can be met in either order: a superseded run may settle later,\n * and a settled run may be abandoned later.\n */\n #disposeIfDone(): void {\n if (this.#observers > 0) return\n if (this.state().status === 'pending') return\n\n this.#cache.remove(this)\n }\n}\n","import { Injectable } from '@angular/core'\n\nimport { Cache } from './cache'\nimport {\n type MutationFilters,\n type MutationOptions,\n Mutation,\n} from './mutation'\n\n/** @internal */\n@Injectable()\nexport class MutationCache extends Cache<\n Mutation<unknown, unknown, unknown, unknown>\n> {\n #lastId = 0\n\n build<TData, TError, TVariables, TContext>(\n options: MutationOptions<TData, TError, TVariables, TContext>,\n ): Mutation<TData, TError, TVariables, TContext> {\n const mutation = new Mutation(++this.#lastId, options, this)\n\n this.addEntry(\n String(mutation.mutationId),\n mutation as Mutation<unknown, unknown, unknown, unknown>,\n )\n\n return mutation\n }\n\n findAll(\n filters: MutationFilters = {},\n ): Array<Mutation<unknown, unknown, unknown, unknown>> {\n // Reads the reactive `entries()` so findAll() works inside computed().\n const all = this.entries()\n\n if (!filters.status) return all\n\n return all.filter((mutation) => mutation.state().status === filters.status)\n }\n\n remove<TData, TError, TVariables, TContext>(\n mutation: Mutation<TData, TError, TVariables, TContext>,\n ): void {\n this.removeEntry(String(mutation.mutationId))\n }\n\n override clear(): void {\n this.getAll().forEach((mutation) => mutation.cancel())\n super.clear()\n }\n}\n","import { InjectionToken } from '@angular/core'\n\nimport type { RetryDelayValue, RetryValue } from './types'\n\n/** @internal */\nexport interface QueryClientConfig {\n defaultOptions?: {\n queries?: {\n staleTime?: number\n gcTime?: number\n retry?: RetryValue<unknown>\n retryDelay?: RetryDelayValue<unknown>\n }\n }\n}\n\n/** @internal */\nexport const QUERY_CLIENT_CONFIG = new InjectionToken<QueryClientConfig>(\n 'QUERY_CLIENT_CONFIG',\n)\n","import { inject, Injectable } from '@angular/core'\nimport type { Observable } from 'rxjs'\n\nimport { QueryCache } from './query-cache'\nimport { MutationCache } from './mutation-cache'\nimport { defaultRetryDelay } from './retryer'\nimport { functionalUpdate } from './utils'\nimport type {\n DefaultedQueryOptions,\n QueryFilters,\n QueryKey,\n QueryOptions,\n RetryDelayValue,\n RetryValue,\n Updater,\n} from './types'\nimport { QUERY_CLIENT_CONFIG } from './injection-tokens'\n\n/**\n * Central registry and cache for queries and mutations.\n *\n * Provided by {@link provideQueryClient} and retrieved with\n * {@link injectQueryClient}. Offers imperative cache access — reading and\n * writing data, and invalidating, cancelling, or removing queries — that\n * complements the reactive {@link injectQuery} / {@link injectMutation} APIs.\n */\n@Injectable()\nexport class QueryClient {\n readonly #cache = inject(QueryCache)\n readonly #mutationCache = inject(MutationCache)\n readonly #config = inject(QUERY_CLIENT_CONFIG, { optional: true }) ?? {}\n\n /** Returns the underlying query cache. Advanced/internal use. */\n getQueryCache(): QueryCache {\n return this.#cache\n }\n\n /** Returns the underlying mutation cache. Advanced/internal use. */\n getMutationCache(): MutationCache {\n return this.#mutationCache\n }\n\n /**\n * Merges per-query options with the configured defaults, filling in\n * `staleTime`, `gcTime`, `retry`, and `retryDelay`. Used internally by\n * {@link injectQuery}.\n */\n defaultQueryOptions<TData, TError = Error>(\n options: QueryOptions<TData, TError>,\n ): DefaultedQueryOptions<TData, TError> {\n const defaults = this.#config.defaultOptions?.queries\n\n return {\n ...options,\n staleTime: options.staleTime ?? defaults?.staleTime ?? 0,\n gcTime: options.gcTime ?? defaults?.gcTime,\n retry: options.retry ?? defaults?.retry ?? 3,\n retryDelay:\n options.retryDelay ?? defaults?.retryDelay ?? defaultRetryDelay,\n }\n }\n\n /**\n * Imperatively fetches and caches a query, unless fresh data already exists\n * (governed by `staleTime`). Prefer {@link injectQuery} in components; use\n * this for prefetching outside the reactive flow.\n *\n * @param key - The query key to fetch and cache under.\n * @param queryFn - Function returning the data as an `Observable` or `Promise`.\n * @param options - Fetch tuning (`staleTime`, `retry`, `retryDelay`,\n * `cancelRefetch`).\n */\n fetchQuery<TData>(\n key: QueryKey,\n queryFn: () => Observable<TData> | Promise<TData>,\n options: {\n staleTime?: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n retry?: RetryValue<any>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n retryDelay?: RetryDelayValue<any>\n cancelRefetch?: boolean\n } = {},\n ): void {\n const defaults = this.#config.defaultOptions?.queries\n const staleTime = options.staleTime ?? defaults?.staleTime ?? 0\n const retry = options.retry ?? defaults?.retry ?? 3\n const retryDelay =\n options.retryDelay ?? defaults?.retryDelay ?? defaultRetryDelay\n\n const query = this.#cache.getOrCreate<TData>(key)\n\n if (query.shouldFetch(staleTime)) {\n query.fetch(queryFn, retry, retryDelay, options.cancelRefetch)\n }\n }\n\n /**\n * Reads the current cached data for a query key, or `undefined` if the query\n * is not cached yet.\n *\n * @param key - The query key to read.\n * @returns The cached data, or `undefined`.\n */\n getQueryData<TData>(key: QueryKey): TData | undefined {\n return this.#cache.get<TData>(key)?.state().data\n }\n\n /**\n * Writes data into the cache for a query key, creating the entry if needed.\n * The `updater` may be a value or a function of the previous data; returning\n * `undefined` from the function is a no-op. Useful for optimistic updates.\n *\n * @param key - The query key to write.\n * @param updater - The new data, or a function `(prev) => next`.\n *\n * @example\n * ```ts\n * client.setQueryData<Todo[]>(['todos'], (prev = []) => [...prev, newTodo])\n * ```\n */\n setQueryData<TData>(\n key: QueryKey,\n updater: Updater<TData | undefined, TData>,\n ): void {\n const query = this.#cache.getOrCreate<TData>(key)\n const data = functionalUpdate(updater, query.state().data)\n\n // Matches TanStack: an updater returning undefined is a no-op.\n if (data === undefined) return\n\n query.setData(data)\n }\n\n /**\n * Marks matching queries as stale and triggers a refetch for those that are\n * actively observed. Commonly called after a mutation succeeds.\n *\n * @param filters - Which queries to invalidate; omit to invalidate all.\n *\n * @example\n * ```ts\n * client.invalidateQueries({ queryKey: ['todos'] })\n * ```\n */\n invalidateQueries(filters?: QueryFilters): void {\n this.#cache.findAll(filters).forEach((query) => query.invalidate())\n }\n\n /**\n * Cancels any in-flight fetches for matching queries.\n *\n * @param filters - Which queries to cancel; omit to cancel all.\n */\n cancelQueries(filters?: QueryFilters): void {\n this.#cache.findAll(filters).forEach((query) => query.cancel())\n }\n\n /**\n * Removes matching queries from the cache entirely, discarding their data.\n *\n * @param filters - Which queries to remove; omit to remove all.\n */\n removeQueries(filters?: QueryFilters): void {\n this.#cache.findAll(filters).forEach((query) => {\n query.destroy()\n this.#cache.remove(query)\n })\n }\n\n /**\n * Returns the number of matching queries currently fetching. For a reactive\n * count, prefer {@link injectIsFetching}.\n *\n * @param filters - Which queries to count; omit to count all.\n */\n isFetching(filters?: QueryFilters): number {\n return this.#cache\n .findAll(filters)\n .filter((query) => query.state().isFetching).length\n }\n\n /**\n * Returns the number of mutations currently pending. For a reactive count,\n * prefer {@link injectIsMutating}.\n */\n isMutating(): number {\n return this.#mutationCache.findAll({ status: 'pending' }).length\n }\n}\n","import type { Provider } from '@angular/core'\n\n/**\n * Discriminator identifying each kind of {@link QueryClientFeature}.\n *\n * @internal\n */\nexport enum QueryClientFeatureKind {\n DefaultOptions,\n}\n\n/**\n * An opaque feature passed to {@link provideQueryClient}. Create one with a\n * `with*` helper such as {@link withDefaultOptions} rather than constructing it\n * directly; the `ɵ`-prefixed members are internal.\n */\nexport interface QueryClientFeature<\n K extends QueryClientFeatureKind = QueryClientFeatureKind,\n> {\n ɵkind: K\n ɵproviders: Provider[]\n}\n\n/** @internal */\nexport function queryClientFeature<K extends QueryClientFeatureKind>(\n kind: K,\n providers: Provider[],\n): QueryClientFeature<K> {\n return { ɵkind: kind, ɵproviders: providers }\n}\n","import {\n type EnvironmentProviders,\n makeEnvironmentProviders,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\nimport { QueryCache } from './query-cache'\nimport { MutationCache } from './mutation-cache'\nimport {\n type QueryClientFeature,\n QueryClientFeatureKind,\n} from '../features/feature'\n\n/**\n * Registers the {@link QueryClient} and its caches for the application.\n *\n * Call once at the app root (in `ApplicationConfig.providers` or a root\n * `bootstrapApplication`). Pass features such as {@link withDefaultOptions} to\n * configure defaults. Registering the same feature twice throws.\n *\n * @param features - Optional {@link QueryClientFeature}s (e.g.\n * {@link withDefaultOptions}).\n * @returns Environment providers to add to the app's provider list.\n *\n * @example\n * ```ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(),\n * provideQueryClient(\n * withDefaultOptions({ queries: { staleTime: 30_000 } }),\n * ),\n * ],\n * }\n * ```\n */\nexport function provideQueryClient(\n ...features: QueryClientFeature[]\n): EnvironmentProviders {\n const seenKinds = new Set<QueryClientFeatureKind>()\n\n for (const feature of features) {\n if (seenKinds.has(feature.ɵkind)) {\n throw new Error(\n `provideQueryClient: feature \"${QueryClientFeatureKind[feature.ɵkind]}\" is registered more than once`,\n )\n }\n seenKinds.add(feature.ɵkind)\n }\n\n return makeEnvironmentProviders([\n QueryCache,\n MutationCache,\n QueryClient,\n ...features.flatMap((feature) => feature.ɵproviders),\n ])\n}\n","import { type Injector, assertInInjectionContext, inject } from '@angular/core'\n\nimport { QueryClient } from './query-client'\n\n/**\n * Returns the application's {@link QueryClient} for imperative cache access.\n *\n * Use it to read or write cached data (`getQueryData`, `setQueryData`) and to\n * invalidate, cancel, or remove queries — typically from mutation hooks or\n * event handlers. Requires {@link provideQueryClient} to be registered.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @param options - Optional `injector` to use outside an injection context.\n * @returns The shared {@link QueryClient} instance.\n *\n * @example\n * ```ts\n * const client = injectQueryClient()\n * client.setQueryData<Todo[]>(['todos'], (prev = []) => [...prev, newTodo])\n * client.invalidateQueries({ queryKey: ['todos'] })\n * ```\n */\nexport function injectQueryClient(options?: {\n injector?: Injector\n}): QueryClient {\n if (!options?.injector) assertInInjectionContext(injectQueryClient)\n\n return options?.injector?.get(QueryClient) ?? inject(QueryClient)\n}\n","import {\n assertInInjectionContext,\n computed,\n effect,\n inject,\n Injector,\n runInInjectionContext,\n signal,\n untracked,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\nimport type { Query } from './query'\nimport type { QueryOptions, QueryResult } from './types'\n\n/**\n * Runs a cached, reactive query and exposes its state as signals.\n *\n * The query is keyed by `queryKey`: calls with the same key share a single\n * cache entry and in-flight request (deduplication). `optionsFn` is read in a\n * reactive context, so when a value it depends on changes (e.g. a route or\n * input signal in the key), the query automatically switches to the new key\n * and fetches. The query is bound to the current injection context and cleans\n * up its cache observer when that context is destroyed.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @typeParam TData - Type of the data resolved by `queryFn`.\n * @typeParam TError - Type of the error thrown by `queryFn`.\n * @param optionsFn - Factory returning the {@link QueryOptions}. Re-evaluated\n * reactively, so reading signals inside it makes the query re-run on change.\n * @param options - Optional `injector` to use outside an injection context.\n * @returns A {@link QueryResult} of signals (`data`, `status`, `error`,\n * `isLoading`, `isPending`, …) plus a `refetch()` that forces a fresh fetch.\n *\n * @example\n * ```ts\n * @Component({\n * template: `\n * @if (todo.isPending()) { <p>Loading…</p> }\n * @if (todo.data(); as data) { <p>{{ data.title }}</p> }\n * `,\n * })\n * class TodoComponent {\n * readonly id = input.required<number>()\n * private readonly http = inject(HttpClient)\n *\n * // Refetches automatically whenever `id()` changes.\n * readonly todo = injectQuery(() => ({\n * queryKey: ['todo', this.id()],\n * queryFn: () => this.http.get<Todo>(`/api/todos/${this.id()}`),\n * }))\n * }\n * ```\n */\nexport function injectQuery<TData, TError = Error>(\n optionsFn: () => QueryOptions<TData, TError>,\n options?: { injector?: Injector },\n): QueryResult<TData, TError> {\n if (!options?.injector) assertInInjectionContext(injectQuery)\n\n const injector = options?.injector ?? inject(Injector)\n\n return runInInjectionContext(injector, () => {\n const client = inject(QueryClient)\n const cache = client.getQueryCache()\n\n // Single source of truth for defaulted options; resolves config defaults\n // (staleTime, gcTime) once instead of scattering the logic across effects.\n const defaultedOptions = computed(() =>\n client.defaultQueryOptions(optionsFn()),\n )\n\n // Seed a fresh query (status 'pending', no data yet) with initialData so\n // it renders immediately as 'success'. Without an explicit\n // initialDataUpdatedAt the seed is treated as fetched right now, so\n // staleTime applies to it as it would to any other data (a staleTime of 0\n // still means \"stale immediately\" → background refetch).\n const applyInitialData = (q: Query<TData, TError>): void => {\n const { initialData, initialDataUpdatedAt } = untracked(defaultedOptions)\n\n if (initialData === undefined || q.state().status !== 'pending') return\n\n const data =\n typeof initialData === 'function'\n ? (initialData as () => TData)()\n : initialData\n const updatedAt =\n typeof initialDataUpdatedAt === 'function'\n ? initialDataUpdatedAt()\n : (initialDataUpdatedAt ?? Date.now())\n\n q.setData(data, updatedAt)\n }\n\n // getOrCreate mutates the cache (a side effect), so it must not run inside\n // a computed. Resolve the query in a signal: seed it synchronously and\n // update it from an effect whenever the key changes.\n const seed = cache.getOrCreate<TData, TError>(\n untracked(defaultedOptions).queryKey,\n )\n\n applyInitialData(seed)\n\n const query = signal(seed)\n\n effect(() => {\n const key = defaultedOptions().queryKey\n const q = untracked(() => cache.getOrCreate<TData, TError>(key))\n\n untracked(() => applyInitialData(q))\n query.set(q)\n })\n\n // Memoized: only emits when the flag itself flips, so ordinary data\n // updates don't wake the fetch effect (no refetch loop).\n const isInvalidated = computed(() => query().state().isInvalidated)\n\n effect((cleanup) => {\n const q = query()\n const { gcTime } = untracked(defaultedOptions)\n\n if (gcTime !== undefined) {\n q.setGcTime(gcTime)\n }\n\n q.addObserver()\n cleanup(() => q.removeObserver())\n })\n\n effect(() => {\n const { queryKey, queryFn, staleTime, retry, retryDelay, enabled } =\n defaultedOptions()\n\n // Track invalidation so invalidateQueries() re-triggers a refetch.\n // When invalidated, cancel any in-flight fetch and start a fresh one\n // (otherwise the stale in-flight result would clear isInvalidated).\n const invalidated = isInvalidated()\n\n if (enabled === false) return\n\n untracked(() =>\n client.fetchQuery(queryKey, queryFn, {\n staleTime,\n retry,\n retryDelay,\n cancelRefetch: invalidated,\n }),\n )\n })\n\n // Polling: refetch on an interval, independent of staleTime (staleTime: 0\n // forces the fetch). The function form is reactive — reading state() makes\n // the effect re-run when data changes, so returning false stops polling.\n effect((onCleanup) => {\n const { queryKey, queryFn, retry, retryDelay, refetchInterval, enabled } =\n defaultedOptions()\n\n if (enabled === false) return\n\n const interval =\n typeof refetchInterval === 'function'\n ? refetchInterval({ state: query().state() })\n : refetchInterval\n\n if (!interval) return\n\n const id = setInterval(() => {\n client.fetchQuery(queryKey, queryFn, {\n staleTime: 0,\n retry,\n retryDelay,\n })\n }, interval)\n\n onCleanup(() => clearInterval(id))\n })\n\n return {\n data: computed(() => query().state().data),\n status: computed(() => query().state().status),\n error: computed(() => query().state().error as TError | null),\n isFetching: computed(() => query().state().isFetching),\n // First fetch in-flight: fetching with no resolved data yet.\n isLoading: computed(() => {\n const state = query().state()\n\n return state.isFetching && state.status === 'pending'\n }),\n isPending: computed(() => query().state().status === 'pending'),\n isSuccess: computed(() => query().state().status === 'success'),\n isError: computed(() => query().state().status === 'error'),\n failureCount: computed(() => query().state().failureCount),\n failureReason: computed(\n () => query().state().failureReason as TError | null,\n ),\n // Force a fresh fetch regardless of staleTime, cancelling any in-flight\n // request (explicit user intent — get current data).\n refetch: () => {\n const { queryKey, queryFn, retry, retryDelay } =\n untracked(defaultedOptions)\n\n client.fetchQuery(queryKey, queryFn, {\n staleTime: 0,\n retry,\n retryDelay,\n cancelRefetch: true,\n })\n },\n }\n })\n}\n","import {\n assertInInjectionContext,\n computed,\n DestroyRef,\n inject,\n Injector,\n runInInjectionContext,\n signal,\n untracked,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\nimport {\n type Mutation,\n type MutationOptions,\n type MutationResult,\n getInitialState,\n} from './mutation'\n\n/**\n * Creates a mutation for imperative writes (create/update/delete) and exposes\n * its state as signals.\n *\n * Unlike queries, a mutation does not run on its own — call `mutate(variables)`\n * to trigger `mutationFn`. The `onMutate` / `onSuccess` / `onError` /\n * `onSettled` lifecycle hooks make optimistic updates and cache invalidation\n * straightforward. Mutations do not retry by default (a retried write is not\n * idempotent); opt in via `options.retry`. Bound to the current injection\n * context and cancelled when that context is destroyed.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @typeParam TData - Type of the data resolved by `mutationFn`.\n * @typeParam TError - Type of the error thrown by `mutationFn`.\n * @typeParam TVariables - Type of the argument passed to `mutate()`.\n * @typeParam TContext - Type returned by `onMutate`, passed to later hooks.\n * @param optionsFn - Factory returning the {@link MutationOptions}.\n * @param options - Optional `injector` to use outside an injection context.\n * @returns A {@link MutationResult}: `mutate()`, `reset()`, and state signals\n * (`status`, `data`, `error`, `isPending`, …).\n *\n * @example\n * ```ts\n * const client = injectQueryClient()\n *\n * const addTodo = injectMutation(() => ({\n * mutationFn: (title: string) => http.post<Todo>('/api/todos', { title }),\n * onSuccess: () => client.invalidateQueries({ queryKey: ['todos'] }),\n * }))\n *\n * // <button (click)=\"addTodo.mutate('Buy milk')\" [disabled]=\"addTodo.isPending()\">Add</button>\n * ```\n */\nexport function injectMutation<\n TData,\n TError = Error,\n TVariables = void,\n TContext = unknown,\n>(\n optionsFn: () => MutationOptions<TData, TError, TVariables, TContext>,\n options?: { injector?: Injector },\n): MutationResult<TData, TError, TVariables> {\n if (!options?.injector) assertInInjectionContext(injectMutation)\n\n const injector = options?.injector ?? inject(Injector)\n\n return runInInjectionContext(injector, () => {\n const cache = inject(QueryClient).getMutationCache()\n\n // Every mutate() builds its own Mutation. Sharing one across calls meant a\n // second call overwrote the first's subscription (orphaning the request)\n // and its state (so the slower run, not the latest one, decided the result).\n const current = signal<Mutation<\n TData,\n TError,\n TVariables,\n TContext\n > | null>(null)\n\n // Detaching is all we do on destroy. A run still in flight keeps going —\n // the write has most likely reached the server already, so cancelling it\n // would only skip onSuccess and leave the cache out of sync. It drops\n // itself from the cache once it settles with nobody watching.\n inject(DestroyRef).onDestroy(() => untracked(current)?.removeObserver())\n\n const state = computed(\n () =>\n current()?.state() ??\n getInitialState<TData, TError, TVariables, TContext>(),\n )\n\n return {\n mutate: (variables) => {\n // Stop observing the previous run. It isn't cancelled — if it's still\n // in flight it finishes and fires its hooks; it just no longer feeds\n // the signals below.\n untracked(current)?.removeObserver()\n\n // Options are read per call, so a signal used in them stays live.\n const run = cache.build(optionsFn())\n\n run.addObserver()\n current.set(run)\n run.execute(variables)\n },\n reset: () => {\n // \"Forget the result\", not \"stop the request\". A run still in flight\n // keeps going and fires its hooks, so the cache stays in step with the\n // server — cancelling could not un-send the write anyway, it could only\n // hide the fact that it happened.\n untracked(current)?.removeObserver()\n\n current.set(null)\n },\n data: computed(() => state().data),\n error: computed(() => state().error as TError | null),\n variables: computed(() => state().variables),\n status: computed(() => state().status),\n isIdle: computed(() => state().status === 'idle'),\n isPending: computed(() => state().status === 'pending'),\n isSuccess: computed(() => state().status === 'success'),\n isError: computed(() => state().status === 'error'),\n failureCount: computed(() => state().failureCount),\n failureReason: computed(() => state().failureReason as TError | null),\n }\n })\n}\n","import {\n type Injector,\n type Signal,\n assertInInjectionContext,\n computed,\n inject,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\nimport type { QueryFilters } from './types'\n\n/**\n * Returns a signal with the number of queries currently fetching — useful for a\n * global loading indicator.\n *\n * Pass {@link QueryFilters} to count only matching queries; omit them to count\n * every fetching query in the cache.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @param filters - Optional filters (e.g. `{ queryKey: ['todos'] }`) to narrow\n * the count.\n * @param options - Optional `injector` to use outside an injection context.\n * @returns A `Signal<number>` of active fetches.\n *\n * @example\n * ```ts\n * readonly isFetching = injectIsFetching()\n * // <app-spinner *ngIf=\"isFetching() > 0\" />\n * ```\n */\nexport function injectIsFetching(\n filters?: QueryFilters,\n options?: { injector?: Injector },\n): Signal<number> {\n if (!options?.injector) assertInInjectionContext(injectIsFetching)\n\n const client = options?.injector?.get(QueryClient) ?? inject(QueryClient)\n const cache = client.getQueryCache()\n\n return computed(\n () =>\n cache.findAll(filters).filter((query) => query.state().isFetching).length,\n )\n}\n","import {\n type Injector,\n type Signal,\n assertInInjectionContext,\n computed,\n inject,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\n\n/**\n * Returns a signal with the number of mutations currently pending — useful for\n * a global \"saving…\" indicator.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @param options - Optional `injector` to use outside an injection context.\n * @returns A `Signal<number>` of in-flight mutations.\n *\n * @example\n * ```ts\n * readonly isMutating = injectIsMutating()\n * // <p *ngIf=\"isMutating() > 0\">Saving…</p>\n * ```\n */\nexport function injectIsMutating(options?: {\n injector?: Injector\n}): Signal<number> {\n if (!options?.injector) assertInInjectionContext(injectIsMutating)\n\n const client = options?.injector?.get(QueryClient) ?? inject(QueryClient)\n const cache = client.getMutationCache()\n\n return computed(() => cache.findAll({ status: 'pending' }).length)\n}\n","import type { QueryOptions } from './types'\n\n/**\n * Identity helper that defines a typed, reusable set of {@link QueryOptions}.\n *\n * Returns the options unchanged at runtime, but anchors type inference so the\n * same definition can be shared across {@link injectQuery},\n * {@link QueryClient.setQueryData}, and friends without re-declaring generics.\n * Keeping query definitions in a service (rather than inline) makes them easy\n * to reuse and unit-test.\n *\n * @typeParam TData - Type of the data resolved by `queryFn`.\n * @typeParam TError - Type of the error thrown by `queryFn`.\n * @param options - The {@link QueryOptions} to define.\n * @returns The same `options`, typed.\n *\n * @example\n * ```ts\n * @Injectable({ providedIn: 'root' })\n * class TodoQueries {\n * private readonly http = inject(HttpClient)\n *\n * todos() {\n * return queryOptions({\n * queryKey: ['todos'],\n * queryFn: () => this.http.get<Todo[]>('/api/todos'),\n * })\n * }\n * }\n *\n * // const todos = injectQuery(() => inject(TodoQueries).todos())\n * ```\n */\nexport function queryOptions<TData, TError = Error>(\n options: QueryOptions<TData, TError>,\n): QueryOptions<TData, TError> {\n return options\n}\n","import type { MutationOptions } from './mutation'\n\n/**\n * Identity helper that defines a typed, reusable set of {@link MutationOptions}.\n *\n * Returns the options unchanged at runtime; its job is to anchor type inference\n * (notably linking `TContext` returned by `onMutate` to the later hooks) so a\n * mutation can be defined once in a service and passed to {@link injectMutation}.\n *\n * @typeParam TData - Type of the data resolved by `mutationFn`.\n * @typeParam TError - Type of the error thrown by `mutationFn`.\n * @typeParam TVariables - Type of the argument passed to `mutate()`.\n * @typeParam TContext - Type returned by `onMutate`, passed to later hooks.\n * @param options - The {@link MutationOptions} to define.\n * @returns The same `options`, typed.\n *\n * @example\n * ```ts\n * addTodo() {\n * return mutationOptions({\n * mutationFn: (title: string) => this.http.post<Todo>('/api/todos', { title }),\n * onSuccess: () => this.client.invalidateQueries({ queryKey: ['todos'] }),\n * })\n * }\n * ```\n */\nexport function mutationOptions<\n TData,\n TError = Error,\n TVariables = void,\n TContext = unknown,\n>(\n options: MutationOptions<TData, TError, TVariables, TContext>,\n): MutationOptions<TData, TError, TVariables, TContext> {\n return options\n}\n","import { QUERY_CLIENT_CONFIG } from '../core/injection-tokens'\nimport type { RetryDelayValue, RetryValue } from '../core/types'\nimport {\n type QueryClientFeature,\n QueryClientFeatureKind,\n queryClientFeature,\n} from './feature'\n\n/** Default query options applied to every query unless overridden per-query. */\nexport interface DefaultQueryOptions {\n /** How long fetched data is considered fresh, in ms. Defaults to `0`. */\n staleTime?: number\n /** How long unused (unobserved) data is kept before garbage collection, in ms. */\n gcTime?: number\n /** Retry policy on failure: a boolean, a count, or a predicate. Defaults to `3`. */\n retry?: RetryValue<unknown>\n /** Delay between retries, in ms or a function of the attempt. */\n retryDelay?: RetryDelayValue<unknown>\n}\n\n/** Application-wide defaults configured via {@link withDefaultOptions}. */\nexport interface DefaultOptions {\n /** Defaults applied to all queries. */\n queries?: DefaultQueryOptions\n}\n\n/**\n * Feature for {@link provideQueryClient} that sets application-wide default\n * query options. Per-query options always take precedence over these defaults.\n *\n * @param options - The {@link DefaultOptions} to apply.\n * @returns A {@link QueryClientFeature} to pass to {@link provideQueryClient}.\n *\n * @example\n * ```ts\n * provideQueryClient(\n * withDefaultOptions({ queries: { staleTime: 60_000, retry: 1 } }),\n * )\n * ```\n */\nexport function withDefaultOptions(\n options: DefaultOptions,\n): QueryClientFeature<QueryClientFeatureKind.DefaultOptions> {\n return queryClientFeature(QueryClientFeatureKind.DefaultOptions, [\n { provide: QUERY_CLIENT_CONFIG, useValue: { defaultOptions: options } },\n ])\n}\n","/*\n * Public API Surface of ngx-query\n */\n\nexport * from './lib/core/query-client'\nexport * from './lib/core/provider'\nexport * from './lib/core/inject-query-client'\nexport * from './lib/core/types'\nexport * from './lib/core/inject-query'\nexport * from './lib/core/inject-mutation'\nexport * from './lib/core/inject-is-fetching'\nexport * from './lib/core/inject-is-mutating'\nexport * from './lib/core/query-options'\nexport * from './lib/core/mutation-options'\nexport type {\n MutationFilters,\n MutationOptions,\n MutationResult,\n MutationState,\n MutationStatus,\n} from './lib/core/mutation'\nexport { QueryClientFeatureKind } from './lib/features/feature'\nexport type { QueryClientFeature } from './lib/features/feature'\nexport { withDefaultOptions } from './lib/features/with-default-options'\nexport type {\n DefaultOptions,\n DefaultQueryOptions,\n} from './lib/features/with-default-options'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["retry","retryOperator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-signal-query.mjs","sources":["../../../projects/ngx-signal-query/src/lib/core/cache.ts","../../../projects/ngx-signal-query/src/lib/core/utils.ts","../../../projects/ngx-signal-query/src/lib/core/retryer.ts","../../../projects/ngx-signal-query/src/lib/core/query.ts","../../../projects/ngx-signal-query/src/lib/core/query-cache.ts","../../../projects/ngx-signal-query/src/lib/core/mutation.ts","../../../projects/ngx-signal-query/src/lib/core/mutation-cache.ts","../../../projects/ngx-signal-query/src/lib/core/injection-tokens.ts","../../../projects/ngx-signal-query/src/lib/core/query-client.ts","../../../projects/ngx-signal-query/src/lib/features/feature.ts","../../../projects/ngx-signal-query/src/lib/core/provider.ts","../../../projects/ngx-signal-query/src/lib/core/inject-query-client.ts","../../../projects/ngx-signal-query/src/lib/core/inject-query.ts","../../../projects/ngx-signal-query/src/lib/core/inject-mutation.ts","../../../projects/ngx-signal-query/src/lib/core/inject-is-fetching.ts","../../../projects/ngx-signal-query/src/lib/core/inject-is-mutating.ts","../../../projects/ngx-signal-query/src/lib/core/query-options.ts","../../../projects/ngx-signal-query/src/lib/core/keep-previous-data.ts","../../../projects/ngx-signal-query/src/lib/core/mutation-options.ts","../../../projects/ngx-signal-query/src/lib/features/with-default-options.ts","../../../projects/ngx-signal-query/src/public-api.ts","../../../projects/ngx-signal-query/src/ngx-signal-query.ts"],"sourcesContent":["import { signal } from '@angular/core'\n\n/** @internal */\nexport abstract class Cache<TEntry> {\n readonly #entries = signal<TEntry[]>([])\n\n // Reactive snapshot of all entries; updated on add/remove/clear so that\n // findAll() (and its computed consumers like isFetching) react to the\n // collection. Protected: only subclasses read it, never external code.\n protected readonly entries = this.#entries.asReadonly()\n\n readonly #entriesMap = new Map<string, TEntry>()\n\n getAll(): TEntry[] {\n return Array.from(this.#entriesMap.values())\n }\n\n clear(): void {\n this.#entriesMap.clear()\n this.#sync()\n }\n\n protected addEntry(key: string, entry: TEntry): TEntry {\n this.#entriesMap.set(key, entry)\n this.#sync()\n\n return entry\n }\n\n protected getEntry(key: string): TEntry | undefined {\n return this.#entriesMap.get(key)\n }\n\n protected removeEntry(key: string): boolean {\n const removed = this.#entriesMap.delete(key)\n\n if (removed) this.#sync()\n\n return removed\n }\n\n #sync(): void {\n this.#entries.set(Array.from(this.#entriesMap.values()))\n }\n}\n","import type { QueryKey, Updater } from './types'\n\n// Resolves an updater: calls it with the previous value if it's a function,\n// otherwise uses it as the value directly.\n/** @internal */\nexport function functionalUpdate<TInput, TOutput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as (input: TInput) => TOutput)(input)\n : updater\n}\n\n// True when `filter` is a (deep) prefix of `key`, e.g. ['app'] matches\n// ['app', 1]. Used to invalidate/find groups of queries by partial key.\n/** @internal */\nexport function partialMatchKey(key: QueryKey, filter: QueryKey): boolean {\n return partialDeepEqual(key, filter)\n}\n\nfunction partialDeepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n if (typeof a !== typeof b) return false\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n return Object.keys(b).every((key) =>\n partialDeepEqual(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n }\n\n return false\n}\n\n/** @internal */\nexport function hashKey(key: QueryKey): string {\n return JSON.stringify(key, (_, value) =>\n isPlainObject(value)\n ? Object.keys(value)\n .sort()\n .reduce<Record<string, unknown>>((result, k) => {\n result[k] = value[k]\n\n return result\n }, {})\n : value,\n )\n}\n\n// Copied from: https://github.com/jonschlinkert/is-plain-object\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isPlainObject(o: any): o is Record<PropertyKey, unknown> {\n if (!hasObjectPrototype(o)) {\n return false\n }\n\n // If has no constructor\n const ctor = o.constructor\n\n if (ctor === undefined) {\n return true\n }\n\n // If has modified prototype\n const prot = ctor.prototype\n\n if (!hasObjectPrototype(prot)) {\n return false\n }\n\n // If constructor does not have an Object-specific method\n if (!Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOf')) {\n return false\n }\n\n // Handles Objects created by Object.create(<arbitrary prototype>)\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false\n }\n\n // Most likely a plain Object\n return true\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction hasObjectPrototype(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]'\n}\n","import type { RetryDelayValue, RetryValue } from './types'\n\n// Exponential backoff capped at 30s, matching TanStack's default.\n/** @internal */\nexport function defaultRetryDelay(failureCount: number): number {\n return Math.min(1000 * 2 ** failureCount, 30000)\n}\n\n/** @internal */\nexport function shouldRetry<TError>(\n retry: RetryValue<TError>,\n failureCount: number,\n error: TError,\n): boolean {\n if (typeof retry === 'function') return retry(failureCount, error)\n if (typeof retry === 'number') return failureCount < retry\n\n return retry\n}\n\n/** @internal */\nexport function resolveRetryDelay<TError>(\n retryDelay: RetryDelayValue<TError>,\n failureCount: number,\n error: TError,\n): number {\n return typeof retryDelay === 'function'\n ? retryDelay(failureCount, error)\n : retryDelay\n}\n","import { signal } from '@angular/core'\nimport {\n defer,\n from,\n retry as retryOperator,\n take,\n throwIfEmpty,\n timer,\n type Observable,\n type Subscription,\n} from 'rxjs'\n\nimport type { QueryCache } from './query-cache'\nimport { defaultRetryDelay, resolveRetryDelay, shouldRetry } from './retryer'\nimport type { QueryKey, QueryState, RetryDelayValue, RetryValue } from './types'\n\nconst DEFAULT_GC_TIME = 5 * 60 * 1000\n\n/** @internal */\nexport class Query<TData, TError = Error> {\n readonly #state = signal<QueryState<TData, TError>>({\n data: undefined,\n status: 'pending',\n error: null,\n isFetching: false,\n isInvalidated: false,\n failureCount: 0,\n failureReason: null,\n updatedAt: 0,\n })\n\n // `state` must follow `#state`: a public field can't precede the private\n // field it reads during initialization (field init order).\n // eslint-disable-next-line @typescript-eslint/member-ordering\n readonly state = this.#state.asReadonly()\n\n #subscription: Subscription | null = null\n #observers = 0\n #gcTime = DEFAULT_GC_TIME\n #gcTimer: ReturnType<typeof setTimeout> | null = null\n readonly #cache: QueryCache\n\n constructor(\n readonly key: QueryKey,\n readonly queryHash: string,\n cache: QueryCache,\n ) {\n this.#cache = cache\n }\n\n get observerCount(): number {\n return this.#observers\n }\n\n setGcTime(ms: number): void {\n this.#gcTime = ms\n }\n\n addObserver(): void {\n this.#observers++\n this.#clearGcTimer()\n }\n\n removeObserver(): void {\n if (this.#observers === 0) return\n\n this.#observers--\n\n // No observers left: cancel any in-flight fetch (nobody is waiting for it)\n // and schedule gc to dispose the query if no observer returns.\n if (this.#observers === 0) {\n this.cancel()\n this.#scheduleGc()\n }\n }\n\n fetch(\n queryFn: () => Observable<TData> | Promise<TData>,\n retry: RetryValue<TError> = 0,\n retryDelay: RetryDelayValue<TError> = defaultRetryDelay,\n cancelRefetch = false,\n ): void {\n if (this.#subscription && !this.#subscription.closed) {\n // Already in-flight: dedupe unless the caller explicitly wants a fresh\n // fetch (e.g. invalidate/refetch) — then cancel the old one and restart.\n if (!cancelRefetch) return\n this.cancel()\n }\n\n this.#state.update((state) => ({\n ...state,\n isFetching: true,\n failureCount: 0,\n failureReason: null,\n }))\n\n // defer + from: normalize Observable/Promise and re-invoke queryFn on each\n // retry (a Promise is one-shot, so retry must produce a fresh one).\n this.#subscription = defer(() => from(queryFn()))\n .pipe(\n take(1),\n retryOperator({\n delay: (error, retryCount) => {\n // retryCount (1-based) is the number of failures so far; the retry\n // predicate/delay take a 0-based attempt index (0 = first retry).\n this.#state.update((state) => ({\n ...state,\n failureCount: retryCount,\n failureReason: error as TError,\n }))\n\n const attemptIndex = retryCount - 1\n\n if (!shouldRetry(retry, attemptIndex, error as TError)) throw error\n\n return timer(\n resolveRetryDelay(retryDelay, attemptIndex, error as TError),\n )\n },\n }),\n throwIfEmpty(\n () => new Error('Query function completed without emitting a value'),\n ),\n )\n .subscribe({\n next: (data) =>\n this.#state.set({\n data,\n status: 'success',\n error: null,\n isFetching: false,\n isInvalidated: false,\n failureCount: 0,\n failureReason: null,\n updatedAt: Date.now(),\n }),\n error: (err) =>\n this.#state.update((state) => ({\n ...state,\n status: 'error',\n error: err,\n isFetching: false,\n })),\n })\n }\n\n setData(data: TData, updatedAt: number = Date.now()): void {\n this.#state.update((state) => ({\n ...state,\n data,\n status: 'success',\n error: null,\n isInvalidated: false,\n failureCount: 0,\n failureReason: null,\n updatedAt,\n }))\n\n // Keep an orphaned query (no observers) alive for another gcTime so a\n // setQueryData write isn't collected before anyone subscribes.\n if (this.#observers === 0) this.#scheduleGc()\n }\n\n invalidate(): void {\n this.#state.update((state) => ({ ...state, isInvalidated: true }))\n }\n\n shouldFetch(staleTime: number): boolean {\n const state = this.state()\n\n return (\n state.status !== 'success' ||\n state.isInvalidated ||\n this.#isStale(staleTime)\n )\n }\n\n cancel(): void {\n this.#subscription?.unsubscribe()\n this.#subscription = null\n\n // The fetch is no longer running; clear the in-flight flag so isFetching\n // doesn't stay stuck true after a cancellation.\n if (this.state().isFetching) {\n this.#state.update((state) => ({ ...state, isFetching: false }))\n }\n }\n\n destroy(): void {\n this.cancel()\n this.#clearGcTimer()\n }\n\n // Inclusive: data fetched exactly `staleTime` ago is already stale. This\n // matters for seeded data (initialData is stamped with the current time), so\n // the default staleTime of 0 still means \"stale at once\" → background\n // refetch, rather than depending on whether a millisecond happened to pass.\n #isStale(staleTime: number): boolean {\n return Date.now() - this.state().updatedAt >= staleTime\n }\n\n #scheduleGc(): void {\n this.#clearGcTimer()\n\n this.#gcTimer = setTimeout(() => {\n this.#gcTimer = null\n this.#cache.remove(this)\n }, this.#gcTime)\n }\n\n #clearGcTimer(): void {\n if (this.#gcTimer === null) return\n\n clearTimeout(this.#gcTimer)\n this.#gcTimer = null\n }\n}\n","import { Injectable } from '@angular/core'\n\nimport { Cache } from './cache'\nimport { hashKey, partialMatchKey } from './utils'\nimport { Query } from './query'\nimport type { QueryFilters, QueryKey } from './types'\n\n/** @internal */\n@Injectable()\nexport class QueryCache extends Cache<Query<unknown, unknown>> {\n getOrCreate<TData, TError = Error>(key: QueryKey): Query<TData, TError> {\n const queryHash = hashKey(key)\n const exist = this.getEntry(queryHash)\n\n if (exist) return exist as Query<TData, TError>\n\n return this.addEntry(queryHash, new Query(key, queryHash, this)) as Query<\n TData,\n TError\n >\n }\n\n get<TData, TError = Error>(key: QueryKey): Query<TData, TError> | undefined {\n return this.getEntry(hashKey(key)) as Query<TData, TError> | undefined\n }\n\n findAll(filters: QueryFilters = {}): Array<Query<unknown, unknown>> {\n const { queryKey, exact } = filters\n\n // Reads the reactive `entries()` so findAll() works inside computed().\n const all = this.entries()\n\n if (!queryKey) return all\n\n if (exact) {\n const queryHash = hashKey(queryKey)\n\n return all.filter((query) => query.queryHash === queryHash)\n }\n\n return all.filter((query) => partialMatchKey(query.key, queryKey))\n }\n\n remove(query: Query<unknown, unknown>): void {\n // Guard on identity, not just the hash: a stale instance (already removed\n // and recreated under the same key) must not evict the current query.\n if (this.getEntry(query.queryHash) === query) {\n this.removeEntry(query.queryHash)\n }\n }\n\n override clear(): void {\n this.getAll().forEach((query) => query.destroy())\n super.clear()\n }\n}\n","import { type Signal, signal } from '@angular/core'\nimport {\n defer,\n from,\n retry as retryOperator,\n take,\n throwIfEmpty,\n timer,\n type Observable,\n type Subscription,\n} from 'rxjs'\n\nimport type { MutationCache } from './mutation-cache'\nimport { defaultRetryDelay, resolveRetryDelay, shouldRetry } from './retryer'\nimport type { RetryDelayValue, RetryValue } from './types'\n\n/** Lifecycle status of a mutation: not yet run, running, succeeded, or failed. */\nexport type MutationStatus = 'idle' | 'pending' | 'success' | 'error'\n\n/** Selects which mutations an operation applies to (e.g. `injectIsMutating`). */\nexport type MutationFilters = {\n /** Match mutations in this status. */\n status?: MutationStatus\n}\n\n/** Full state snapshot of a mutation (the reactive source behind {@link MutationResult}). */\nexport type MutationState<TData, TError, TVariables, TContext> = {\n /** Current {@link MutationStatus}. */\n status: MutationStatus\n /** Data resolved by the last successful run, or `undefined`. */\n data: TData | undefined\n /** Error of the last failed run, or `null`. */\n error: TError | null\n /** Variables passed to the most recent `mutate()` call. */\n variables: TVariables | undefined\n /** Value returned by `onMutate` for the current run. */\n context: TContext | undefined\n /** Number of failed attempts in the current run. */\n failureCount: number\n /** Error of the most recent failed attempt, or `null`. */\n failureReason: TError | null\n /** Timestamp (ms) when the current run was submitted; `0` if never. */\n submittedAt: number\n}\n\n/**\n * Configuration for a mutation, passed to {@link injectMutation} /\n * {@link mutationOptions}. The hooks fire in order: `onMutate` →\n * (`onSuccess` | `onError`) → `onSettled`. The value returned by `onMutate`\n * is passed as `context` to the later hooks — handy for rollback.\n */\nexport type MutationOptions<TData, TError, TVariables, TContext> = {\n /** Performs the write; receives `mutate()`'s argument. Returns `Observable`/`Promise`. */\n mutationFn: (variables: TVariables) => Observable<TData> | Promise<TData>\n /** Retry policy. Defaults to no retry (writes are not idempotent). */\n retry?: RetryValue<TError>\n /** Delay between retries. See {@link RetryDelayValue}. */\n retryDelay?: RetryDelayValue<TError>\n /** Runs before `mutationFn`; its return value becomes `context` (e.g. for optimistic rollback). */\n onMutate?: (variables: TVariables) => TContext | undefined\n /** Runs after a successful `mutationFn`. */\n onSuccess?: (\n data: TData,\n variables: TVariables,\n context: TContext | undefined,\n ) => void\n /** Runs after a failed `mutationFn`. */\n onError?: (\n error: TError,\n variables: TVariables,\n context: TContext | undefined,\n ) => void\n /** Runs after success or error — for cleanup that should happen either way. */\n onSettled?: (\n data: TData | undefined,\n error: TError | null,\n variables: TVariables,\n context: TContext | undefined,\n ) => void\n}\n\n/** Reactive result returned by {@link injectMutation}; state fields are signals. */\nexport type MutationResult<TData, TError, TVariables> = {\n /** Triggers the mutation with the given variables. */\n mutate: (variables: TVariables) => void\n /** Resets state back to `idle`, cancelling any in-flight run. */\n reset: () => void\n /** Data from the last successful run, or `undefined`. */\n data: Signal<TData | undefined>\n /** Error from the last failed run, or `null`. */\n error: Signal<TError | null>\n /** Variables from the most recent `mutate()` call. */\n variables: Signal<TVariables | undefined>\n /** Current {@link MutationStatus}. */\n status: Signal<MutationStatus>\n /** Whether the mutation has not been run yet. */\n isIdle: Signal<boolean>\n /** Whether the mutation is currently running. */\n isPending: Signal<boolean>\n /** Whether the last run succeeded. */\n isSuccess: Signal<boolean>\n /** Whether the last run failed. */\n isError: Signal<boolean>\n /** Consecutive failures in the current run. */\n failureCount: Signal<number>\n /** Error of the most recent failed attempt, or `null`. */\n failureReason: Signal<TError | null>\n}\n\n/** @internal */\nexport function getInitialState<\n TData,\n TError,\n TVariables,\n TContext,\n>(): MutationState<TData, TError, TVariables, TContext> {\n return {\n status: 'idle',\n data: undefined,\n error: null,\n variables: undefined,\n context: undefined,\n failureCount: 0,\n failureReason: null,\n submittedAt: 0,\n }\n}\n\n/** @internal */\nexport class Mutation<\n TData = unknown,\n TError = Error,\n TVariables = void,\n TContext = unknown,\n> {\n readonly #state =\n signal<MutationState<TData, TError, TVariables, TContext>>(\n getInitialState(),\n )\n\n // `state` must follow `#state`: a public field can't precede the private\n // field it reads during initialization (field init order).\n // eslint-disable-next-line @typescript-eslint/member-ordering\n readonly state = this.#state.asReadonly()\n\n #subscription: Subscription | null = null\n #observers = 0\n readonly #options: MutationOptions<TData, TError, TVariables, TContext>\n readonly #cache: MutationCache\n\n constructor(\n readonly mutationId: number,\n options: MutationOptions<TData, TError, TVariables, TContext>,\n cache: MutationCache,\n ) {\n this.#options = options\n this.#cache = cache\n }\n\n get observerCount(): number {\n return this.#observers\n }\n\n addObserver(): void {\n this.#observers++\n }\n\n /**\n * Unlike a query, losing its last observer does not cancel a mutation: the\n * write has most likely reached the server already, so it must be allowed to\n * land and run its hooks. It is only dropped from the cache once it has both\n * settled and been abandoned — whichever of the two happens last.\n */\n removeObserver(): void {\n if (this.#observers === 0) return\n\n this.#observers--\n\n this.#disposeIfDone()\n }\n\n /** Runs the mutation once. `variables` are passed straight to `mutationFn`. */\n execute(variables: TVariables): void {\n const context = this.#options.onMutate?.(variables)\n // Mutations default to no retry (not idempotent — a retried POST could\n // create a duplicate); opt in explicitly via options.retry.\n const retry = this.#options.retry ?? 0\n const retryDelay = this.#options.retryDelay ?? defaultRetryDelay\n\n this.#state.set({\n status: 'pending',\n data: undefined,\n error: null,\n variables,\n context,\n failureCount: 0,\n failureReason: null,\n submittedAt: Date.now(),\n })\n\n // defer + from: normalize Observable/Promise and re-invoke mutationFn on\n // each retry (a Promise is one-shot, so retry must produce a fresh one).\n this.#subscription = defer(() => from(this.#options.mutationFn(variables)))\n .pipe(\n take(1),\n retryOperator({\n delay: (error, retryCount) => {\n this.#state.update((state) => ({\n ...state,\n failureCount: retryCount,\n failureReason: error as TError,\n }))\n\n const attemptIndex = retryCount - 1\n\n if (!shouldRetry(retry, attemptIndex, error as TError)) throw error\n\n return timer(\n resolveRetryDelay(retryDelay, attemptIndex, error as TError),\n )\n },\n }),\n throwIfEmpty(\n () =>\n new Error('Mutation function completed without emitting a value'),\n ),\n )\n .subscribe({\n // `finally`: a hook that throws must not leave the mutation stranded in\n // the cache (where injectIsMutating would keep counting it forever).\n next: (data) => {\n this.#state.update((state) => ({ ...state, status: 'success', data }))\n\n try {\n this.#options.onSuccess?.(data, variables, context)\n this.#options.onSettled?.(data, null, variables, context)\n } finally {\n this.#disposeIfDone()\n }\n },\n error: (error: TError) => {\n this.#state.update((state) => ({ ...state, status: 'error', error }))\n\n try {\n this.#options.onError?.(error, variables, context)\n this.#options.onSettled?.(undefined, error, variables, context)\n } finally {\n this.#disposeIfDone()\n }\n },\n })\n }\n\n cancel(): void {\n this.#subscription?.unsubscribe()\n this.#subscription = null\n }\n\n /**\n * A run nobody observes any more, and which is no longer in flight, has\n * nothing left to report — drop it. Called from both ends, since the two\n * conditions can be met in either order: a superseded run may settle later,\n * and a settled run may be abandoned later.\n */\n #disposeIfDone(): void {\n if (this.#observers > 0) return\n if (this.state().status === 'pending') return\n\n this.#cache.remove(this)\n }\n}\n","import { Injectable } from '@angular/core'\n\nimport { Cache } from './cache'\nimport {\n type MutationFilters,\n type MutationOptions,\n Mutation,\n} from './mutation'\n\n/** @internal */\n@Injectable()\nexport class MutationCache extends Cache<\n Mutation<unknown, unknown, unknown, unknown>\n> {\n #lastId = 0\n\n build<TData, TError, TVariables, TContext>(\n options: MutationOptions<TData, TError, TVariables, TContext>,\n ): Mutation<TData, TError, TVariables, TContext> {\n const mutation = new Mutation(++this.#lastId, options, this)\n\n this.addEntry(\n String(mutation.mutationId),\n mutation as Mutation<unknown, unknown, unknown, unknown>,\n )\n\n return mutation\n }\n\n findAll(\n filters: MutationFilters = {},\n ): Array<Mutation<unknown, unknown, unknown, unknown>> {\n // Reads the reactive `entries()` so findAll() works inside computed().\n const all = this.entries()\n\n if (!filters.status) return all\n\n return all.filter((mutation) => mutation.state().status === filters.status)\n }\n\n remove<TData, TError, TVariables, TContext>(\n mutation: Mutation<TData, TError, TVariables, TContext>,\n ): void {\n this.removeEntry(String(mutation.mutationId))\n }\n\n override clear(): void {\n this.getAll().forEach((mutation) => mutation.cancel())\n super.clear()\n }\n}\n","import { InjectionToken } from '@angular/core'\n\nimport type { RetryDelayValue, RetryValue } from './types'\n\n/** @internal */\nexport interface QueryClientConfig {\n defaultOptions?: {\n queries?: {\n staleTime?: number\n gcTime?: number\n retry?: RetryValue<unknown>\n retryDelay?: RetryDelayValue<unknown>\n }\n }\n}\n\n/** @internal */\nexport const QUERY_CLIENT_CONFIG = new InjectionToken<QueryClientConfig>(\n 'QUERY_CLIENT_CONFIG',\n)\n","import { inject, Injectable } from '@angular/core'\nimport type { Observable } from 'rxjs'\n\nimport { QueryCache } from './query-cache'\nimport { MutationCache } from './mutation-cache'\nimport { defaultRetryDelay } from './retryer'\nimport { functionalUpdate } from './utils'\nimport type {\n DefaultedQueryOptions,\n QueryFilters,\n QueryKey,\n QueryOptions,\n RetryDelayValue,\n RetryValue,\n Updater,\n} from './types'\nimport { QUERY_CLIENT_CONFIG } from './injection-tokens'\n\n/**\n * Central registry and cache for queries and mutations.\n *\n * Provided by {@link provideQueryClient} and retrieved with\n * {@link injectQueryClient}. Offers imperative cache access — reading and\n * writing data, and invalidating, cancelling, or removing queries — that\n * complements the reactive {@link injectQuery} / {@link injectMutation} APIs.\n */\n@Injectable()\nexport class QueryClient {\n readonly #cache = inject(QueryCache)\n readonly #mutationCache = inject(MutationCache)\n readonly #config = inject(QUERY_CLIENT_CONFIG, { optional: true }) ?? {}\n\n /** Returns the underlying query cache. Advanced/internal use. */\n getQueryCache(): QueryCache {\n return this.#cache\n }\n\n /** Returns the underlying mutation cache. Advanced/internal use. */\n getMutationCache(): MutationCache {\n return this.#mutationCache\n }\n\n /**\n * Merges per-query options with the configured defaults, filling in\n * `staleTime`, `gcTime`, `retry`, and `retryDelay`. Used internally by\n * {@link injectQuery}.\n */\n defaultQueryOptions<TData, TError = Error>(\n options: QueryOptions<TData, TError>,\n ): DefaultedQueryOptions<TData, TError> {\n const defaults = this.#config.defaultOptions?.queries\n\n return {\n ...options,\n staleTime: options.staleTime ?? defaults?.staleTime ?? 0,\n gcTime: options.gcTime ?? defaults?.gcTime,\n retry: options.retry ?? defaults?.retry ?? 3,\n retryDelay:\n options.retryDelay ?? defaults?.retryDelay ?? defaultRetryDelay,\n }\n }\n\n /**\n * Imperatively fetches and caches a query, unless fresh data already exists\n * (governed by `staleTime`). Prefer {@link injectQuery} in components; use\n * this for prefetching outside the reactive flow.\n *\n * @param key - The query key to fetch and cache under.\n * @param queryFn - Function returning the data as an `Observable` or `Promise`.\n * @param options - Fetch tuning (`staleTime`, `retry`, `retryDelay`,\n * `cancelRefetch`).\n */\n fetchQuery<TData>(\n key: QueryKey,\n queryFn: () => Observable<TData> | Promise<TData>,\n options: {\n staleTime?: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n retry?: RetryValue<any>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n retryDelay?: RetryDelayValue<any>\n cancelRefetch?: boolean\n } = {},\n ): void {\n const defaults = this.#config.defaultOptions?.queries\n const staleTime = options.staleTime ?? defaults?.staleTime ?? 0\n const retry = options.retry ?? defaults?.retry ?? 3\n const retryDelay =\n options.retryDelay ?? defaults?.retryDelay ?? defaultRetryDelay\n\n const query = this.#cache.getOrCreate<TData>(key)\n\n if (query.shouldFetch(staleTime)) {\n query.fetch(queryFn, retry, retryDelay, options.cancelRefetch)\n }\n }\n\n /**\n * Reads the current cached data for a query key, or `undefined` if the query\n * is not cached yet.\n *\n * @param key - The query key to read.\n * @returns The cached data, or `undefined`.\n */\n getQueryData<TData>(key: QueryKey): TData | undefined {\n return this.#cache.get<TData>(key)?.state().data\n }\n\n /**\n * Writes data into the cache for a query key, creating the entry if needed.\n * The `updater` may be a value or a function of the previous data; returning\n * `undefined` from the function is a no-op. Useful for optimistic updates.\n *\n * @param key - The query key to write.\n * @param updater - The new data, or a function `(prev) => next`.\n *\n * @example\n * ```ts\n * client.setQueryData<Todo[]>(['todos'], (prev = []) => [...prev, newTodo])\n * ```\n */\n setQueryData<TData>(\n key: QueryKey,\n updater: Updater<TData | undefined, TData>,\n ): void {\n const query = this.#cache.getOrCreate<TData>(key)\n const data = functionalUpdate(updater, query.state().data)\n\n // Matches TanStack: an updater returning undefined is a no-op.\n if (data === undefined) return\n\n query.setData(data)\n }\n\n /**\n * Marks matching queries as stale and triggers a refetch for those that are\n * actively observed. Commonly called after a mutation succeeds.\n *\n * @param filters - Which queries to invalidate; omit to invalidate all.\n *\n * @example\n * ```ts\n * client.invalidateQueries({ queryKey: ['todos'] })\n * ```\n */\n invalidateQueries(filters?: QueryFilters): void {\n this.#cache.findAll(filters).forEach((query) => query.invalidate())\n }\n\n /**\n * Cancels any in-flight fetches for matching queries.\n *\n * @param filters - Which queries to cancel; omit to cancel all.\n */\n cancelQueries(filters?: QueryFilters): void {\n this.#cache.findAll(filters).forEach((query) => query.cancel())\n }\n\n /**\n * Removes matching queries from the cache entirely, discarding their data.\n *\n * @param filters - Which queries to remove; omit to remove all.\n */\n removeQueries(filters?: QueryFilters): void {\n this.#cache.findAll(filters).forEach((query) => {\n query.destroy()\n this.#cache.remove(query)\n })\n }\n\n /**\n * Returns the number of matching queries currently fetching. For a reactive\n * count, prefer {@link injectIsFetching}.\n *\n * @param filters - Which queries to count; omit to count all.\n */\n isFetching(filters?: QueryFilters): number {\n return this.#cache\n .findAll(filters)\n .filter((query) => query.state().isFetching).length\n }\n\n /**\n * Returns the number of mutations currently pending. For a reactive count,\n * prefer {@link injectIsMutating}.\n */\n isMutating(): number {\n return this.#mutationCache.findAll({ status: 'pending' }).length\n }\n}\n","import type { Provider } from '@angular/core'\n\n/**\n * Discriminator identifying each kind of {@link QueryClientFeature}.\n *\n * @internal\n */\nexport enum QueryClientFeatureKind {\n DefaultOptions,\n}\n\n/**\n * An opaque feature passed to {@link provideQueryClient}. Create one with a\n * `with*` helper such as {@link withDefaultOptions} rather than constructing it\n * directly; the `ɵ`-prefixed members are internal.\n */\nexport interface QueryClientFeature<\n K extends QueryClientFeatureKind = QueryClientFeatureKind,\n> {\n ɵkind: K\n ɵproviders: Provider[]\n}\n\n/** @internal */\nexport function queryClientFeature<K extends QueryClientFeatureKind>(\n kind: K,\n providers: Provider[],\n): QueryClientFeature<K> {\n return { ɵkind: kind, ɵproviders: providers }\n}\n","import {\n type EnvironmentProviders,\n makeEnvironmentProviders,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\nimport { QueryCache } from './query-cache'\nimport { MutationCache } from './mutation-cache'\nimport {\n type QueryClientFeature,\n QueryClientFeatureKind,\n} from '../features/feature'\n\n/**\n * Registers the {@link QueryClient} and its caches for the application.\n *\n * Call once at the app root (in `ApplicationConfig.providers` or a root\n * `bootstrapApplication`). Pass features such as {@link withDefaultOptions} to\n * configure defaults. Registering the same feature twice throws.\n *\n * @param features - Optional {@link QueryClientFeature}s (e.g.\n * {@link withDefaultOptions}).\n * @returns Environment providers to add to the app's provider list.\n *\n * @example\n * ```ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideHttpClient(),\n * provideQueryClient(\n * withDefaultOptions({ queries: { staleTime: 30_000 } }),\n * ),\n * ],\n * }\n * ```\n */\nexport function provideQueryClient(\n ...features: QueryClientFeature[]\n): EnvironmentProviders {\n const seenKinds = new Set<QueryClientFeatureKind>()\n\n for (const feature of features) {\n if (seenKinds.has(feature.ɵkind)) {\n throw new Error(\n `provideQueryClient: feature \"${QueryClientFeatureKind[feature.ɵkind]}\" is registered more than once`,\n )\n }\n seenKinds.add(feature.ɵkind)\n }\n\n return makeEnvironmentProviders([\n QueryCache,\n MutationCache,\n QueryClient,\n ...features.flatMap((feature) => feature.ɵproviders),\n ])\n}\n","import { type Injector, assertInInjectionContext, inject } from '@angular/core'\n\nimport { QueryClient } from './query-client'\n\n/**\n * Returns the application's {@link QueryClient} for imperative cache access.\n *\n * Use it to read or write cached data (`getQueryData`, `setQueryData`) and to\n * invalidate, cancel, or remove queries — typically from mutation hooks or\n * event handlers. Requires {@link provideQueryClient} to be registered.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @param options - Optional `injector` to use outside an injection context.\n * @returns The shared {@link QueryClient} instance.\n *\n * @example\n * ```ts\n * const client = injectQueryClient()\n * client.setQueryData<Todo[]>(['todos'], (prev = []) => [...prev, newTodo])\n * client.invalidateQueries({ queryKey: ['todos'] })\n * ```\n */\nexport function injectQueryClient(options?: {\n injector?: Injector\n}): QueryClient {\n if (!options?.injector) assertInInjectionContext(injectQueryClient)\n\n return options?.injector?.get(QueryClient) ?? inject(QueryClient)\n}\n","import {\n assertInInjectionContext,\n computed,\n effect,\n inject,\n Injector,\n runInInjectionContext,\n signal,\n untracked,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\nimport type { Query } from './query'\nimport type {\n PlaceholderDataFunction,\n QueryOptions,\n QueryResult,\n QueryStatus,\n} from './types'\n\n/**\n * Runs a cached, reactive query and exposes its state as signals.\n *\n * The query is keyed by `queryKey`: calls with the same key share a single\n * cache entry and in-flight request (deduplication). `optionsFn` is read in a\n * reactive context, so when a value it depends on changes (e.g. a route or\n * input signal in the key), the query automatically switches to the new key\n * and fetches. The query is bound to the current injection context and cleans\n * up its cache observer when that context is destroyed.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @typeParam TData - Type of the data resolved by `queryFn`.\n * @typeParam TError - Type of the error thrown by `queryFn`.\n * @param optionsFn - Factory returning the {@link QueryOptions}. Re-evaluated\n * reactively, so reading signals inside it makes the query re-run on change.\n * @param options - Optional `injector` to use outside an injection context.\n * @returns A {@link QueryResult} of signals (`data`, `status`, `error`,\n * `isLoading`, `isPending`, …) plus a `refetch()` that forces a fresh fetch.\n *\n * @example\n * ```ts\n * @Component({\n * template: `\n * @if (todo.isPending()) { <p>Loading…</p> }\n * @if (todo.data(); as data) { <p>{{ data.title }}</p> }\n * `,\n * })\n * class TodoComponent {\n * readonly id = input.required<number>()\n * private readonly http = inject(HttpClient)\n *\n * // Refetches automatically whenever `id()` changes.\n * readonly todo = injectQuery(() => ({\n * queryKey: ['todo', this.id()],\n * queryFn: () => this.http.get<Todo>(`/api/todos/${this.id()}`),\n * }))\n * }\n * ```\n */\nexport function injectQuery<TData, TError = Error>(\n optionsFn: () => QueryOptions<TData, TError>,\n options?: { injector?: Injector },\n): QueryResult<TData, TError> {\n if (!options?.injector) assertInInjectionContext(injectQuery)\n\n const injector = options?.injector ?? inject(Injector)\n\n return runInInjectionContext(injector, () => {\n const client = inject(QueryClient)\n const cache = client.getQueryCache()\n\n // Single source of truth for defaulted options; resolves config defaults\n // (staleTime, gcTime) once instead of scattering the logic across effects.\n const defaultedOptions = computed(() =>\n client.defaultQueryOptions(optionsFn()),\n )\n\n // Seed a fresh query (status 'pending', no data yet) with initialData so\n // it renders immediately as 'success'. Without an explicit\n // initialDataUpdatedAt the seed is treated as fetched right now, so\n // staleTime applies to it as it would to any other data (a staleTime of 0\n // still means \"stale immediately\" → background refetch).\n const applyInitialData = (q: Query<TData, TError>): void => {\n const { initialData, initialDataUpdatedAt } = untracked(defaultedOptions)\n\n if (initialData === undefined || q.state().status !== 'pending') return\n\n const data =\n typeof initialData === 'function'\n ? (initialData as () => TData)()\n : initialData\n const updatedAt =\n typeof initialDataUpdatedAt === 'function'\n ? initialDataUpdatedAt()\n : (initialDataUpdatedAt ?? Date.now())\n\n q.setData(data, updatedAt)\n }\n\n // getOrCreate mutates the cache (a side effect), so it must not run inside\n // a computed. Resolve the query in a signal: seed it synchronously and\n // update it from an effect whenever the key changes.\n const seed = cache.getOrCreate<TData, TError>(\n untracked(defaultedOptions).queryKey,\n )\n\n applyInitialData(seed)\n\n const query = signal(seed)\n\n // Data of the last query that had any, fed to the placeholderData function\n // on key change (mirrors TanStack's lastQueryWithDefinedData). Captured\n // synchronously before the switch so it can't miss a just-resolved value.\n const lastData = signal<TData | undefined>(undefined)\n\n effect(() => {\n const key = defaultedOptions().queryKey\n const q = untracked(() => cache.getOrCreate<TData, TError>(key))\n\n untracked(() => {\n const prev = query()\n\n if (prev !== q && prev.state().data !== undefined) {\n lastData.set(prev.state().data)\n }\n\n applyInitialData(q)\n })\n query.set(q)\n })\n\n // Memoized: only emits when the flag itself flips, so ordinary data\n // updates don't wake the fetch effect (no refetch loop).\n const isInvalidated = computed(() => query().state().isInvalidated)\n\n effect((cleanup) => {\n const q = query()\n const { gcTime } = untracked(defaultedOptions)\n\n if (gcTime !== undefined) {\n q.setGcTime(gcTime)\n }\n\n q.addObserver()\n cleanup(() => q.removeObserver())\n })\n\n effect(() => {\n const { queryKey, queryFn, staleTime, retry, retryDelay, enabled } =\n defaultedOptions()\n\n // Track invalidation so invalidateQueries() re-triggers a refetch.\n // When invalidated, cancel any in-flight fetch and start a fresh one\n // (otherwise the stale in-flight result would clear isInvalidated).\n const invalidated = isInvalidated()\n\n if (enabled === false) return\n\n untracked(() =>\n client.fetchQuery(queryKey, queryFn, {\n staleTime,\n retry,\n retryDelay,\n cancelRefetch: invalidated,\n }),\n )\n })\n\n // Polling: refetch on an interval, independent of staleTime (staleTime: 0\n // forces the fetch). The function form is reactive — reading state() makes\n // the effect re-run when data changes, so returning false stops polling.\n effect((onCleanup) => {\n const { queryKey, queryFn, retry, retryDelay, refetchInterval, enabled } =\n defaultedOptions()\n\n if (enabled === false) return\n\n const interval =\n typeof refetchInterval === 'function'\n ? refetchInterval({ state: query().state() })\n : refetchInterval\n\n if (!interval) return\n\n const id = setInterval(() => {\n client.fetchQuery(queryKey, queryFn, {\n staleTime: 0,\n retry,\n retryDelay,\n })\n }, interval)\n\n onCleanup(() => clearInterval(id))\n })\n\n // Placeholder layer: while the query is pending with no data, present\n // placeholderData as already-successful data. Purely presentational — the\n // cache entry stays 'pending' and the fetch proceeds, so isFetching keeps\n // reporting the real request and the placeholder is dropped on resolve.\n const resolved = computed<{\n data: TData | undefined\n status: QueryStatus\n isPlaceholderData: boolean\n }>(() => {\n const state = query().state()\n const { placeholderData } = defaultedOptions()\n\n if (\n placeholderData !== undefined &&\n state.data === undefined &&\n state.status === 'pending'\n ) {\n const data =\n typeof placeholderData === 'function'\n ? (placeholderData as PlaceholderDataFunction<TData>)(lastData())\n : placeholderData\n\n if (data !== undefined) {\n return { data, status: 'success', isPlaceholderData: true }\n }\n }\n\n return { data: state.data, status: state.status, isPlaceholderData: false }\n })\n\n return {\n data: computed(() => resolved().data),\n status: computed(() => resolved().status),\n error: computed(() => query().state().error as TError | null),\n isFetching: computed(() => query().state().isFetching),\n // First fetch in-flight: fetching with no resolved data yet. An active\n // placeholder counts as data — the UI shows it, not a loading state.\n isLoading: computed(\n () => query().state().isFetching && resolved().status === 'pending',\n ),\n isPending: computed(() => resolved().status === 'pending'),\n isSuccess: computed(() => resolved().status === 'success'),\n isError: computed(() => resolved().status === 'error'),\n isPlaceholderData: computed(() => resolved().isPlaceholderData),\n failureCount: computed(() => query().state().failureCount),\n failureReason: computed(\n () => query().state().failureReason as TError | null,\n ),\n // Force a fresh fetch regardless of staleTime, cancelling any in-flight\n // request (explicit user intent — get current data).\n refetch: () => {\n const { queryKey, queryFn, retry, retryDelay } =\n untracked(defaultedOptions)\n\n client.fetchQuery(queryKey, queryFn, {\n staleTime: 0,\n retry,\n retryDelay,\n cancelRefetch: true,\n })\n },\n }\n })\n}\n","import {\n assertInInjectionContext,\n computed,\n DestroyRef,\n inject,\n Injector,\n runInInjectionContext,\n signal,\n untracked,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\nimport {\n type Mutation,\n type MutationOptions,\n type MutationResult,\n getInitialState,\n} from './mutation'\n\n/**\n * Creates a mutation for imperative writes (create/update/delete) and exposes\n * its state as signals.\n *\n * Unlike queries, a mutation does not run on its own — call `mutate(variables)`\n * to trigger `mutationFn`. The `onMutate` / `onSuccess` / `onError` /\n * `onSettled` lifecycle hooks make optimistic updates and cache invalidation\n * straightforward. Mutations do not retry by default (a retried write is not\n * idempotent); opt in via `options.retry`. Bound to the current injection\n * context and cancelled when that context is destroyed.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @typeParam TData - Type of the data resolved by `mutationFn`.\n * @typeParam TError - Type of the error thrown by `mutationFn`.\n * @typeParam TVariables - Type of the argument passed to `mutate()`.\n * @typeParam TContext - Type returned by `onMutate`, passed to later hooks.\n * @param optionsFn - Factory returning the {@link MutationOptions}.\n * @param options - Optional `injector` to use outside an injection context.\n * @returns A {@link MutationResult}: `mutate()`, `reset()`, and state signals\n * (`status`, `data`, `error`, `isPending`, …).\n *\n * @example\n * ```ts\n * const client = injectQueryClient()\n *\n * const addTodo = injectMutation(() => ({\n * mutationFn: (title: string) => http.post<Todo>('/api/todos', { title }),\n * onSuccess: () => client.invalidateQueries({ queryKey: ['todos'] }),\n * }))\n *\n * // <button (click)=\"addTodo.mutate('Buy milk')\" [disabled]=\"addTodo.isPending()\">Add</button>\n * ```\n */\nexport function injectMutation<\n TData,\n TError = Error,\n TVariables = void,\n TContext = unknown,\n>(\n optionsFn: () => MutationOptions<TData, TError, TVariables, TContext>,\n options?: { injector?: Injector },\n): MutationResult<TData, TError, TVariables> {\n if (!options?.injector) assertInInjectionContext(injectMutation)\n\n const injector = options?.injector ?? inject(Injector)\n\n return runInInjectionContext(injector, () => {\n const cache = inject(QueryClient).getMutationCache()\n\n // Every mutate() builds its own Mutation. Sharing one across calls meant a\n // second call overwrote the first's subscription (orphaning the request)\n // and its state (so the slower run, not the latest one, decided the result).\n const current = signal<Mutation<\n TData,\n TError,\n TVariables,\n TContext\n > | null>(null)\n\n // Detaching is all we do on destroy. A run still in flight keeps going —\n // the write has most likely reached the server already, so cancelling it\n // would only skip onSuccess and leave the cache out of sync. It drops\n // itself from the cache once it settles with nobody watching.\n inject(DestroyRef).onDestroy(() => untracked(current)?.removeObserver())\n\n const state = computed(\n () =>\n current()?.state() ??\n getInitialState<TData, TError, TVariables, TContext>(),\n )\n\n return {\n mutate: (variables) => {\n // Stop observing the previous run. It isn't cancelled — if it's still\n // in flight it finishes and fires its hooks; it just no longer feeds\n // the signals below.\n untracked(current)?.removeObserver()\n\n // Options are read per call, so a signal used in them stays live.\n const run = cache.build(optionsFn())\n\n run.addObserver()\n current.set(run)\n run.execute(variables)\n },\n reset: () => {\n // \"Forget the result\", not \"stop the request\". A run still in flight\n // keeps going and fires its hooks, so the cache stays in step with the\n // server — cancelling could not un-send the write anyway, it could only\n // hide the fact that it happened.\n untracked(current)?.removeObserver()\n\n current.set(null)\n },\n data: computed(() => state().data),\n error: computed(() => state().error as TError | null),\n variables: computed(() => state().variables),\n status: computed(() => state().status),\n isIdle: computed(() => state().status === 'idle'),\n isPending: computed(() => state().status === 'pending'),\n isSuccess: computed(() => state().status === 'success'),\n isError: computed(() => state().status === 'error'),\n failureCount: computed(() => state().failureCount),\n failureReason: computed(() => state().failureReason as TError | null),\n }\n })\n}\n","import {\n type Injector,\n type Signal,\n assertInInjectionContext,\n computed,\n inject,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\nimport type { QueryFilters } from './types'\n\n/**\n * Returns a signal with the number of queries currently fetching — useful for a\n * global loading indicator.\n *\n * Pass {@link QueryFilters} to count only matching queries; omit them to count\n * every fetching query in the cache.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @param filters - Optional filters (e.g. `{ queryKey: ['todos'] }`) to narrow\n * the count.\n * @param options - Optional `injector` to use outside an injection context.\n * @returns A `Signal<number>` of active fetches.\n *\n * @example\n * ```ts\n * readonly isFetching = injectIsFetching()\n * // <app-spinner *ngIf=\"isFetching() > 0\" />\n * ```\n */\nexport function injectIsFetching(\n filters?: QueryFilters,\n options?: { injector?: Injector },\n): Signal<number> {\n if (!options?.injector) assertInInjectionContext(injectIsFetching)\n\n const client = options?.injector?.get(QueryClient) ?? inject(QueryClient)\n const cache = client.getQueryCache()\n\n return computed(\n () =>\n cache.findAll(filters).filter((query) => query.state().isFetching).length,\n )\n}\n","import {\n type Injector,\n type Signal,\n assertInInjectionContext,\n computed,\n inject,\n} from '@angular/core'\n\nimport { QueryClient } from './query-client'\n\n/**\n * Returns a signal with the number of mutations currently pending — useful for\n * a global \"saving…\" indicator.\n *\n * Must run in an injection context, or be given an explicit `injector`.\n *\n * @param options - Optional `injector` to use outside an injection context.\n * @returns A `Signal<number>` of in-flight mutations.\n *\n * @example\n * ```ts\n * readonly isMutating = injectIsMutating()\n * // <p *ngIf=\"isMutating() > 0\">Saving…</p>\n * ```\n */\nexport function injectIsMutating(options?: {\n injector?: Injector\n}): Signal<number> {\n if (!options?.injector) assertInInjectionContext(injectIsMutating)\n\n const client = options?.injector?.get(QueryClient) ?? inject(QueryClient)\n const cache = client.getMutationCache()\n\n return computed(() => cache.findAll({ status: 'pending' }).length)\n}\n","import type { QueryOptions } from './types'\n\n/**\n * Identity helper that defines a typed, reusable set of {@link QueryOptions}.\n *\n * Returns the options unchanged at runtime, but anchors type inference so the\n * same definition can be shared across {@link injectQuery},\n * {@link QueryClient.setQueryData}, and friends without re-declaring generics.\n * Keeping query definitions in a service (rather than inline) makes them easy\n * to reuse and unit-test.\n *\n * @typeParam TData - Type of the data resolved by `queryFn`.\n * @typeParam TError - Type of the error thrown by `queryFn`.\n * @param options - The {@link QueryOptions} to define.\n * @returns The same `options`, typed.\n *\n * @example\n * ```ts\n * @Injectable({ providedIn: 'root' })\n * class TodoQueries {\n * private readonly http = inject(HttpClient)\n *\n * todos() {\n * return queryOptions({\n * queryKey: ['todos'],\n * queryFn: () => this.http.get<Todo[]>('/api/todos'),\n * })\n * }\n * }\n *\n * // const todos = injectQuery(() => inject(TodoQueries).todos())\n * ```\n */\nexport function queryOptions<TData, TError = Error>(\n options: QueryOptions<TData, TError>,\n): QueryOptions<TData, TError> {\n return options\n}\n","/**\n * Placeholder function that keeps the previous query's data visible while the\n * next one loads — pass as `placeholderData` to avoid flicker when the query\n * key changes (e.g. pagination, search).\n *\n * While the placeholder is shown, `status` reads `'success'` and\n * `isPlaceholderData()` is `true`; `isFetching()` stays `true` so the UI can\n * indicate the data is stale.\n *\n * @example\n * ```ts\n * readonly todos = injectQuery(() => ({\n * queryKey: ['todos', this.page()],\n * queryFn: () => this.http.get<Todo[]>(`/api/todos?page=${this.page()}`),\n * placeholderData: keepPreviousData,\n * }))\n * ```\n */\nexport function keepPreviousData<TData>(\n previousData: TData | undefined,\n): TData | undefined {\n return previousData\n}\n","import type { MutationOptions } from './mutation'\n\n/**\n * Identity helper that defines a typed, reusable set of {@link MutationOptions}.\n *\n * Returns the options unchanged at runtime; its job is to anchor type inference\n * (notably linking `TContext` returned by `onMutate` to the later hooks) so a\n * mutation can be defined once in a service and passed to {@link injectMutation}.\n *\n * @typeParam TData - Type of the data resolved by `mutationFn`.\n * @typeParam TError - Type of the error thrown by `mutationFn`.\n * @typeParam TVariables - Type of the argument passed to `mutate()`.\n * @typeParam TContext - Type returned by `onMutate`, passed to later hooks.\n * @param options - The {@link MutationOptions} to define.\n * @returns The same `options`, typed.\n *\n * @example\n * ```ts\n * addTodo() {\n * return mutationOptions({\n * mutationFn: (title: string) => this.http.post<Todo>('/api/todos', { title }),\n * onSuccess: () => this.client.invalidateQueries({ queryKey: ['todos'] }),\n * })\n * }\n * ```\n */\nexport function mutationOptions<\n TData,\n TError = Error,\n TVariables = void,\n TContext = unknown,\n>(\n options: MutationOptions<TData, TError, TVariables, TContext>,\n): MutationOptions<TData, TError, TVariables, TContext> {\n return options\n}\n","import { QUERY_CLIENT_CONFIG } from '../core/injection-tokens'\nimport type { RetryDelayValue, RetryValue } from '../core/types'\nimport {\n type QueryClientFeature,\n QueryClientFeatureKind,\n queryClientFeature,\n} from './feature'\n\n/** Default query options applied to every query unless overridden per-query. */\nexport interface DefaultQueryOptions {\n /** How long fetched data is considered fresh, in ms. Defaults to `0`. */\n staleTime?: number\n /** How long unused (unobserved) data is kept before garbage collection, in ms. */\n gcTime?: number\n /** Retry policy on failure: a boolean, a count, or a predicate. Defaults to `3`. */\n retry?: RetryValue<unknown>\n /** Delay between retries, in ms or a function of the attempt. */\n retryDelay?: RetryDelayValue<unknown>\n}\n\n/** Application-wide defaults configured via {@link withDefaultOptions}. */\nexport interface DefaultOptions {\n /** Defaults applied to all queries. */\n queries?: DefaultQueryOptions\n}\n\n/**\n * Feature for {@link provideQueryClient} that sets application-wide default\n * query options. Per-query options always take precedence over these defaults.\n *\n * @param options - The {@link DefaultOptions} to apply.\n * @returns A {@link QueryClientFeature} to pass to {@link provideQueryClient}.\n *\n * @example\n * ```ts\n * provideQueryClient(\n * withDefaultOptions({ queries: { staleTime: 60_000, retry: 1 } }),\n * )\n * ```\n */\nexport function withDefaultOptions(\n options: DefaultOptions,\n): QueryClientFeature<QueryClientFeatureKind.DefaultOptions> {\n return queryClientFeature(QueryClientFeatureKind.DefaultOptions, [\n { provide: QUERY_CLIENT_CONFIG, useValue: { defaultOptions: options } },\n ])\n}\n","/*\n * Public API Surface of ngx-query\n */\n\nexport * from './lib/core/query-client'\nexport * from './lib/core/provider'\nexport * from './lib/core/inject-query-client'\nexport * from './lib/core/types'\nexport * from './lib/core/inject-query'\nexport * from './lib/core/inject-mutation'\nexport * from './lib/core/inject-is-fetching'\nexport * from './lib/core/inject-is-mutating'\nexport * from './lib/core/query-options'\nexport * from './lib/core/keep-previous-data'\nexport * from './lib/core/mutation-options'\nexport type {\n MutationFilters,\n MutationOptions,\n MutationResult,\n MutationState,\n MutationStatus,\n} from './lib/core/mutation'\nexport { QueryClientFeatureKind } from './lib/features/feature'\nexport type { QueryClientFeature } from './lib/features/feature'\nexport { withDefaultOptions } from './lib/features/with-default-options'\nexport type {\n DefaultOptions,\n DefaultQueryOptions,\n} from './lib/features/with-default-options'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["retry","retryOperator"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -48,6 +48,11 @@ type QueryFilters = {
|
|
|
48
48
|
};
|
|
49
49
|
/** A new value, or a function deriving it from the previous one. */
|
|
50
50
|
type Updater<TInput, TOutput> = TOutput | ((input: TInput) => TOutput);
|
|
51
|
+
/**
|
|
52
|
+
* Computes placeholder data from the previous query's data (e.g. the page
|
|
53
|
+
* shown before a key change). Return `undefined` to show no placeholder.
|
|
54
|
+
*/
|
|
55
|
+
type PlaceholderDataFunction<TData> = (previousData: TData | undefined) => TData | undefined;
|
|
51
56
|
/**
|
|
52
57
|
* Polling interval in ms, `false` to disable, or a function of the current
|
|
53
58
|
* query snapshot returning the next interval (e.g. stop polling on error).
|
|
@@ -80,6 +85,13 @@ type QueryOptions<TData, TError = Error> = {
|
|
|
80
85
|
refetchInterval?: RefetchIntervalValue<TData, TError>;
|
|
81
86
|
/** Seed data to render immediately (treated as already-resolved). */
|
|
82
87
|
initialData?: TData | (() => TData);
|
|
88
|
+
/**
|
|
89
|
+
* Data shown while the query is `'pending'` with no data yet, either a value
|
|
90
|
+
* or a function of the previous query's data (see {@link keepPreviousData}).
|
|
91
|
+
* Unlike `initialData` it is never written to the cache: the query stays
|
|
92
|
+
* `'pending'` underneath, and `isPlaceholderData` is `true` while shown.
|
|
93
|
+
*/
|
|
94
|
+
placeholderData?: TData | PlaceholderDataFunction<TData>;
|
|
83
95
|
/** Timestamp (ms) for `initialData`; older data is considered stale. */
|
|
84
96
|
initialDataUpdatedAt?: number | (() => number);
|
|
85
97
|
/** Set `false` to disable fetching (e.g. until a dependency is ready). */
|
|
@@ -113,6 +125,8 @@ type QueryResult<TData, TError = Error> = {
|
|
|
113
125
|
isSuccess: Signal<boolean>;
|
|
114
126
|
/** Whether status is `'error'`. */
|
|
115
127
|
isError: Signal<boolean>;
|
|
128
|
+
/** Whether `data` is placeholder data (see `placeholderData`), not cached data. */
|
|
129
|
+
isPlaceholderData: Signal<boolean>;
|
|
116
130
|
/** Consecutive failures in the current fetch. */
|
|
117
131
|
failureCount: Signal<number>;
|
|
118
132
|
/** Error of the most recent failed attempt, or `null`. */
|
|
@@ -579,6 +593,26 @@ declare function injectIsMutating(options?: {
|
|
|
579
593
|
*/
|
|
580
594
|
declare function queryOptions<TData, TError = Error>(options: QueryOptions<TData, TError>): QueryOptions<TData, TError>;
|
|
581
595
|
|
|
596
|
+
/**
|
|
597
|
+
* Placeholder function that keeps the previous query's data visible while the
|
|
598
|
+
* next one loads — pass as `placeholderData` to avoid flicker when the query
|
|
599
|
+
* key changes (e.g. pagination, search).
|
|
600
|
+
*
|
|
601
|
+
* While the placeholder is shown, `status` reads `'success'` and
|
|
602
|
+
* `isPlaceholderData()` is `true`; `isFetching()` stays `true` so the UI can
|
|
603
|
+
* indicate the data is stale.
|
|
604
|
+
*
|
|
605
|
+
* @example
|
|
606
|
+
* ```ts
|
|
607
|
+
* readonly todos = injectQuery(() => ({
|
|
608
|
+
* queryKey: ['todos', this.page()],
|
|
609
|
+
* queryFn: () => this.http.get<Todo[]>(`/api/todos?page=${this.page()}`),
|
|
610
|
+
* placeholderData: keepPreviousData,
|
|
611
|
+
* }))
|
|
612
|
+
* ```
|
|
613
|
+
*/
|
|
614
|
+
declare function keepPreviousData<TData>(previousData: TData | undefined): TData | undefined;
|
|
615
|
+
|
|
582
616
|
/**
|
|
583
617
|
* Identity helper that defines a typed, reusable set of {@link MutationOptions}.
|
|
584
618
|
*
|
|
@@ -637,5 +671,5 @@ interface DefaultOptions {
|
|
|
637
671
|
*/
|
|
638
672
|
declare function withDefaultOptions(options: DefaultOptions): QueryClientFeature<QueryClientFeatureKind.DefaultOptions>;
|
|
639
673
|
|
|
640
|
-
export { QueryClient, QueryClientFeatureKind, injectIsFetching, injectIsMutating, injectMutation, injectQuery, injectQueryClient, mutationOptions, provideQueryClient, queryOptions, withDefaultOptions };
|
|
641
|
-
export type { DefaultOptions, DefaultQueryOptions, DefaultedQueryOptions, MutationFilters, MutationOptions, MutationResult, MutationState, MutationStatus, QueryClientFeature, QueryFilters, QueryKey, QueryOptions, QueryResult, QueryState, QueryStatus, RefetchIntervalValue, RetryDelayValue, RetryValue, Updater };
|
|
674
|
+
export { QueryClient, QueryClientFeatureKind, injectIsFetching, injectIsMutating, injectMutation, injectQuery, injectQueryClient, keepPreviousData, mutationOptions, provideQueryClient, queryOptions, withDefaultOptions };
|
|
675
|
+
export type { DefaultOptions, DefaultQueryOptions, DefaultedQueryOptions, MutationFilters, MutationOptions, MutationResult, MutationState, MutationStatus, PlaceholderDataFunction, QueryClientFeature, QueryFilters, QueryKey, QueryOptions, QueryResult, QueryState, QueryStatus, RefetchIntervalValue, RetryDelayValue, RetryValue, Updater };
|