@tanstack/query-core 5.87.1 → 5.89.0

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.
Files changed (120) hide show
  1. package/build/legacy/{hydration-_hO-y142.d.cts → hydration-DofhGwZq.d.cts} +57 -51
  2. package/build/legacy/{hydration-BYonJkjc.d.ts → hydration-iULCH7y8.d.ts} +57 -51
  3. package/build/legacy/hydration.d.cts +1 -1
  4. package/build/legacy/hydration.d.ts +1 -1
  5. package/build/legacy/index.d.cts +1 -1
  6. package/build/legacy/index.d.ts +1 -1
  7. package/build/legacy/infiniteQueryBehavior.d.cts +1 -1
  8. package/build/legacy/infiniteQueryBehavior.d.ts +1 -1
  9. package/build/legacy/infiniteQueryObserver.d.cts +1 -1
  10. package/build/legacy/infiniteQueryObserver.d.ts +1 -1
  11. package/build/legacy/mutation.cjs +44 -12
  12. package/build/legacy/mutation.cjs.map +1 -1
  13. package/build/legacy/mutation.d.cts +1 -1
  14. package/build/legacy/mutation.d.ts +1 -1
  15. package/build/legacy/mutation.js +44 -12
  16. package/build/legacy/mutation.js.map +1 -1
  17. package/build/legacy/mutationCache.cjs +1 -0
  18. package/build/legacy/mutationCache.cjs.map +1 -1
  19. package/build/legacy/mutationCache.d.cts +1 -1
  20. package/build/legacy/mutationCache.d.ts +1 -1
  21. package/build/legacy/mutationCache.js +1 -0
  22. package/build/legacy/mutationCache.js.map +1 -1
  23. package/build/legacy/mutationObserver.cjs +29 -4
  24. package/build/legacy/mutationObserver.cjs.map +1 -1
  25. package/build/legacy/mutationObserver.d.cts +1 -1
  26. package/build/legacy/mutationObserver.d.ts +1 -1
  27. package/build/legacy/mutationObserver.js +29 -4
  28. package/build/legacy/mutationObserver.js.map +1 -1
  29. package/build/legacy/queriesObserver.cjs +7 -5
  30. package/build/legacy/queriesObserver.cjs.map +1 -1
  31. package/build/legacy/queriesObserver.d.cts +1 -1
  32. package/build/legacy/queriesObserver.d.ts +1 -1
  33. package/build/legacy/queriesObserver.js +7 -5
  34. package/build/legacy/queriesObserver.js.map +1 -1
  35. package/build/legacy/query.d.cts +1 -1
  36. package/build/legacy/query.d.ts +1 -1
  37. package/build/legacy/queryCache.d.cts +1 -1
  38. package/build/legacy/queryCache.d.ts +1 -1
  39. package/build/legacy/queryClient.cjs.map +1 -1
  40. package/build/legacy/queryClient.d.cts +1 -1
  41. package/build/legacy/queryClient.d.ts +1 -1
  42. package/build/legacy/queryClient.js.map +1 -1
  43. package/build/legacy/queryObserver.d.cts +1 -1
  44. package/build/legacy/queryObserver.d.ts +1 -1
  45. package/build/legacy/retryer.d.cts +1 -1
  46. package/build/legacy/retryer.d.ts +1 -1
  47. package/build/legacy/streamedQuery.d.cts +1 -1
  48. package/build/legacy/streamedQuery.d.ts +1 -1
  49. package/build/legacy/types.cjs.map +1 -1
  50. package/build/legacy/types.d.cts +1 -1
  51. package/build/legacy/types.d.ts +1 -1
  52. package/build/legacy/types.js.map +1 -1
  53. package/build/legacy/utils.cjs.map +1 -1
  54. package/build/legacy/utils.d.cts +1 -1
  55. package/build/legacy/utils.d.ts +1 -1
  56. package/build/legacy/utils.js.map +1 -1
  57. package/build/modern/{hydration-_hO-y142.d.cts → hydration-DofhGwZq.d.cts} +57 -51
  58. package/build/modern/{hydration-BYonJkjc.d.ts → hydration-iULCH7y8.d.ts} +57 -51
  59. package/build/modern/hydration.d.cts +1 -1
  60. package/build/modern/hydration.d.ts +1 -1
  61. package/build/modern/index.d.cts +1 -1
  62. package/build/modern/index.d.ts +1 -1
  63. package/build/modern/infiniteQueryBehavior.d.cts +1 -1
  64. package/build/modern/infiniteQueryBehavior.d.ts +1 -1
  65. package/build/modern/infiniteQueryObserver.d.cts +1 -1
  66. package/build/modern/infiniteQueryObserver.d.ts +1 -1
  67. package/build/modern/mutation.cjs +39 -11
  68. package/build/modern/mutation.cjs.map +1 -1
  69. package/build/modern/mutation.d.cts +1 -1
  70. package/build/modern/mutation.d.ts +1 -1
  71. package/build/modern/mutation.js +39 -11
  72. package/build/modern/mutation.js.map +1 -1
  73. package/build/modern/mutationCache.cjs +1 -0
  74. package/build/modern/mutationCache.cjs.map +1 -1
  75. package/build/modern/mutationCache.d.cts +1 -1
  76. package/build/modern/mutationCache.d.ts +1 -1
  77. package/build/modern/mutationCache.js +1 -0
  78. package/build/modern/mutationCache.js.map +1 -1
  79. package/build/modern/mutationObserver.cjs +26 -4
  80. package/build/modern/mutationObserver.cjs.map +1 -1
  81. package/build/modern/mutationObserver.d.cts +1 -1
  82. package/build/modern/mutationObserver.d.ts +1 -1
  83. package/build/modern/mutationObserver.js +26 -4
  84. package/build/modern/mutationObserver.js.map +1 -1
  85. package/build/modern/queriesObserver.cjs +7 -5
  86. package/build/modern/queriesObserver.cjs.map +1 -1
  87. package/build/modern/queriesObserver.d.cts +1 -1
  88. package/build/modern/queriesObserver.d.ts +1 -1
  89. package/build/modern/queriesObserver.js +7 -5
  90. package/build/modern/queriesObserver.js.map +1 -1
  91. package/build/modern/query.d.cts +1 -1
  92. package/build/modern/query.d.ts +1 -1
  93. package/build/modern/queryCache.d.cts +1 -1
  94. package/build/modern/queryCache.d.ts +1 -1
  95. package/build/modern/queryClient.cjs.map +1 -1
  96. package/build/modern/queryClient.d.cts +1 -1
  97. package/build/modern/queryClient.d.ts +1 -1
  98. package/build/modern/queryClient.js.map +1 -1
  99. package/build/modern/queryObserver.d.cts +1 -1
  100. package/build/modern/queryObserver.d.ts +1 -1
  101. package/build/modern/retryer.d.cts +1 -1
  102. package/build/modern/retryer.d.ts +1 -1
  103. package/build/modern/streamedQuery.d.cts +1 -1
  104. package/build/modern/streamedQuery.d.ts +1 -1
  105. package/build/modern/types.cjs.map +1 -1
  106. package/build/modern/types.d.cts +1 -1
  107. package/build/modern/types.d.ts +1 -1
  108. package/build/modern/types.js.map +1 -1
  109. package/build/modern/utils.cjs.map +1 -1
  110. package/build/modern/utils.d.cts +1 -1
  111. package/build/modern/utils.d.ts +1 -1
  112. package/build/modern/utils.js.map +1 -1
  113. package/package.json +1 -1
  114. package/src/mutation.ts +61 -24
  115. package/src/mutationCache.ts +21 -11
  116. package/src/mutationObserver.ts +62 -22
  117. package/src/queriesObserver.ts +11 -10
  118. package/src/queryClient.ts +2 -2
  119. package/src/types.ts +67 -29
  120. package/src/utils.ts +2 -2
package/src/mutation.ts CHANGED
@@ -3,6 +3,7 @@ import { Removable } from './removable'
3
3
  import { createRetryer } from './retryer'
4
4
  import type {
5
5
  DefaultError,
6
+ MutationFunctionContext,
6
7
  MutationMeta,
7
8
  MutationOptions,
8
9
  MutationStatus,
@@ -10,23 +11,25 @@ import type {
10
11
  import type { MutationCache } from './mutationCache'
11
12
  import type { MutationObserver } from './mutationObserver'
12
13
  import type { Retryer } from './retryer'
14
+ import type { QueryClient } from './queryClient'
13
15
 
14
16
  // TYPES
15
17
 
16
- interface MutationConfig<TData, TError, TVariables, TContext> {
18
+ interface MutationConfig<TData, TError, TVariables, TOnMutateResult> {
19
+ client: QueryClient
17
20
  mutationId: number
18
21
  mutationCache: MutationCache
19
- options: MutationOptions<TData, TError, TVariables, TContext>
20
- state?: MutationState<TData, TError, TVariables, TContext>
22
+ options: MutationOptions<TData, TError, TVariables, TOnMutateResult>
23
+ state?: MutationState<TData, TError, TVariables, TOnMutateResult>
21
24
  }
22
25
 
23
26
  export interface MutationState<
24
27
  TData = unknown,
25
28
  TError = DefaultError,
26
29
  TVariables = unknown,
27
- TContext = unknown,
30
+ TOnMutateResult = unknown,
28
31
  > {
29
- context: TContext | undefined
32
+ context: TOnMutateResult | undefined
30
33
  data: TData | undefined
31
34
  error: TError | null
32
35
  failureCount: number
@@ -43,11 +46,11 @@ interface FailedAction<TError> {
43
46
  error: TError | null
44
47
  }
45
48
 
46
- interface PendingAction<TVariables, TContext> {
49
+ interface PendingAction<TVariables, TOnMutateResult> {
47
50
  type: 'pending'
48
51
  isPaused: boolean
49
52
  variables?: TVariables
50
- context?: TContext
53
+ context?: TOnMutateResult
51
54
  }
52
55
 
53
56
  interface SuccessAction<TData> {
@@ -68,11 +71,11 @@ interface ContinueAction {
68
71
  type: 'continue'
69
72
  }
70
73
 
71
- export type Action<TData, TError, TVariables, TContext> =
74
+ export type Action<TData, TError, TVariables, TOnMutateResult> =
72
75
  | ContinueAction
73
76
  | ErrorAction<TError>
74
77
  | FailedAction<TError>
75
- | PendingAction<TVariables, TContext>
78
+ | PendingAction<TVariables, TOnMutateResult>
76
79
  | PauseAction
77
80
  | SuccessAction<TData>
78
81
 
@@ -82,19 +85,25 @@ export class Mutation<
82
85
  TData = unknown,
83
86
  TError = DefaultError,
84
87
  TVariables = unknown,
85
- TContext = unknown,
88
+ TOnMutateResult = unknown,
86
89
  > extends Removable {
87
- state: MutationState<TData, TError, TVariables, TContext>
88
- options!: MutationOptions<TData, TError, TVariables, TContext>
90
+ state: MutationState<TData, TError, TVariables, TOnMutateResult>
91
+ options!: MutationOptions<TData, TError, TVariables, TOnMutateResult>
89
92
  readonly mutationId: number
90
93
 
91
- #observers: Array<MutationObserver<TData, TError, TVariables, TContext>>
94
+ #client: QueryClient
95
+ #observers: Array<
96
+ MutationObserver<TData, TError, TVariables, TOnMutateResult>
97
+ >
92
98
  #mutationCache: MutationCache
93
99
  #retryer?: Retryer<TData>
94
100
 
95
- constructor(config: MutationConfig<TData, TError, TVariables, TContext>) {
101
+ constructor(
102
+ config: MutationConfig<TData, TError, TVariables, TOnMutateResult>,
103
+ ) {
96
104
  super()
97
105
 
106
+ this.#client = config.client
98
107
  this.mutationId = config.mutationId
99
108
  this.#mutationCache = config.mutationCache
100
109
  this.#observers = []
@@ -105,7 +114,7 @@ export class Mutation<
105
114
  }
106
115
 
107
116
  setOptions(
108
- options: MutationOptions<TData, TError, TVariables, TContext>,
117
+ options: MutationOptions<TData, TError, TVariables, TOnMutateResult>,
109
118
  ): void {
110
119
  this.options = options
111
120
 
@@ -166,12 +175,19 @@ export class Mutation<
166
175
  this.#dispatch({ type: 'continue' })
167
176
  }
168
177
 
178
+ const mutationFnContext = {
179
+ client: this.#client,
180
+ meta: this.options.meta,
181
+ mutationKey: this.options.mutationKey,
182
+ } satisfies MutationFunctionContext
183
+
169
184
  this.#retryer = createRetryer({
170
185
  fn: () => {
171
186
  if (!this.options.mutationFn) {
172
187
  return Promise.reject(new Error('No mutationFn found'))
173
188
  }
174
- return this.options.mutationFn(variables)
189
+
190
+ return this.options.mutationFn(variables, mutationFnContext)
175
191
  },
176
192
  onFail: (failureCount, error) => {
177
193
  this.#dispatch({ type: 'failed', failureCount, error })
@@ -199,8 +215,12 @@ export class Mutation<
199
215
  await this.#mutationCache.config.onMutate?.(
200
216
  variables,
201
217
  this as Mutation<unknown, unknown, unknown, unknown>,
218
+ mutationFnContext,
219
+ )
220
+ const context = await this.options.onMutate?.(
221
+ variables,
222
+ mutationFnContext,
202
223
  )
203
- const context = await this.options.onMutate?.(variables)
204
224
  if (context !== this.state.context) {
205
225
  this.#dispatch({
206
226
  type: 'pending',
@@ -218,9 +238,15 @@ export class Mutation<
218
238
  variables,
219
239
  this.state.context,
220
240
  this as Mutation<unknown, unknown, unknown, unknown>,
241
+ mutationFnContext,
221
242
  )
222
243
 
223
- await this.options.onSuccess?.(data, variables, this.state.context!)
244
+ await this.options.onSuccess?.(
245
+ data,
246
+ variables,
247
+ this.state.context,
248
+ mutationFnContext,
249
+ )
224
250
 
225
251
  // Notify cache callback
226
252
  await this.#mutationCache.config.onSettled?.(
@@ -229,9 +255,16 @@ export class Mutation<
229
255
  this.state.variables,
230
256
  this.state.context,
231
257
  this as Mutation<unknown, unknown, unknown, unknown>,
258
+ mutationFnContext,
232
259
  )
233
260
 
234
- await this.options.onSettled?.(data, null, variables, this.state.context)
261
+ await this.options.onSettled?.(
262
+ data,
263
+ null,
264
+ variables,
265
+ this.state.context,
266
+ mutationFnContext,
267
+ )
235
268
 
236
269
  this.#dispatch({ type: 'success', data })
237
270
  return data
@@ -243,12 +276,14 @@ export class Mutation<
243
276
  variables,
244
277
  this.state.context,
245
278
  this as Mutation<unknown, unknown, unknown, unknown>,
279
+ mutationFnContext,
246
280
  )
247
281
 
248
282
  await this.options.onError?.(
249
283
  error as TError,
250
284
  variables,
251
285
  this.state.context,
286
+ mutationFnContext,
252
287
  )
253
288
 
254
289
  // Notify cache callback
@@ -258,6 +293,7 @@ export class Mutation<
258
293
  this.state.variables,
259
294
  this.state.context,
260
295
  this as Mutation<unknown, unknown, unknown, unknown>,
296
+ mutationFnContext,
261
297
  )
262
298
 
263
299
  await this.options.onSettled?.(
@@ -265,6 +301,7 @@ export class Mutation<
265
301
  error as TError,
266
302
  variables,
267
303
  this.state.context,
304
+ mutationFnContext,
268
305
  )
269
306
  throw error
270
307
  } finally {
@@ -275,10 +312,10 @@ export class Mutation<
275
312
  }
276
313
  }
277
314
 
278
- #dispatch(action: Action<TData, TError, TVariables, TContext>): void {
315
+ #dispatch(action: Action<TData, TError, TVariables, TOnMutateResult>): void {
279
316
  const reducer = (
280
- state: MutationState<TData, TError, TVariables, TContext>,
281
- ): MutationState<TData, TError, TVariables, TContext> => {
317
+ state: MutationState<TData, TError, TVariables, TOnMutateResult>,
318
+ ): MutationState<TData, TError, TVariables, TOnMutateResult> => {
282
319
  switch (action.type) {
283
320
  case 'failed':
284
321
  return {
@@ -350,8 +387,8 @@ export function getDefaultState<
350
387
  TData,
351
388
  TError,
352
389
  TVariables,
353
- TContext,
354
- >(): MutationState<TData, TError, TVariables, TContext> {
390
+ TOnMutateResult,
391
+ >(): MutationState<TData, TError, TVariables, TOnMutateResult> {
355
392
  return {
356
393
  context: undefined,
357
394
  data: undefined,
@@ -3,7 +3,12 @@ import { Mutation } from './mutation'
3
3
  import { matchMutation, noop } from './utils'
4
4
  import { Subscribable } from './subscribable'
5
5
  import type { MutationObserver } from './mutationObserver'
6
- import type { DefaultError, MutationOptions, NotifyEvent } from './types'
6
+ import type {
7
+ DefaultError,
8
+ MutationFunctionContext,
9
+ MutationOptions,
10
+ NotifyEvent,
11
+ } from './types'
7
12
  import type { QueryClient } from './queryClient'
8
13
  import type { Action, MutationState } from './mutation'
9
14
  import type { MutationFilters } from './utils'
@@ -14,25 +19,29 @@ interface MutationCacheConfig {
14
19
  onError?: (
15
20
  error: DefaultError,
16
21
  variables: unknown,
17
- context: unknown,
22
+ onMutateResult: unknown,
18
23
  mutation: Mutation<unknown, unknown, unknown>,
24
+ context: MutationFunctionContext,
19
25
  ) => Promise<unknown> | unknown
20
26
  onSuccess?: (
21
27
  data: unknown,
22
28
  variables: unknown,
23
- context: unknown,
29
+ onMutateResult: unknown,
24
30
  mutation: Mutation<unknown, unknown, unknown>,
31
+ context: MutationFunctionContext,
25
32
  ) => Promise<unknown> | unknown
26
33
  onMutate?: (
27
34
  variables: unknown,
28
35
  mutation: Mutation<unknown, unknown, unknown>,
36
+ context: MutationFunctionContext,
29
37
  ) => Promise<unknown> | unknown
30
38
  onSettled?: (
31
39
  data: unknown | undefined,
32
40
  error: DefaultError | null,
33
41
  variables: unknown,
34
- context: unknown,
42
+ onMutateResult: unknown,
35
43
  mutation: Mutation<unknown, unknown, unknown>,
44
+ context: MutationFunctionContext,
36
45
  ) => Promise<unknown> | unknown
37
46
  }
38
47
 
@@ -93,12 +102,13 @@ export class MutationCache extends Subscribable<MutationCacheListener> {
93
102
  this.#mutationId = 0
94
103
  }
95
104
 
96
- build<TData, TError, TVariables, TContext>(
105
+ build<TData, TError, TVariables, TOnMutateResult>(
97
106
  client: QueryClient,
98
- options: MutationOptions<TData, TError, TVariables, TContext>,
99
- state?: MutationState<TData, TError, TVariables, TContext>,
100
- ): Mutation<TData, TError, TVariables, TContext> {
107
+ options: MutationOptions<TData, TError, TVariables, TOnMutateResult>,
108
+ state?: MutationState<TData, TError, TVariables, TOnMutateResult>,
109
+ ): Mutation<TData, TError, TVariables, TOnMutateResult> {
101
110
  const mutation = new Mutation({
111
+ client,
102
112
  mutationCache: this,
103
113
  mutationId: ++this.#mutationId,
104
114
  options: client.defaultMutationOptions(options),
@@ -195,15 +205,15 @@ export class MutationCache extends Subscribable<MutationCacheListener> {
195
205
  TData = unknown,
196
206
  TError = DefaultError,
197
207
  TVariables = any,
198
- TContext = unknown,
208
+ TOnMutateResult = unknown,
199
209
  >(
200
210
  filters: MutationFilters,
201
- ): Mutation<TData, TError, TVariables, TContext> | undefined {
211
+ ): Mutation<TData, TError, TVariables, TOnMutateResult> | undefined {
202
212
  const defaultedFilters = { exact: true, ...filters }
203
213
 
204
214
  return this.getAll().find((mutation) =>
205
215
  matchMutation(defaultedFilters, mutation),
206
- ) as Mutation<TData, TError, TVariables, TContext> | undefined
216
+ ) as Mutation<TData, TError, TVariables, TOnMutateResult> | undefined
207
217
  }
208
218
 
209
219
  findAll(filters: MutationFilters = {}): Array<Mutation> {
@@ -6,6 +6,7 @@ import type { QueryClient } from './queryClient'
6
6
  import type {
7
7
  DefaultError,
8
8
  MutateOptions,
9
+ MutationFunctionContext,
9
10
  MutationObserverOptions,
10
11
  MutationObserverResult,
11
12
  } from './types'
@@ -13,8 +14,8 @@ import type { Action, Mutation } from './mutation'
13
14
 
14
15
  // TYPES
15
16
 
16
- type MutationObserverListener<TData, TError, TVariables, TContext> = (
17
- result: MutationObserverResult<TData, TError, TVariables, TContext>,
17
+ type MutationObserverListener<TData, TError, TVariables, TOnMutateResult> = (
18
+ result: MutationObserverResult<TData, TError, TVariables, TOnMutateResult>,
18
19
  ) => void
19
20
 
20
21
  // CLASS
@@ -23,21 +24,30 @@ export class MutationObserver<
23
24
  TData = unknown,
24
25
  TError = DefaultError,
25
26
  TVariables = void,
26
- TContext = unknown,
27
+ TOnMutateResult = unknown,
27
28
  > extends Subscribable<
28
- MutationObserverListener<TData, TError, TVariables, TContext>
29
+ MutationObserverListener<TData, TError, TVariables, TOnMutateResult>
29
30
  > {
30
- options!: MutationObserverOptions<TData, TError, TVariables, TContext>
31
+ options!: MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>
31
32
 
32
33
  #client: QueryClient
33
- #currentResult: MutationObserverResult<TData, TError, TVariables, TContext> =
34
- undefined!
35
- #currentMutation?: Mutation<TData, TError, TVariables, TContext>
36
- #mutateOptions?: MutateOptions<TData, TError, TVariables, TContext>
34
+ #currentResult: MutationObserverResult<
35
+ TData,
36
+ TError,
37
+ TVariables,
38
+ TOnMutateResult
39
+ > = undefined!
40
+ #currentMutation?: Mutation<TData, TError, TVariables, TOnMutateResult>
41
+ #mutateOptions?: MutateOptions<TData, TError, TVariables, TOnMutateResult>
37
42
 
38
43
  constructor(
39
44
  client: QueryClient,
40
- options: MutationObserverOptions<TData, TError, TVariables, TContext>,
45
+ options: MutationObserverOptions<
46
+ TData,
47
+ TError,
48
+ TVariables,
49
+ TOnMutateResult
50
+ >,
41
51
  ) {
42
52
  super()
43
53
 
@@ -53,10 +63,15 @@ export class MutationObserver<
53
63
  }
54
64
 
55
65
  setOptions(
56
- options: MutationObserverOptions<TData, TError, TVariables, TContext>,
66
+ options: MutationObserverOptions<
67
+ TData,
68
+ TError,
69
+ TVariables,
70
+ TOnMutateResult
71
+ >,
57
72
  ) {
58
73
  const prevOptions = this.options as
59
- | MutationObserverOptions<TData, TError, TVariables, TContext>
74
+ | MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>
60
75
  | undefined
61
76
  this.options = this.#client.defaultMutationOptions(options)
62
77
  if (!shallowEqualObjects(this.options, prevOptions)) {
@@ -84,7 +99,9 @@ export class MutationObserver<
84
99
  }
85
100
  }
86
101
 
87
- onMutationUpdate(action: Action<TData, TError, TVariables, TContext>): void {
102
+ onMutationUpdate(
103
+ action: Action<TData, TError, TVariables, TOnMutateResult>,
104
+ ): void {
88
105
  this.#updateResult()
89
106
 
90
107
  this.#notify(action)
@@ -94,7 +111,7 @@ export class MutationObserver<
94
111
  TData,
95
112
  TError,
96
113
  TVariables,
97
- TContext
114
+ TOnMutateResult
98
115
  > {
99
116
  return this.#currentResult
100
117
  }
@@ -110,7 +127,7 @@ export class MutationObserver<
110
127
 
111
128
  mutate(
112
129
  variables: TVariables,
113
- options?: MutateOptions<TData, TError, TVariables, TContext>,
130
+ options?: MutateOptions<TData, TError, TVariables, TOnMutateResult>,
114
131
  ): Promise<TData> {
115
132
  this.#mutateOptions = options
116
133
 
@@ -128,7 +145,7 @@ export class MutationObserver<
128
145
  #updateResult(): void {
129
146
  const state =
130
147
  this.#currentMutation?.state ??
131
- getDefaultState<TData, TError, TVariables, TContext>()
148
+ getDefaultState<TData, TError, TVariables, TOnMutateResult>()
132
149
 
133
150
  this.#currentResult = {
134
151
  ...state,
@@ -138,25 +155,48 @@ export class MutationObserver<
138
155
  isIdle: state.status === 'idle',
139
156
  mutate: this.mutate,
140
157
  reset: this.reset,
141
- } as MutationObserverResult<TData, TError, TVariables, TContext>
158
+ } as MutationObserverResult<TData, TError, TVariables, TOnMutateResult>
142
159
  }
143
160
 
144
- #notify(action?: Action<TData, TError, TVariables, TContext>): void {
161
+ #notify(action?: Action<TData, TError, TVariables, TOnMutateResult>): void {
145
162
  notifyManager.batch(() => {
146
163
  // First trigger the mutate callbacks
147
164
  if (this.#mutateOptions && this.hasListeners()) {
148
165
  const variables = this.#currentResult.variables!
149
- const context = this.#currentResult.context
166
+ const onMutateResult = this.#currentResult.context
167
+
168
+ const context = {
169
+ client: this.#client,
170
+ meta: this.options.meta,
171
+ mutationKey: this.options.mutationKey,
172
+ } satisfies MutationFunctionContext
150
173
 
151
174
  if (action?.type === 'success') {
152
- this.#mutateOptions.onSuccess?.(action.data, variables, context!)
153
- this.#mutateOptions.onSettled?.(action.data, null, variables, context)
175
+ this.#mutateOptions.onSuccess?.(
176
+ action.data,
177
+ variables,
178
+ onMutateResult,
179
+ context,
180
+ )
181
+ this.#mutateOptions.onSettled?.(
182
+ action.data,
183
+ null,
184
+ variables,
185
+ onMutateResult,
186
+ context,
187
+ )
154
188
  } else if (action?.type === 'error') {
155
- this.#mutateOptions.onError?.(action.error, variables, context)
189
+ this.#mutateOptions.onError?.(
190
+ action.error,
191
+ variables,
192
+ onMutateResult,
193
+ context,
194
+ )
156
195
  this.#mutateOptions.onSettled?.(
157
196
  undefined,
158
197
  action.error,
159
198
  variables,
199
+ onMutateResult,
160
200
  context,
161
201
  )
162
202
  }
@@ -118,21 +118,22 @@ export class QueriesObserver<
118
118
  observer.getCurrentResult(),
119
119
  )
120
120
 
121
+ const hasLengthChange = prevObservers.length !== newObservers.length
121
122
  const hasIndexChange = newObservers.some(
122
123
  (observer, index) => observer !== prevObservers[index],
123
124
  )
125
+ const hasStructuralChange = hasLengthChange || hasIndexChange
124
126
 
125
- const hasResultChange =
126
- prevObservers.length === newObservers.length && !hasIndexChange
127
- ? newResult.some((result, index) => {
128
- const prev = this.#result[index]
129
- return !prev || !shallowEqualObjects(result, prev)
130
- })
131
- : true
127
+ const hasResultChange = hasStructuralChange
128
+ ? true
129
+ : newResult.some((result, index) => {
130
+ const prev = this.#result[index]
131
+ return !prev || !shallowEqualObjects(result, prev)
132
+ })
132
133
 
133
- if (!hasIndexChange && !hasResultChange) return
134
+ if (!hasStructuralChange && !hasResultChange) return
134
135
 
135
- if (hasIndexChange) {
136
+ if (hasStructuralChange) {
136
137
  this.#observers = newObservers
137
138
  }
138
139
 
@@ -140,7 +141,7 @@ export class QueriesObserver<
140
141
 
141
142
  if (!this.hasListeners()) return
142
143
 
143
- if (hasIndexChange) {
144
+ if (hasStructuralChange) {
144
145
  difference(prevObservers, newObservers).forEach((observer) => {
145
146
  observer.destroy()
146
147
  })
@@ -512,11 +512,11 @@ export class QueryClient {
512
512
  TData = unknown,
513
513
  TError = DefaultError,
514
514
  TVariables = void,
515
- TContext = unknown,
515
+ TOnMutateResult = unknown,
516
516
  >(
517
517
  mutationKey: MutationKey,
518
518
  options: OmitKeyof<
519
- MutationObserverOptions<TData, TError, TVariables, TContext>,
519
+ MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>,
520
520
  'mutationKey'
521
521
  >,
522
522
  ): void {