Skip to content

Commit f51c04a

Browse files
authored
fix: ensure batch exists when resetting a failed boundary (#16698)
fixes #16681
1 parent 2344b40 commit f51c04a

File tree

5 files changed

+54
-0
lines changed

5 files changed

+54
-0
lines changed

.changeset/ninety-ravens-join.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: ensure batch exists when resetting a failed boundary

packages/svelte/src/internal/client/dom/blocks/boundary.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,9 @@ export class Boundary {
297297
e.svelte_boundary_reset_onerror();
298298
}
299299

300+
// If the failure happened while flushing effects, current_batch can be null
301+
Batch.ensure();
302+
300303
this.#pending_count = 0;
301304

302305
if (this.#failed_effect !== null) {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script>
2+
async function c(a) {
3+
await Promise.resolve()
4+
if (a) {
5+
throw new Error('error');
6+
} else {
7+
return 'ok';
8+
}
9+
}
10+
11+
let a = $state();
12+
let b = $derived(await c(a));
13+
</script>
14+
15+
<button onclick={() => a = 1}>{b}</button>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { tick } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
async test({ assert, target }) {
6+
await tick();
7+
let [btn] = target.querySelectorAll('button');
8+
btn.click();
9+
await tick();
10+
11+
assert.htmlEqual(target.innerHTML, '<button>reset</button>');
12+
13+
[btn] = target.querySelectorAll('button');
14+
btn.click();
15+
await tick();
16+
17+
assert.htmlEqual(target.innerHTML, '<button>ok</button>');
18+
}
19+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script>
2+
import Test from './Test.svelte';
3+
</script>
4+
5+
<svelte:boundary>
6+
<Test />
7+
8+
{#snippet pending()}pending{/snippet}
9+
{#snippet failed(_, reset)}
10+
<button onclick={reset}>reset</button>
11+
{/snippet}
12+
</svelte:boundary>

0 commit comments

Comments
 (0)