fix: ensure batch exists when resetting a failed boundary

fixes #16681
pull/16698/head
Simon Holthausen 4 days ago
parent 2344b4052e
commit a2ab9b2500

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: ensure batch exists when resetting a failed boundary

@ -297,6 +297,9 @@ export class Boundary {
e.svelte_boundary_reset_onerror();
}
// If the failure happened while flushing effects, current_batch can be null
Batch.ensure();
this.#pending_count = 0;
if (this.#failed_effect !== null) {

@ -0,0 +1,15 @@
<script>
async function c(a) {
await Promise.resolve()
if (a) {
throw new Error('error');
} else {
return 'ok';
}
}
let a = $state();
let b = $derived(await c(a));
</script>
<button onclick={() => a = 1}>{b}</button>

@ -0,0 +1,19 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
async test({ assert, target }) {
await tick();
let [btn] = target.querySelectorAll('button');
btn.click();
await tick();
assert.htmlEqual(target.innerHTML, '<button>reset</button>');
[btn] = target.querySelectorAll('button');
btn.click();
await tick();
assert.htmlEqual(target.innerHTML, '<button>ok</button>');
}
});

@ -0,0 +1,12 @@
<script>
import Test from './Test.svelte';
</script>
<svelte:boundary>
<Test />
{#snippet pending()}pending{/snippet}
{#snippet failed(_, reset)}
<button onclick={reset}>reset</button>
{/snippet}
</svelte:boundary>
Loading…
Cancel
Save