Skip to content
Open
5 changes: 5 additions & 0 deletions .changeset/smart-spiders-sing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/svelte-query': minor
---

feat(svelte-query): add 'mutationOptions'
4 changes: 4 additions & 0 deletions docs/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -1140,6 +1140,10 @@
{
"label": "Functions / infiniteQueryOptions",
"to": "framework/svelte/reference/functions/infiniteQueryOptions"
},
{
"label": "Functions / mutationOptions",
"to": "framework/svelte/reference/functions/mutationOptions"
}
]
},
Expand Down
78 changes: 78 additions & 0 deletions docs/framework/svelte/reference/functions/mutationOptions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
---
id: mutationOptions
title: mutationOptions
---

# Function: mutationOptions()

## Call Signature

```ts
function mutationOptions<TData, TError, TVariables, TOnMutateResult>(options): WithRequired<CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>, 'mutationKey'>
```

Defined in: [packages/svelte-query/src/mutationOptions.ts](https://github.com/TanStack/query/blob/main/packages/svelte-query/src/mutationOptions.ts)

### Type Parameters

#### TData

`TData` = `unknown`

#### TError

`TError` = `Error`

#### TVariables

`TVariables` = `void`

#### TOnMutateResult

`TOnMutateResult` = `unknown`

### Parameters

#### options

`WithRequired`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\>

### Returns

`WithRequired`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\>

## Call Signature

```ts
function mutationOptions<TData, TError, TVariables, TOnMutateResult>(options): Omit<CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>, 'mutationKey'>
```
Comment on lines +8 to +48
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Resolve duplicate "Call Signature" headings (MD024 warning).

Rename the headings to distinguish the overloads and avoid markdownlint warnings.

📝 Suggested heading tweak
-## Call Signature
+## Call Signature (with mutationKey)
@@
-## Call Signature
+## Call Signature (without mutationKey)
🧰 Tools
🪛 LanguageTool

[grammar] ~18-~18: Ensure spelling is correct
Context: ...nOptions.ts) ### Type Parameters #### TData TData = unknown #### TError TError = `E...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~26-~26: Ensure spelling is correct
Context: ... #### TError TError = Error #### TVariables TVariables = void #### TOnMutateResult `TOnMut...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~30-~30: Ensure spelling is correct
Context: ...TVariables TVariables = void #### TOnMutateResult TOnMutateResult = unknown ### Parameters #### optio...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🪛 markdownlint-cli2 (0.21.0)

[warning] 44-44: Multiple headings with the same content

(MD024, no-duplicate-heading)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/framework/svelte/reference/functions/mutationOptions.md` around lines 8
- 48, The doc has duplicated "Call Signature" headings for the overloads of the
mutationOptions function causing MD024; update the two headings so they are
distinct (e.g., "Call Signature — Required mutationKey overload" and "Call
Signature — Omitted mutationKey overload" or similar) to describe each overload
clearly; locate the two headings around the mutationOptions function declaration
and CreateMutationOptions/mutationKey references and rename them to avoid
duplicate top-level headings while keeping the linked type references intact.


Defined in: [packages/svelte-query/src/mutationOptions.ts](https://github.com/TanStack/query/blob/main/packages/svelte-query/src/mutationOptions.ts)

### Type Parameters

#### TData

`TData` = `unknown`

#### TError

`TError` = `Error`

#### TVariables

`TVariables` = `void`

#### TOnMutateResult

`TOnMutateResult` = `unknown`

### Parameters

#### options

`Omit`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\>

### Returns

`Omit`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\>
1 change: 1 addition & 0 deletions packages/svelte-query/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export { queryOptions } from './queryOptions.js'
export { createQueries } from './createQueries.svelte.js'
export { createInfiniteQuery } from './createInfiniteQuery.js'
export { infiniteQueryOptions } from './infiniteQueryOptions.js'
export { mutationOptions } from './mutationOptions.js'
export { createMutation } from './createMutation.svelte.js'
export { useMutationState } from './useMutationState.svelte.js'
export { useQueryClient } from './useQueryClient.js'
Expand Down
41 changes: 41 additions & 0 deletions packages/svelte-query/src/mutationOptions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import type { DefaultError, WithRequired } from '@tanstack/query-core'
import type { CreateMutationOptions } from './types.js'

export function mutationOptions<
TData = unknown,
TError = DefaultError,
TVariables = void,
TOnMutateResult = unknown,
>(
options: WithRequired<
CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
'mutationKey'
>,
): WithRequired<
CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
'mutationKey'
>
export function mutationOptions<
TData = unknown,
TError = DefaultError,
TVariables = void,
TOnMutateResult = unknown,
>(
options: Omit<
CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
'mutationKey'
>,
): Omit<
CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
'mutationKey'
>
export function mutationOptions<
TData = unknown,
TError = DefaultError,
TVariables = void,
TOnMutateResult = unknown,
>(
options: CreateMutationOptions<TData, TError, TVariables, TOnMutateResult>,
): CreateMutationOptions<TData, TError, TVariables, TOnMutateResult> {
return options
}
57 changes: 57 additions & 0 deletions packages/svelte-query/tests/mutationOptions/BaseExample.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<script lang="ts">
import { QueryClient } from '@tanstack/query-core'
import {
createMutation,
setQueryClientContext,
useIsMutating,
useMutationState,
} from '../../src/index.js'
import type {
Accessor,
CreateMutationOptions,
MutationStateOptions,
} from '../../src/index.js'
import type { MutationFilters } from '@tanstack/query-core'
let {
mutationOpts,
isMutatingFilters,
mutationStateOpts,
}: {
mutationOpts: Accessor<CreateMutationOptions<string, Error, void, unknown>>
isMutatingFilters?: MutationFilters
mutationStateOpts?: MutationStateOptions
} = $props()
const queryClient = new QueryClient()
setQueryClientContext(queryClient)
const mutation = createMutation(mutationOpts)
const isMutating = useIsMutating(isMutatingFilters)
const mutationState = useMutationState(mutationStateOpts)
let clientIsMutating = $state(0)
$effect(() => {
const mutationCache = queryClient.getMutationCache()
clientIsMutating = isMutatingFilters
? queryClient.isMutating(isMutatingFilters)
: queryClient.isMutating()
const unsubscribe = mutationCache.subscribe(() => {
clientIsMutating = isMutatingFilters
? queryClient.isMutating(isMutatingFilters)
: queryClient.isMutating()
})
return unsubscribe
})
</script>

<button onclick={() => mutation.mutate()}>mutate</button>

<div>isMutating: {isMutating.current}</div>
<div>clientIsMutating: {clientIsMutating}</div>
<div>
mutationState: {JSON.stringify(mutationState.map((state) => state.data))}
</div>
61 changes: 61 additions & 0 deletions packages/svelte-query/tests/mutationOptions/MultiExample.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<script lang="ts">
import { QueryClient } from '@tanstack/query-core'
import {
createMutation,
setQueryClientContext,
useIsMutating,
useMutationState,
} from '../../src/index.js'
import type {
Accessor,
CreateMutationOptions,
MutationStateOptions,
} from '../../src/index.js'
import type { MutationFilters } from '@tanstack/query-core'

let {
mutationOpts1,
mutationOpts2,
isMutatingFilters,
mutationStateOpts,
}: {
mutationOpts1: Accessor<CreateMutationOptions<string, Error, void, unknown>>
mutationOpts2: Accessor<CreateMutationOptions<string, Error, void, unknown>>
isMutatingFilters?: MutationFilters
mutationStateOpts?: MutationStateOptions
} = $props()

const queryClient = new QueryClient()
setQueryClientContext(queryClient)

const mutation1 = createMutation(mutationOpts1)
const mutation2 = createMutation(mutationOpts2)
const isMutating = useIsMutating(isMutatingFilters)
const mutationState = useMutationState(mutationStateOpts)

let clientIsMutating = $state(0)

$effect(() => {
const mutationCache = queryClient.getMutationCache()
clientIsMutating = isMutatingFilters
? queryClient.isMutating(isMutatingFilters)
: queryClient.isMutating()

const unsubscribe = mutationCache.subscribe(() => {
clientIsMutating = isMutatingFilters
? queryClient.isMutating(isMutatingFilters)
: queryClient.isMutating()
})

return unsubscribe
})
</script>

<button onclick={() => mutation1.mutate()}>mutate1</button>
<button onclick={() => mutation2.mutate()}>mutate2</button>

<div>isMutating: {isMutating.current}</div>
<div>clientIsMutating: {clientIsMutating}</div>
<div>
mutationState: {JSON.stringify(mutationState.map((state) => state.data))}
</div>
Loading
Loading