pull/18800/merge
svelte-triage-bot[bot] 8 hours ago committed by GitHub
commit 8c0f27360f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: initialize components invoked from effects with a batch

@ -388,7 +388,7 @@ export function wait(blockers) {
export function increment_pending() {
var effect = /** @type {Effect} */ (active_effect);
var boundary = effect.b; // undefined if called outside the render tree, e.g. a standalone $effect.root
var batch = /** @type {Batch} */ (current_batch);
var batch = Batch.ensure();
var blocking = !!boundary?.is_rendered();
boundary?.update_pending_count(1, batch);

@ -413,6 +413,7 @@ export function deferred_template_effect(fn, sync = [], async = [], blockers = [
* @param {number} flags
*/
export function block(fn, flags = 0) {
Batch.ensure();
var effect = create_effect(BLOCK_EFFECT | flags, fn);
if (DEV) {
effect.dev_stack = dev_stack;

@ -0,0 +1,5 @@
{#await Promise.resolve('child')}
<p data-pending>pending</p>
{:then value}
<p data-child>{value}</p>
{/await}

@ -0,0 +1,13 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
async test({ assert, target }) {
target.querySelector('button')?.click();
await tick();
assert.htmlEqual(
target.innerHTML,
'<button>run</button><p data-child="">child</p><span></span>'
);
}
});

@ -0,0 +1,18 @@
<script>
import Child from './Child.svelte';
let anchor = $state();
let run = $state(false);
function capture(node) {
anchor = node;
return () => (anchor = undefined);
}
$effect(() => {
if (run && anchor) Child(anchor, {});
});
</script>
<button onclick={() => (run = !run)}>run</button>
<span {@attach capture}></span>

@ -0,0 +1,5 @@
<script>
const value = $derived(await Promise.resolve('child'));
</script>
<p>{value}</p>

@ -0,0 +1,10 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
async test({ assert, target }) {
target.querySelector('button')?.click();
await tick();
assert.htmlEqual(target.innerHTML, '<button>run</button><p>child</p><span></span>');
}
});

@ -0,0 +1,13 @@
<script>
import Child from './Child.svelte';
let anchor;
let run = $state(false);
$effect(() => {
if (run) Child(anchor, {});
});
</script>
<button onclick={() => (run = true)}>run</button>
<span bind:this={anchor}></span>

@ -0,0 +1,3 @@
<svelte:boundary>
<p data-child>child</p>
</svelte:boundary>

@ -0,0 +1,13 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
async test({ assert, target }) {
target.querySelector('button')?.click();
await tick();
assert.htmlEqual(
target.innerHTML,
'<button>run</button><p data-child="">child</p><span></span>'
);
}
});

@ -0,0 +1,18 @@
<script>
import Child from './Child.svelte';
let anchor = $state();
let run = $state(false);
function capture(node) {
anchor = node;
return () => (anchor = undefined);
}
$effect(() => {
if (run && anchor) Child(anchor, {});
});
</script>
<button onclick={() => (run = !run)}>run</button>
<span {@attach capture}></span>
Loading…
Cancel
Save