Skip to content

Commit b2dfe4f

Browse files
feat(svelte-query): add 'mutationOptions' (#10175)
* feat(svelte-query/mutationOptions): add 'mutationOptions' identity function for type-safe mutation configuration * test(svelte-query/mutationOptions): add type and runtime tests for 'mutationOptions' * docs(svelte-query/mutationOptions): add reference documentation for 'mutationOptions' * chore(svelte-query): add changeset for 'mutationOptions' * ci: apply automated fixes * test(svelte-query/mutationOptions): use 'Accessor' type for props in BaseExample and wrap test values with arrow functions * style(svelte-query/mutationOptions): remove blank lines between 'fireEvent' and assertion blocks * refactor(svelte-query/mutationOptions): split BaseExample into BaseExample and MultiExample for single and multi mutation tests * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent 6af63a7 commit b2dfe4f

File tree

9 files changed

+792
-0
lines changed

9 files changed

+792
-0
lines changed

.changeset/smart-spiders-sing.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@tanstack/svelte-query': minor
3+
---
4+
5+
feat(svelte-query): add 'mutationOptions'

docs/config.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,10 @@
11441144
{
11451145
"label": "Functions / infiniteQueryOptions",
11461146
"to": "framework/svelte/reference/functions/infiniteQueryOptions"
1147+
},
1148+
{
1149+
"label": "Functions / mutationOptions",
1150+
"to": "framework/svelte/reference/functions/mutationOptions"
11471151
}
11481152
]
11491153
},
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
---
2+
id: mutationOptions
3+
title: mutationOptions
4+
---
5+
6+
# Function: mutationOptions()
7+
8+
## Call Signature
9+
10+
```ts
11+
function mutationOptions<TData, TError, TVariables, TOnMutateResult>(options): WithRequired<CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>, 'mutationKey'>
12+
```
13+
14+
Defined in: [packages/svelte-query/src/mutationOptions.ts](https://github.com/TanStack/query/blob/main/packages/svelte-query/src/mutationOptions.ts)
15+
16+
### Type Parameters
17+
18+
#### TData
19+
20+
`TData` = `unknown`
21+
22+
#### TError
23+
24+
`TError` = `Error`
25+
26+
#### TVariables
27+
28+
`TVariables` = `void`
29+
30+
#### TOnMutateResult
31+
32+
`TOnMutateResult` = `unknown`
33+
34+
### Parameters
35+
36+
#### options
37+
38+
`WithRequired`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\>
39+
40+
### Returns
41+
42+
`WithRequired`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\>
43+
44+
## Call Signature
45+
46+
```ts
47+
function mutationOptions<TData, TError, TVariables, TOnMutateResult>(options): Omit<CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>, 'mutationKey'>
48+
```
49+
50+
Defined in: [packages/svelte-query/src/mutationOptions.ts](https://github.com/TanStack/query/blob/main/packages/svelte-query/src/mutationOptions.ts)
51+
52+
### Type Parameters
53+
54+
#### TData
55+
56+
`TData` = `unknown`
57+
58+
#### TError
59+
60+
`TError` = `Error`
61+
62+
#### TVariables
63+
64+
`TVariables` = `void`
65+
66+
#### TOnMutateResult
67+
68+
`TOnMutateResult` = `unknown`
69+
70+
### Parameters
71+
72+
#### options
73+
74+
`Omit`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\>
75+
76+
### Returns
77+
78+
`Omit`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\>

packages/svelte-query/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export { queryOptions } from './queryOptions.js'
1717
export { createQueries } from './createQueries.svelte.js'
1818
export { createInfiniteQuery } from './createInfiniteQuery.js'
1919
export { infiniteQueryOptions } from './infiniteQueryOptions.js'
20+
export { mutationOptions } from './mutationOptions.js'
2021
export { createMutation } from './createMutation.svelte.js'
2122
export { useMutationState } from './useMutationState.svelte.js'
2223
export { useQueryClient } from './useQueryClient.js'
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import type { DefaultError, WithRequired } from '@tanstack/query-core'
2+
import type { CreateMutationOptions } from './types.js'
3+
4+
export function mutationOptions<
5+
TData = unknown,
6+
TError = DefaultError,
7+
TVariables = void,
8+
TOnMutateResult = unknown,
9+
>(
10+
options: WithRequired<
11+
CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
12+
'mutationKey'
13+
>,
14+
): WithRequired<
15+
CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
16+
'mutationKey'
17+
>
18+
export function mutationOptions<
19+
TData = unknown,
20+
TError = DefaultError,
21+
TVariables = void,
22+
TOnMutateResult = unknown,
23+
>(
24+
options: Omit<
25+
CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
26+
'mutationKey'
27+
>,
28+
): Omit<
29+
CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
30+
'mutationKey'
31+
>
32+
export function mutationOptions<
33+
TData = unknown,
34+
TError = DefaultError,
35+
TVariables = void,
36+
TOnMutateResult = unknown,
37+
>(
38+
options: CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
39+
): CreateMutationOptions<TData, TError, TVariables, TOnMutateResult> {
40+
return options
41+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<script lang="ts">
2+
import { QueryClient } from '@tanstack/query-core'
3+
import {
4+
createMutation,
5+
setQueryClientContext,
6+
useIsMutating,
7+
useMutationState,
8+
} from '../../src/index.js'
9+
import type {
10+
Accessor,
11+
CreateMutationOptions,
12+
MutationStateOptions,
13+
} from '../../src/index.js'
14+
import type { MutationFilters } from '@tanstack/query-core'
15+
16+
let {
17+
mutationOpts,
18+
isMutatingFilters,
19+
mutationStateOpts,
20+
}: {
21+
mutationOpts: Accessor<CreateMutationOptions<string, Error, void, unknown>>
22+
isMutatingFilters?: MutationFilters
23+
mutationStateOpts?: MutationStateOptions
24+
} = $props()
25+
26+
const queryClient = new QueryClient()
27+
setQueryClientContext(queryClient)
28+
29+
const mutation = createMutation(mutationOpts)
30+
const isMutating = useIsMutating(isMutatingFilters)
31+
const mutationState = useMutationState(mutationStateOpts)
32+
33+
let clientIsMutating = $state(0)
34+
35+
$effect(() => {
36+
const mutationCache = queryClient.getMutationCache()
37+
clientIsMutating = isMutatingFilters
38+
? queryClient.isMutating(isMutatingFilters)
39+
: queryClient.isMutating()
40+
41+
const unsubscribe = mutationCache.subscribe(() => {
42+
clientIsMutating = isMutatingFilters
43+
? queryClient.isMutating(isMutatingFilters)
44+
: queryClient.isMutating()
45+
})
46+
47+
return unsubscribe
48+
})
49+
</script>
50+
51+
<button onclick={() => mutation.mutate()}>mutate</button>
52+
53+
<div>isMutating: {isMutating.current}</div>
54+
<div>clientIsMutating: {clientIsMutating}</div>
55+
<div>
56+
mutationState: {JSON.stringify(mutationState.map((state) => state.data))}
57+
</div>
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<script lang="ts">
2+
import { QueryClient } from '@tanstack/query-core'
3+
import {
4+
createMutation,
5+
setQueryClientContext,
6+
useIsMutating,
7+
useMutationState,
8+
} from '../../src/index.js'
9+
import type {
10+
Accessor,
11+
CreateMutationOptions,
12+
MutationStateOptions,
13+
} from '../../src/index.js'
14+
import type { MutationFilters } from '@tanstack/query-core'
15+
16+
let {
17+
mutationOpts1,
18+
mutationOpts2,
19+
isMutatingFilters,
20+
mutationStateOpts,
21+
}: {
22+
mutationOpts1: Accessor<CreateMutationOptions<string, Error, void, unknown>>
23+
mutationOpts2: Accessor<CreateMutationOptions<string, Error, void, unknown>>
24+
isMutatingFilters?: MutationFilters
25+
mutationStateOpts?: MutationStateOptions
26+
} = $props()
27+
28+
const queryClient = new QueryClient()
29+
setQueryClientContext(queryClient)
30+
31+
const mutation1 = createMutation(mutationOpts1)
32+
const mutation2 = createMutation(mutationOpts2)
33+
const isMutating = useIsMutating(isMutatingFilters)
34+
const mutationState = useMutationState(mutationStateOpts)
35+
36+
let clientIsMutating = $state(0)
37+
38+
$effect(() => {
39+
const mutationCache = queryClient.getMutationCache()
40+
clientIsMutating = isMutatingFilters
41+
? queryClient.isMutating(isMutatingFilters)
42+
: queryClient.isMutating()
43+
44+
const unsubscribe = mutationCache.subscribe(() => {
45+
clientIsMutating = isMutatingFilters
46+
? queryClient.isMutating(isMutatingFilters)
47+
: queryClient.isMutating()
48+
})
49+
50+
return unsubscribe
51+
})
52+
</script>
53+
54+
<button onclick={() => mutation1.mutate()}>mutate1</button>
55+
<button onclick={() => mutation2.mutate()}>mutate2</button>
56+
57+
<div>isMutating: {isMutating.current}</div>
58+
<div>clientIsMutating: {clientIsMutating}</div>
59+
<div>
60+
mutationState: {JSON.stringify(mutationState.map((state) => state.data))}
61+
</div>

0 commit comments

Comments
 (0)