Skip to content

Commit 72ce753

Browse files
authored
fix: flush effects scheduled during boundary's pending phase (#16738)
Alternative to #16721, partial alternative to #16709. Closes #16691, closes #16627, closes #16582 and #16651 as well.
1 parent 0b5bcc8 commit 72ce753

File tree

9 files changed

+76
-2
lines changed

9 files changed

+76
-2
lines changed

.changeset/ninety-pandas-move.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: flush effects scheduled during boundary's pending phase

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { queue_micro_task } from '../task.js';
2323
import * as e from '../../errors.js';
2424
import * as w from '../../warnings.js';
2525
import { DEV } from 'esm-env';
26-
import { Batch, effect_pending_updates } from '../../reactivity/batch.js';
26+
import { Batch, current_batch, effect_pending_updates } from '../../reactivity/batch.js';
2727
import { internal_set, source } from '../../reactivity/sources.js';
2828
import { tag } from '../../dev/tracing.js';
2929
import { createSubscriber } from '../../../../reactivity/create-subscriber.js';

packages/svelte/src/internal/client/reactivity/batch.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ export function suspend() {
668668
batch.activate();
669669
batch.decrement();
670670
} else {
671-
batch.deactivate();
671+
batch.flush();
672672
}
673673

674674
unset_context();
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<script>
2+
function renderContent(node) {
3+
node.textContent = 'foo';
4+
}
5+
6+
const test = await Promise.resolve('foo');
7+
</script>
8+
9+
<p>{test}</p>
10+
<div {@attach renderContent}></div>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { tick } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
async test({ assert, target }) {
6+
await tick();
7+
assert.htmlEqual(target.innerHTML, '<button>toggle</button> <p>foo</p><div>foo</div>');
8+
9+
const [toggle] = target.querySelectorAll('button');
10+
toggle.click();
11+
await tick();
12+
assert.htmlEqual(target.innerHTML, '<button>toggle</button>');
13+
14+
toggle.click();
15+
await tick();
16+
assert.htmlEqual(target.innerHTML, '<button>toggle</button> <p>foo</p><div>foo</div>');
17+
}
18+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<script>
2+
import Inner from './Inner.svelte';
3+
4+
let show = $state(true);
5+
</script>
6+
7+
<svelte:boundary>
8+
<button onclick={() => show = !show}>toggle</button>
9+
{#if show}
10+
<Inner />
11+
{/if}
12+
13+
{#snippet pending()}
14+
<p>pending</p>
15+
{/snippet}
16+
</svelte:boundary>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script>
2+
await 1;
3+
4+
$effect(() => {
5+
console.log('hello');
6+
});
7+
</script>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { tick } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
async test({ assert, logs }) {
6+
await tick();
7+
assert.deepEqual(logs, ['hello']);
8+
}
9+
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
import Child from './Child.svelte';
3+
</script>
4+
5+
<svelte:boundary>
6+
<Child />
7+
8+
{#snippet pending()}{/snippet}
9+
</svelte:boundary>

0 commit comments

Comments
 (0)