From 4f35c019fc110fe2f4c74cb293f26f270195345b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 24 Oct 2025 11:22:27 -0400 Subject: [PATCH] add fork_discarded error --- .../98-reference/.generated/client-errors.md | 6 +++ .../svelte/messages/client-errors/errors.md | 4 ++ packages/svelte/src/internal/client/errors.js | 48 ++++++++++++------- .../src/internal/client/reactivity/batch.js | 2 +- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/documentation/docs/98-reference/.generated/client-errors.md b/documentation/docs/98-reference/.generated/client-errors.md index d7a91fae01..d47d0eb5cd 100644 --- a/documentation/docs/98-reference/.generated/client-errors.md +++ b/documentation/docs/98-reference/.generated/client-errors.md @@ -146,6 +146,12 @@ The `flushSync()` function can be used to flush any pending effects synchronousl This restriction only applies when using the `experimental.async` option, which will be active by default in Svelte 6. +### fork_discarded + +``` +Cannot commit a fork that was already committed or discarded (including as a result of a different fork being committed) +``` + ### fork_timing ``` diff --git a/packages/svelte/messages/client-errors/errors.md b/packages/svelte/messages/client-errors/errors.md index 40e6d82089..44afef58b4 100644 --- a/packages/svelte/messages/client-errors/errors.md +++ b/packages/svelte/messages/client-errors/errors.md @@ -112,6 +112,10 @@ The `flushSync()` function can be used to flush any pending effects synchronousl This restriction only applies when using the `experimental.async` option, which will be active by default in Svelte 6. +## fork_discarded + +> Cannot commit a fork that was already committed or discarded (including as a result of a different fork being committed) + ## fork_timing > Cannot create a fork inside an effect or when state changes are pending diff --git a/packages/svelte/src/internal/client/errors.js b/packages/svelte/src/internal/client/errors.js index 4916e630d7..8341688ea6 100644 --- a/packages/svelte/src/internal/client/errors.js +++ b/packages/svelte/src/internal/client/errors.js @@ -261,6 +261,38 @@ export function flush_sync_in_effect() { } } +/** + * Cannot create a fork inside an effect or when state changes are pending + * @returns {never} + */ +export function fork_timing() { + if (DEV) { + const error = new Error(`fork_timing\nCannot create a fork inside an effect or when state changes are pending\nhttps://svelte.dev/e/fork_timing`); + + error.name = 'Svelte error'; + + throw error; + } else { + throw new Error(`https://svelte.dev/e/fork_timing`); + } +} + +/** + * Cannot commit a fork that was already committed or discarded (including as a result of a different fork being committed) + * @returns {never} + */ +export function fork_discarded() { + if (DEV) { + const error = new Error(`fork_discarded\nCannot commit a fork that was already committed or discarded (including as a result of a different fork being committed)\nhttps://svelte.dev/e/fork_discarded`); + + error.name = 'Svelte error'; + + throw error; + } else { + throw new Error(`https://svelte.dev/e/fork_discarded`); + } +} + /** * `getAbortSignal()` can only be called inside an effect or derived * @returns {never} @@ -455,20 +487,4 @@ export function svelte_boundary_reset_onerror() { } else { throw new Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`); } -} - -/** - * Cannot create a fork inside an effect or when state changes are pending - * @returns {never} - */ -export function fork_timing() { - if (DEV) { - const error = new Error(`fork_timing\nCannot create a fork inside an effect or when state changes are pending\nhttps://svelte.dev/e/fork_timing`); - - error.name = 'Svelte error'; - - throw error; - } else { - throw new Error(`https://svelte.dev/e/fork_timing`); - } } \ No newline at end of file diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 17c017728c..35c2d30918 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -907,7 +907,7 @@ export function fork(fn) { return { commit: async () => { if (!batches.has(batch)) { - throw new Error('Cannot commit this batch'); // TODO better error + e.fork_discarded(); } batch.is_fork = false;