From 39e555207c4533e232531959569ccf0867066c19 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 24 Feb 2026 02:48:22 +0900 Subject: [PATCH 1/9] feat(svelte-query/mutationOptions): add 'mutationOptions' identity function for type-safe mutation configuration --- packages/svelte-query/src/index.ts | 1 + packages/svelte-query/src/mutationOptions.ts | 41 ++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 packages/svelte-query/src/mutationOptions.ts diff --git a/packages/svelte-query/src/index.ts b/packages/svelte-query/src/index.ts index 1b74a9be912..dfd6b86cee9 100644 --- a/packages/svelte-query/src/index.ts +++ b/packages/svelte-query/src/index.ts @@ -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' diff --git a/packages/svelte-query/src/mutationOptions.ts b/packages/svelte-query/src/mutationOptions.ts new file mode 100644 index 00000000000..7f967804a04 --- /dev/null +++ b/packages/svelte-query/src/mutationOptions.ts @@ -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, + 'mutationKey' + >, +): WithRequired< + CreateMutationOptions, + 'mutationKey' +> +export function mutationOptions< + TData = unknown, + TError = DefaultError, + TVariables = void, + TOnMutateResult = unknown, +>( + options: Omit< + CreateMutationOptions, + 'mutationKey' + >, +): Omit< + CreateMutationOptions, + 'mutationKey' +> +export function mutationOptions< + TData = unknown, + TError = DefaultError, + TVariables = void, + TOnMutateResult = unknown, +>( + options: CreateMutationOptions, +): CreateMutationOptions { + return options +} From fcb54ce9a9b268afb587e0a511daaed0b8519f09 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 24 Feb 2026 02:48:34 +0900 Subject: [PATCH 2/9] test(svelte-query/mutationOptions): add type and runtime tests for 'mutationOptions' --- .../tests/mutationOptions/BaseExample.svelte | 64 ++++ .../mutationOptions.svelte.test.ts | 340 ++++++++++++++++++ .../mutationOptions/mutationOptions.test-d.ts | 224 ++++++++++++ 3 files changed, 628 insertions(+) create mode 100644 packages/svelte-query/tests/mutationOptions/BaseExample.svelte create mode 100644 packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts create mode 100644 packages/svelte-query/tests/mutationOptions/mutationOptions.test-d.ts diff --git a/packages/svelte-query/tests/mutationOptions/BaseExample.svelte b/packages/svelte-query/tests/mutationOptions/BaseExample.svelte new file mode 100644 index 00000000000..bc4b7885b77 --- /dev/null +++ b/packages/svelte-query/tests/mutationOptions/BaseExample.svelte @@ -0,0 +1,64 @@ + + + +{#if mutation2} + +{/if} + +
isMutating: {isMutating.current}
+
clientIsMutating: {clientIsMutating}
+
+ mutationState: {JSON.stringify(mutationState.map((state) => state.data))} +
diff --git a/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts new file mode 100644 index 00000000000..e5a0983e9b0 --- /dev/null +++ b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts @@ -0,0 +1,340 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { fireEvent, render } from '@testing-library/svelte' +import { sleep } from '@tanstack/query-test-utils' +import { mutationOptions } from '../../src/index.js' +import BaseExample from './BaseExample.svelte' + +describe('mutationOptions', () => { + beforeEach(() => { + vi.useFakeTimers() + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('should return the object received as a parameter without any modification (with mutationKey in mutationOptions)', () => { + const object = { + mutationKey: ['key'], + mutationFn: () => sleep(10).then(() => 5), + } as const + + expect(mutationOptions(object)).toStrictEqual(object) + }) + + it('should return the object received as a parameter without any modification (without mutationKey in mutationOptions)', () => { + const object = { + mutationFn: () => sleep(10).then(() => 5), + } as const + + expect(mutationOptions(object)).toStrictEqual(object) + }) + + it('should return the number of fetching mutations when used with useIsMutating (with mutationKey in mutationOptions)', async () => { + const mutationOpts = mutationOptions({ + mutationKey: ['key'], + mutationFn: () => sleep(50).then(() => 'data'), + }) + + const rendered = render(BaseExample, { + props: { mutationOpts1: mutationOpts }, + }) + + expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('isMutating: 1')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(51) + expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() + }) + + it('should return the number of fetching mutations when used with useIsMutating (without mutationKey in mutationOptions)', async () => { + const mutationOpts = mutationOptions({ + mutationFn: () => sleep(50).then(() => 'data'), + }) + + const rendered = render(BaseExample, { + props: { mutationOpts1: mutationOpts }, + }) + + expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('isMutating: 1')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(51) + expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() + }) + + it('should return the number of fetching mutations when used with useIsMutating', async () => { + const mutationOpts1 = mutationOptions({ + mutationKey: ['key'], + mutationFn: () => sleep(50).then(() => 'data1'), + }) + const mutationOpts2 = mutationOptions({ + mutationFn: () => sleep(50).then(() => 'data2'), + }) + + const rendered = render(BaseExample, { + props: { mutationOpts1, mutationOpts2 }, + }) + + expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('isMutating: 2')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(51) + expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() + }) + + it('should return the number of fetching mutations when used with useIsMutating (filter mutationOpts1.mutationKey)', async () => { + const mutationOpts1 = mutationOptions({ + mutationKey: ['key'], + mutationFn: () => sleep(50).then(() => 'data1'), + }) + const mutationOpts2 = mutationOptions({ + mutationFn: () => sleep(50).then(() => 'data2'), + }) + + const rendered = render(BaseExample, { + props: { + mutationOpts1, + mutationOpts2, + isMutatingFilters: { mutationKey: mutationOpts1.mutationKey }, + }, + }) + + expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('isMutating: 1')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(51) + expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() + }) + + it('should return the number of fetching mutations when used with queryClient.isMutating (with mutationKey in mutationOptions)', async () => { + const mutationOpts = mutationOptions({ + mutationKey: ['mutation'], + mutationFn: () => sleep(500).then(() => 'data'), + }) + + const rendered = render(BaseExample, { + props: { + mutationOpts1: mutationOpts, + isMutatingFilters: { mutationKey: mutationOpts.mutationKey }, + }, + }) + + expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('clientIsMutating: 1')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(501) + expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() + }) + + it('should return the number of fetching mutations when used with queryClient.isMutating (without mutationKey in mutationOptions)', async () => { + const mutationOpts = mutationOptions({ + mutationFn: () => sleep(500).then(() => 'data'), + }) + + const rendered = render(BaseExample, { + props: { mutationOpts1: mutationOpts }, + }) + + expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('clientIsMutating: 1')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(501) + expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() + }) + + it('should return the number of fetching mutations when used with queryClient.isMutating', async () => { + const mutationOpts1 = mutationOptions({ + mutationKey: ['mutation'], + mutationFn: () => sleep(500).then(() => 'data1'), + }) + const mutationOpts2 = mutationOptions({ + mutationFn: () => sleep(500).then(() => 'data2'), + }) + + const rendered = render(BaseExample, { + props: { mutationOpts1, mutationOpts2 }, + }) + + expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('clientIsMutating: 2')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(501) + expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() + }) + + it('should return the number of fetching mutations when used with queryClient.isMutating (filter mutationOpts1.mutationKey)', async () => { + const mutationOpts1 = mutationOptions({ + mutationKey: ['mutation'], + mutationFn: () => sleep(500).then(() => 'data1'), + }) + const mutationOpts2 = mutationOptions({ + mutationFn: () => sleep(500).then(() => 'data2'), + }) + + const rendered = render(BaseExample, { + props: { + mutationOpts1, + mutationOpts2, + isMutatingFilters: { mutationKey: mutationOpts1.mutationKey }, + }, + }) + + expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('clientIsMutating: 1')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(501) + expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() + }) + + it('should return mutation states when used with useMutationState (with mutationKey in mutationOptions)', async () => { + const mutationOpts = mutationOptions({ + mutationKey: ['mutation'], + mutationFn: () => sleep(10).then(() => 'data'), + }) + + const rendered = render(BaseExample, { + props: { + mutationOpts1: mutationOpts, + mutationStateOpts: { + filters: { + mutationKey: mutationOpts.mutationKey, + status: 'success', + }, + }, + }, + }) + + expect(rendered.getByText('mutationState: []')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + + await vi.advanceTimersByTimeAsync(11) + expect( + rendered.getByText('mutationState: ["data"]'), + ).toBeInTheDocument() + }) + + it('should return mutation states when used with useMutationState (without mutationKey in mutationOptions)', async () => { + const mutationOpts = mutationOptions({ + mutationFn: () => sleep(10).then(() => 'data'), + }) + + const rendered = render(BaseExample, { + props: { + mutationOpts1: mutationOpts, + mutationStateOpts: { + filters: { status: 'success' }, + }, + }, + }) + + expect(rendered.getByText('mutationState: []')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + + await vi.advanceTimersByTimeAsync(11) + expect( + rendered.getByText('mutationState: ["data"]'), + ).toBeInTheDocument() + }) + + it('should return mutation states when used with useMutationState', async () => { + const mutationOpts1 = mutationOptions({ + mutationKey: ['mutation'], + mutationFn: () => sleep(10).then(() => 'data1'), + }) + const mutationOpts2 = mutationOptions({ + mutationFn: () => sleep(10).then(() => 'data2'), + }) + + const rendered = render(BaseExample, { + props: { + mutationOpts1, + mutationOpts2, + mutationStateOpts: { + filters: { status: 'success' }, + }, + }, + }) + + expect(rendered.getByText('mutationState: []')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) + + await vi.advanceTimersByTimeAsync(11) + expect( + rendered.getByText('mutationState: ["data1","data2"]'), + ).toBeInTheDocument() + }) + + it('should return mutation states when used with useMutationState (filter mutationOpts1.mutationKey)', async () => { + const mutationOpts1 = mutationOptions({ + mutationKey: ['mutation'], + mutationFn: () => sleep(10).then(() => 'data1'), + }) + const mutationOpts2 = mutationOptions({ + mutationFn: () => sleep(10).then(() => 'data2'), + }) + + const rendered = render(BaseExample, { + props: { + mutationOpts1, + mutationOpts2, + mutationStateOpts: { + filters: { + mutationKey: mutationOpts1.mutationKey, + status: 'success', + }, + }, + }, + }) + + expect(rendered.getByText('mutationState: []')).toBeInTheDocument() + + fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) + + await vi.advanceTimersByTimeAsync(11) + expect( + rendered.getByText('mutationState: ["data1"]'), + ).toBeInTheDocument() + }) +}) diff --git a/packages/svelte-query/tests/mutationOptions/mutationOptions.test-d.ts b/packages/svelte-query/tests/mutationOptions/mutationOptions.test-d.ts new file mode 100644 index 00000000000..cbeddf921ba --- /dev/null +++ b/packages/svelte-query/tests/mutationOptions/mutationOptions.test-d.ts @@ -0,0 +1,224 @@ +import { assertType, describe, expectTypeOf, test } from 'vitest' +import { QueryClient } from '@tanstack/query-core' +import { + createMutation, + mutationOptions, + useIsMutating, + useMutationState, +} from '../../src/index.js' +import type { + DefaultError, + MutationFunctionContext, + MutationState, + WithRequired, +} from '@tanstack/query-core' +import type { + CreateMutationOptions, + CreateMutationResult, +} from '../../src/types.js' + +describe('mutationOptions', () => { + test('Should not allow excess properties', () => { + // @ts-expect-error this is a good error, because onMutates does not exist! + mutationOptions({ + mutationFn: () => Promise.resolve(5), + mutationKey: ['key'], + onMutates: 1000, + onSuccess: (data) => { + expectTypeOf(data).toEqualTypeOf() + }, + }) + }) + + test('Should infer types for callbacks', () => { + mutationOptions({ + mutationFn: () => Promise.resolve(5), + mutationKey: ['key'], + onSuccess: (data) => { + expectTypeOf(data).toEqualTypeOf() + }, + }) + }) + + test('Should infer types for onError callback', () => { + mutationOptions({ + mutationFn: () => { + throw new Error('fail') + }, + mutationKey: ['key'], + onError: (error) => { + expectTypeOf(error).toEqualTypeOf() + }, + }) + }) + + test('Should infer types for variables', () => { + mutationOptions({ + mutationFn: (vars) => { + expectTypeOf(vars).toEqualTypeOf<{ id: string }>() + return Promise.resolve(5) + }, + mutationKey: ['with-vars'], + }) + }) + + test('Should infer result type correctly', () => { + mutationOptions({ + mutationFn: () => Promise.resolve(5), + mutationKey: ['key'], + onMutate: () => { + return { name: 'onMutateResult' } + }, + onSuccess: (_data, _variables, onMutateResult) => { + expectTypeOf(onMutateResult).toEqualTypeOf<{ name: string }>() + }, + }) + }) + + test('Should infer context type correctly', () => { + mutationOptions({ + mutationFn: (_variables, context) => { + expectTypeOf(context).toEqualTypeOf() + return Promise.resolve(5) + }, + mutationKey: ['key'], + onMutate: (_variables, context) => { + expectTypeOf(context).toEqualTypeOf() + }, + onSuccess: (_data, _variables, _onMutateResult, context) => { + expectTypeOf(context).toEqualTypeOf() + }, + onError: (_error, _variables, _onMutateResult, context) => { + expectTypeOf(context).toEqualTypeOf() + }, + onSettled: (_data, _error, _variables, _onMutateResult, context) => { + expectTypeOf(context).toEqualTypeOf() + }, + }) + }) + + test('Should error if mutationFn return type mismatches TData', () => { + assertType( + mutationOptions({ + // @ts-expect-error this is a good error, because return type is string, not number + mutationFn: async () => Promise.resolve('wrong return'), + }), + ) + }) + + test('Should allow mutationKey to be omitted', () => { + return mutationOptions({ + mutationFn: () => Promise.resolve(123), + onSuccess: (data) => { + expectTypeOf(data).toEqualTypeOf() + }, + }) + }) + + test('Should infer all types when not explicitly provided', () => { + expectTypeOf( + mutationOptions({ + mutationFn: (id: string) => Promise.resolve(id.length), + mutationKey: ['key'], + onSuccess: (data) => { + expectTypeOf(data).toEqualTypeOf() + }, + }), + ).toEqualTypeOf< + WithRequired< + CreateMutationOptions, + 'mutationKey' + > + >() + expectTypeOf( + mutationOptions({ + mutationFn: (id: string) => Promise.resolve(id.length), + onSuccess: (data) => { + expectTypeOf(data).toEqualTypeOf() + }, + }), + ).toEqualTypeOf< + Omit, 'mutationKey'> + >() + }) + + test('Should work when used with createMutation', () => { + const mutation = createMutation(() => + mutationOptions({ + mutationKey: ['key'], + mutationFn: () => Promise.resolve('data'), + onSuccess: (data) => { + expectTypeOf(data).toEqualTypeOf() + }, + }), + ) + expectTypeOf(mutation).toEqualTypeOf< + CreateMutationResult + >() + + createMutation(() => + // should allow when used with createMutation without mutationKey + mutationOptions({ + mutationFn: () => Promise.resolve('data'), + onSuccess: (data) => { + expectTypeOf(data).toEqualTypeOf() + }, + }), + ) + }) + + test('Should work when used with useIsMutating', () => { + const isMutating = useIsMutating( + mutationOptions({ + mutationKey: ['key'], + mutationFn: () => Promise.resolve(5), + }), + ) + expectTypeOf(isMutating.current).toEqualTypeOf() + + useIsMutating( + // @ts-expect-error filters should have mutationKey + mutationOptions({ + mutationFn: () => Promise.resolve(5), + }), + ) + }) + + test('Should work when used with queryClient.isMutating', () => { + const queryClient = new QueryClient() + + const isMutating = queryClient.isMutating( + mutationOptions({ + mutationKey: ['key'], + mutationFn: () => Promise.resolve(5), + }), + ) + expectTypeOf(isMutating).toEqualTypeOf() + + queryClient.isMutating( + // @ts-expect-error filters should have mutationKey + mutationOptions({ + mutationFn: () => Promise.resolve(5), + }), + ) + }) + + test('Should work when used with useMutationState', () => { + const mutationState = useMutationState({ + filters: mutationOptions({ + mutationKey: ['key'], + mutationFn: () => Promise.resolve(5), + }), + }) + expectTypeOf(mutationState).toEqualTypeOf< + Array> + >() + + useMutationState({ + // @ts-expect-error filters should have mutationKey + filters: mutationOptions({ + mutationFn: () => Promise.resolve(5), + }), + }) + }) +}) From 7043b320135bd3e5223dac9e7449fda9c8572259 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 24 Feb 2026 02:48:39 +0900 Subject: [PATCH 3/9] docs(svelte-query/mutationOptions): add reference documentation for 'mutationOptions' --- docs/config.json | 4 + .../reference/functions/mutationOptions.md | 78 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 docs/framework/svelte/reference/functions/mutationOptions.md diff --git a/docs/config.json b/docs/config.json index d905826fb49..bfdcf8790f6 100644 --- a/docs/config.json +++ b/docs/config.json @@ -1140,6 +1140,10 @@ { "label": "Functions / infiniteQueryOptions", "to": "framework/svelte/reference/functions/infiniteQueryOptions" + }, + { + "label": "Functions / mutationOptions", + "to": "framework/svelte/reference/functions/mutationOptions" } ] }, diff --git a/docs/framework/svelte/reference/functions/mutationOptions.md b/docs/framework/svelte/reference/functions/mutationOptions.md new file mode 100644 index 00000000000..ba6aa257cb4 --- /dev/null +++ b/docs/framework/svelte/reference/functions/mutationOptions.md @@ -0,0 +1,78 @@ +--- +id: mutationOptions +title: mutationOptions +--- + +# Function: mutationOptions() + +## Call Signature + +```ts +function mutationOptions(options): WithRequired, '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(options): Omit, '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 + +`Omit`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\> + +### Returns + +`Omit`\<[`CreateMutationOptions`](../type-aliases/CreateMutationOptions.md)\<`TData`, `TError`, `TVariables`, `TOnMutateResult`\>, `'mutationKey'`\> From 361ae41f1a743a6d8a5ccafbff9c6795b16c5358 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 24 Feb 2026 02:50:23 +0900 Subject: [PATCH 4/9] chore(svelte-query): add changeset for 'mutationOptions' --- .changeset/smart-spiders-sing.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/smart-spiders-sing.md diff --git a/.changeset/smart-spiders-sing.md b/.changeset/smart-spiders-sing.md new file mode 100644 index 00000000000..c98d04cd144 --- /dev/null +++ b/.changeset/smart-spiders-sing.md @@ -0,0 +1,5 @@ +--- +'@tanstack/svelte-query': minor +--- + +feat(svelte-query): add 'mutationOptions' From 0cf934cbc94b0f08f30f0356ba63e874025d1fe5 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 17:52:30 +0000 Subject: [PATCH 5/9] ci: apply automated fixes --- .../mutationOptions/mutationOptions.svelte.test.ts | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts index e5a0983e9b0..06008eb5391 100644 --- a/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts +++ b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts @@ -246,9 +246,7 @@ describe('mutationOptions', () => { fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) await vi.advanceTimersByTimeAsync(11) - expect( - rendered.getByText('mutationState: ["data"]'), - ).toBeInTheDocument() + expect(rendered.getByText('mutationState: ["data"]')).toBeInTheDocument() }) it('should return mutation states when used with useMutationState (without mutationKey in mutationOptions)', async () => { @@ -270,9 +268,7 @@ describe('mutationOptions', () => { fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) await vi.advanceTimersByTimeAsync(11) - expect( - rendered.getByText('mutationState: ["data"]'), - ).toBeInTheDocument() + expect(rendered.getByText('mutationState: ["data"]')).toBeInTheDocument() }) it('should return mutation states when used with useMutationState', async () => { @@ -333,8 +329,6 @@ describe('mutationOptions', () => { fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) await vi.advanceTimersByTimeAsync(11) - expect( - rendered.getByText('mutationState: ["data1"]'), - ).toBeInTheDocument() + expect(rendered.getByText('mutationState: ["data1"]')).toBeInTheDocument() }) }) From 50480116b10b0a082e91eac7084dc99fbbe964f8 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 24 Feb 2026 03:05:34 +0900 Subject: [PATCH 6/9] test(svelte-query/mutationOptions): use 'Accessor' type for props in BaseExample and wrap test values with arrow functions --- .../tests/mutationOptions/BaseExample.svelte | 13 ++++--- .../mutationOptions.svelte.test.ts | 38 +++++++++++-------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/packages/svelte-query/tests/mutationOptions/BaseExample.svelte b/packages/svelte-query/tests/mutationOptions/BaseExample.svelte index bc4b7885b77..30be3b33d89 100644 --- a/packages/svelte-query/tests/mutationOptions/BaseExample.svelte +++ b/packages/svelte-query/tests/mutationOptions/BaseExample.svelte @@ -7,6 +7,7 @@ useMutationState, } from '../../src/index.js' import type { + Accessor, CreateMutationOptions, MutationStateOptions, } from '../../src/index.js' @@ -18,8 +19,10 @@ isMutatingFilters, mutationStateOpts, }: { - mutationOpts1: CreateMutationOptions - mutationOpts2?: CreateMutationOptions + mutationOpts1: Accessor> + mutationOpts2?: Accessor< + CreateMutationOptions + > isMutatingFilters?: MutationFilters mutationStateOpts?: MutationStateOptions } = $props() @@ -27,10 +30,8 @@ const queryClient = new QueryClient() setQueryClientContext(queryClient) - const mutation1 = createMutation(() => mutationOpts1) - const mutation2 = mutationOpts2 - ? createMutation(() => mutationOpts2!) - : undefined + const mutation1 = createMutation(mutationOpts1) + const mutation2 = mutationOpts2 ? createMutation(mutationOpts2) : undefined const isMutating = useIsMutating(isMutatingFilters) const mutationState = useMutationState(mutationStateOpts) diff --git a/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts index 06008eb5391..852a030bd71 100644 --- a/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts +++ b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts @@ -37,7 +37,7 @@ describe('mutationOptions', () => { }) const rendered = render(BaseExample, { - props: { mutationOpts1: mutationOpts }, + props: { mutationOpts1: () => mutationOpts }, }) expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() @@ -57,7 +57,7 @@ describe('mutationOptions', () => { }) const rendered = render(BaseExample, { - props: { mutationOpts1: mutationOpts }, + props: { mutationOpts1: () => mutationOpts }, }) expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() @@ -81,7 +81,10 @@ describe('mutationOptions', () => { }) const rendered = render(BaseExample, { - props: { mutationOpts1, mutationOpts2 }, + props: { + mutationOpts1: () => mutationOpts1, + mutationOpts2: () => mutationOpts2, + }, }) expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() @@ -107,8 +110,8 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1, - mutationOpts2, + mutationOpts1: () => mutationOpts1, + mutationOpts2: () => mutationOpts2, isMutatingFilters: { mutationKey: mutationOpts1.mutationKey }, }, }) @@ -133,7 +136,7 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1: mutationOpts, + mutationOpts1: () => mutationOpts, isMutatingFilters: { mutationKey: mutationOpts.mutationKey }, }, }) @@ -155,7 +158,7 @@ describe('mutationOptions', () => { }) const rendered = render(BaseExample, { - props: { mutationOpts1: mutationOpts }, + props: { mutationOpts1: () => mutationOpts }, }) expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() @@ -179,7 +182,10 @@ describe('mutationOptions', () => { }) const rendered = render(BaseExample, { - props: { mutationOpts1, mutationOpts2 }, + props: { + mutationOpts1: () => mutationOpts1, + mutationOpts2: () => mutationOpts2, + }, }) expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() @@ -205,8 +211,8 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1, - mutationOpts2, + mutationOpts1: () => mutationOpts1, + mutationOpts2: () => mutationOpts2, isMutatingFilters: { mutationKey: mutationOpts1.mutationKey }, }, }) @@ -231,7 +237,7 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1: mutationOpts, + mutationOpts1: () => mutationOpts, mutationStateOpts: { filters: { mutationKey: mutationOpts.mutationKey, @@ -256,7 +262,7 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1: mutationOpts, + mutationOpts1: () => mutationOpts, mutationStateOpts: { filters: { status: 'success' }, }, @@ -282,8 +288,8 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1, - mutationOpts2, + mutationOpts1: () => mutationOpts1, + mutationOpts2: () => mutationOpts2, mutationStateOpts: { filters: { status: 'success' }, }, @@ -312,8 +318,8 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1, - mutationOpts2, + mutationOpts1: () => mutationOpts1, + mutationOpts2: () => mutationOpts2, mutationStateOpts: { filters: { mutationKey: mutationOpts1.mutationKey, From 0e027fed2f69ffe3a99cc15a8b2eab81f51aca81 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 24 Feb 2026 10:12:12 +0900 Subject: [PATCH 7/9] style(svelte-query/mutationOptions): remove blank lines between 'fireEvent' and assertion blocks --- .../mutationOptions.svelte.test.ts | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts index 852a030bd71..1768fc52796 100644 --- a/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts +++ b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts @@ -43,10 +43,8 @@ describe('mutationOptions', () => { expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) - await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('isMutating: 1')).toBeInTheDocument() - await vi.advanceTimersByTimeAsync(51) expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() }) @@ -63,10 +61,8 @@ describe('mutationOptions', () => { expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) - await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('isMutating: 1')).toBeInTheDocument() - await vi.advanceTimersByTimeAsync(51) expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() }) @@ -91,10 +87,8 @@ describe('mutationOptions', () => { fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) - await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('isMutating: 2')).toBeInTheDocument() - await vi.advanceTimersByTimeAsync(51) expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() }) @@ -120,10 +114,8 @@ describe('mutationOptions', () => { fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) - await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('isMutating: 1')).toBeInTheDocument() - await vi.advanceTimersByTimeAsync(51) expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() }) @@ -144,10 +136,8 @@ describe('mutationOptions', () => { expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) - await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('clientIsMutating: 1')).toBeInTheDocument() - await vi.advanceTimersByTimeAsync(501) expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() }) @@ -164,10 +154,8 @@ describe('mutationOptions', () => { expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) - await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('clientIsMutating: 1')).toBeInTheDocument() - await vi.advanceTimersByTimeAsync(501) expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() }) @@ -192,10 +180,8 @@ describe('mutationOptions', () => { fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) - await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('clientIsMutating: 2')).toBeInTheDocument() - await vi.advanceTimersByTimeAsync(501) expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() }) @@ -221,10 +207,8 @@ describe('mutationOptions', () => { fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) - await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('clientIsMutating: 1')).toBeInTheDocument() - await vi.advanceTimersByTimeAsync(501) expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() }) @@ -250,7 +234,6 @@ describe('mutationOptions', () => { expect(rendered.getByText('mutationState: []')).toBeInTheDocument() fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) - await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('mutationState: ["data"]')).toBeInTheDocument() }) @@ -272,7 +255,6 @@ describe('mutationOptions', () => { expect(rendered.getByText('mutationState: []')).toBeInTheDocument() fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) - await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('mutationState: ["data"]')).toBeInTheDocument() }) @@ -300,7 +282,6 @@ describe('mutationOptions', () => { fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) - await vi.advanceTimersByTimeAsync(11) expect( rendered.getByText('mutationState: ["data1","data2"]'), @@ -333,7 +314,6 @@ describe('mutationOptions', () => { fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) fireEvent.click(rendered.getByRole('button', { name: /mutate2/i })) - await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('mutationState: ["data1"]')).toBeInTheDocument() }) From ce75bf2d5b90085f2401c2d722e053b961378a2b Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 24 Feb 2026 10:16:25 +0900 Subject: [PATCH 8/9] refactor(svelte-query/mutationOptions): split BaseExample into BaseExample and MultiExample for single and multi mutation tests --- .../tests/mutationOptions/BaseExample.svelte | 16 ++--- .../tests/mutationOptions/MultiExample.svelte | 63 +++++++++++++++++++ .../mutationOptions.svelte.test.ts | 37 +++++------ 3 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 packages/svelte-query/tests/mutationOptions/MultiExample.svelte diff --git a/packages/svelte-query/tests/mutationOptions/BaseExample.svelte b/packages/svelte-query/tests/mutationOptions/BaseExample.svelte index 30be3b33d89..0a625125725 100644 --- a/packages/svelte-query/tests/mutationOptions/BaseExample.svelte +++ b/packages/svelte-query/tests/mutationOptions/BaseExample.svelte @@ -14,15 +14,11 @@ import type { MutationFilters } from '@tanstack/query-core' let { - mutationOpts1, - mutationOpts2, + mutationOpts, isMutatingFilters, mutationStateOpts, }: { - mutationOpts1: Accessor> - mutationOpts2?: Accessor< - CreateMutationOptions - > + mutationOpts: Accessor> isMutatingFilters?: MutationFilters mutationStateOpts?: MutationStateOptions } = $props() @@ -30,8 +26,7 @@ const queryClient = new QueryClient() setQueryClientContext(queryClient) - const mutation1 = createMutation(mutationOpts1) - const mutation2 = mutationOpts2 ? createMutation(mutationOpts2) : undefined + const mutation = createMutation(mutationOpts) const isMutating = useIsMutating(isMutatingFilters) const mutationState = useMutationState(mutationStateOpts) @@ -53,10 +48,7 @@ }) - -{#if mutation2} - -{/if} +
isMutating: {isMutating.current}
clientIsMutating: {clientIsMutating}
diff --git a/packages/svelte-query/tests/mutationOptions/MultiExample.svelte b/packages/svelte-query/tests/mutationOptions/MultiExample.svelte new file mode 100644 index 00000000000..7225afad381 --- /dev/null +++ b/packages/svelte-query/tests/mutationOptions/MultiExample.svelte @@ -0,0 +1,63 @@ + + + + + +
isMutating: {isMutating.current}
+
clientIsMutating: {clientIsMutating}
+
+ mutationState: {JSON.stringify(mutationState.map((state) => state.data))} +
diff --git a/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts index 1768fc52796..214a7e17511 100644 --- a/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts +++ b/packages/svelte-query/tests/mutationOptions/mutationOptions.svelte.test.ts @@ -3,6 +3,7 @@ import { fireEvent, render } from '@testing-library/svelte' import { sleep } from '@tanstack/query-test-utils' import { mutationOptions } from '../../src/index.js' import BaseExample from './BaseExample.svelte' +import MultiExample from './MultiExample.svelte' describe('mutationOptions', () => { beforeEach(() => { @@ -37,12 +38,12 @@ describe('mutationOptions', () => { }) const rendered = render(BaseExample, { - props: { mutationOpts1: () => mutationOpts }, + props: { mutationOpts: () => mutationOpts }, }) expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() - fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate/i })) await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('isMutating: 1')).toBeInTheDocument() await vi.advanceTimersByTimeAsync(51) @@ -55,12 +56,12 @@ describe('mutationOptions', () => { }) const rendered = render(BaseExample, { - props: { mutationOpts1: () => mutationOpts }, + props: { mutationOpts: () => mutationOpts }, }) expect(rendered.getByText('isMutating: 0')).toBeInTheDocument() - fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate/i })) await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('isMutating: 1')).toBeInTheDocument() await vi.advanceTimersByTimeAsync(51) @@ -76,7 +77,7 @@ describe('mutationOptions', () => { mutationFn: () => sleep(50).then(() => 'data2'), }) - const rendered = render(BaseExample, { + const rendered = render(MultiExample, { props: { mutationOpts1: () => mutationOpts1, mutationOpts2: () => mutationOpts2, @@ -102,7 +103,7 @@ describe('mutationOptions', () => { mutationFn: () => sleep(50).then(() => 'data2'), }) - const rendered = render(BaseExample, { + const rendered = render(MultiExample, { props: { mutationOpts1: () => mutationOpts1, mutationOpts2: () => mutationOpts2, @@ -128,14 +129,14 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1: () => mutationOpts, + mutationOpts: () => mutationOpts, isMutatingFilters: { mutationKey: mutationOpts.mutationKey }, }, }) expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() - fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate/i })) await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('clientIsMutating: 1')).toBeInTheDocument() await vi.advanceTimersByTimeAsync(501) @@ -148,12 +149,12 @@ describe('mutationOptions', () => { }) const rendered = render(BaseExample, { - props: { mutationOpts1: () => mutationOpts }, + props: { mutationOpts: () => mutationOpts }, }) expect(rendered.getByText('clientIsMutating: 0')).toBeInTheDocument() - fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate/i })) await vi.advanceTimersByTimeAsync(0) expect(rendered.getByText('clientIsMutating: 1')).toBeInTheDocument() await vi.advanceTimersByTimeAsync(501) @@ -169,7 +170,7 @@ describe('mutationOptions', () => { mutationFn: () => sleep(500).then(() => 'data2'), }) - const rendered = render(BaseExample, { + const rendered = render(MultiExample, { props: { mutationOpts1: () => mutationOpts1, mutationOpts2: () => mutationOpts2, @@ -195,7 +196,7 @@ describe('mutationOptions', () => { mutationFn: () => sleep(500).then(() => 'data2'), }) - const rendered = render(BaseExample, { + const rendered = render(MultiExample, { props: { mutationOpts1: () => mutationOpts1, mutationOpts2: () => mutationOpts2, @@ -221,7 +222,7 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1: () => mutationOpts, + mutationOpts: () => mutationOpts, mutationStateOpts: { filters: { mutationKey: mutationOpts.mutationKey, @@ -233,7 +234,7 @@ describe('mutationOptions', () => { expect(rendered.getByText('mutationState: []')).toBeInTheDocument() - fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate/i })) await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('mutationState: ["data"]')).toBeInTheDocument() }) @@ -245,7 +246,7 @@ describe('mutationOptions', () => { const rendered = render(BaseExample, { props: { - mutationOpts1: () => mutationOpts, + mutationOpts: () => mutationOpts, mutationStateOpts: { filters: { status: 'success' }, }, @@ -254,7 +255,7 @@ describe('mutationOptions', () => { expect(rendered.getByText('mutationState: []')).toBeInTheDocument() - fireEvent.click(rendered.getByRole('button', { name: /mutate1/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate/i })) await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('mutationState: ["data"]')).toBeInTheDocument() }) @@ -268,7 +269,7 @@ describe('mutationOptions', () => { mutationFn: () => sleep(10).then(() => 'data2'), }) - const rendered = render(BaseExample, { + const rendered = render(MultiExample, { props: { mutationOpts1: () => mutationOpts1, mutationOpts2: () => mutationOpts2, @@ -297,7 +298,7 @@ describe('mutationOptions', () => { mutationFn: () => sleep(10).then(() => 'data2'), }) - const rendered = render(BaseExample, { + const rendered = render(MultiExample, { props: { mutationOpts1: () => mutationOpts1, mutationOpts2: () => mutationOpts2, From 3383e4c50972b0f49bed9dd024070c5b443f393b Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 01:17:30 +0000 Subject: [PATCH 9/9] ci: apply automated fixes --- .../svelte-query/tests/mutationOptions/MultiExample.svelte | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/svelte-query/tests/mutationOptions/MultiExample.svelte b/packages/svelte-query/tests/mutationOptions/MultiExample.svelte index 7225afad381..d0272a4827b 100644 --- a/packages/svelte-query/tests/mutationOptions/MultiExample.svelte +++ b/packages/svelte-query/tests/mutationOptions/MultiExample.svelte @@ -20,9 +20,7 @@ mutationStateOpts, }: { mutationOpts1: Accessor> - mutationOpts2: Accessor< - CreateMutationOptions - > + mutationOpts2: Accessor> isMutatingFilters?: MutationFilters mutationStateOpts?: MutationStateOptions } = $props()