From ff5d9fec07c13bb0d9ef46834d4aa08584cf9e61 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 4 Feb 2025 17:25:35 -0500 Subject: [PATCH 1/8] pending_items -> offscreen_items --- .../src/internal/client/dom/blocks/each.js | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index 0df4e4b0d4..cf6c7a0f12 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -142,7 +142,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f var boundary = find_boundary(active_effect); /** @type {Map} */ - var pending_items = new Map(); + var offscreen_items = new Map(); // TODO: ideally we could use derived for runes mode but because of the ability // to use a store which can be mutated, we can't do that here as mutating a store @@ -164,7 +164,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f each_effect, array, state, - pending_items, + offscreen_items, anchor, render_fn, flags, @@ -275,7 +275,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f value = array[i]; key = get_key(value, i); - var existing = state.items.get(key) ?? pending_items.get(key); + var existing = state.items.get(key) ?? offscreen_items.get(key); if (existing) { // update before reconciliation, to trigger any async updates @@ -297,7 +297,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f true ); - pending_items.set(key, item); + offscreen_items.set(key, item); } } @@ -332,7 +332,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f * @param {Effect} each_effect * @param {Array} array * @param {EachState} state - * @param {Map} pending_items + * @param {Map} offscreen_items * @param {Element | Comment | Text} anchor * @param {(anchor: Node, item: MaybeSource, index: number | Source, collection: () => V[]) => void} render_fn * @param {number} flags @@ -344,7 +344,7 @@ function reconcile( each_effect, array, state, - pending_items, + offscreen_items, anchor, render_fn, flags, @@ -406,10 +406,10 @@ function reconcile( item = items.get(key); if (item === undefined) { - var pending = pending_items.get(key); + var pending = offscreen_items.get(key); if (pending !== undefined) { - pending_items.delete(key); + offscreen_items.delete(key); items.set(key, pending); var next = prev && prev.next; @@ -575,9 +575,11 @@ function reconcile( each_effect.first = state.first && state.first.e; each_effect.last = prev && prev.e; - for (var unused of pending_items.values()) { + for (var unused of offscreen_items.values()) { destroy_effect(unused.e); } + + offscreen_items.clear(); } /** From 990634d15f454fe058d8764948243b9fe89f865e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 4 Feb 2025 17:26:11 -0500 Subject: [PATCH 2/8] remove old comment --- packages/svelte/src/internal/client/dom/blocks/each.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index cf6c7a0f12..c72cc54270 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -566,12 +566,6 @@ function reconcile( }); } - // TODO this seems super weird... should be `each_effect`, but that doesn't seem to work? - // if (active_effect !== null) { - // active_effect.first = state.first && state.first.e; - // active_effect.last = prev && prev.e; - // } - each_effect.first = state.first && state.first.e; each_effect.last = prev && prev.e; From ae8bd6f2229e57bbd0638c9746c964d7b197c140 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Tue, 4 Feb 2025 23:45:02 +0000 Subject: [PATCH 3/8] fix await member expressions --- .../phases/3-transform/client/visitors/shared/component.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index 52bac3cb30..d08b8c0664 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -180,7 +180,8 @@ export function build_component(node, component_name, context, anchor = context. return ( n.type === 'ExpressionTag' && n.expression.type !== 'Identifier' && - n.expression.type !== 'MemberExpression' + (n.expression.type !== 'MemberExpression' || + n.expression.object.type === 'AwaitExpression') ); }); From d39d8c0675fd1ab13fa752b6a57e471ae864f7eb Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 5 Feb 2025 12:28:18 +0000 Subject: [PATCH 4/8] fix: ensure tracking returns true, even if in unowned (#15214) * fix: ensure tracking returns true, even if in unowned * fix: ensure tracking returns true, even if in unowned * Update packages/svelte/tests/runtime-runes/samples/effect-tracking-unowned/main.svelte --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/long-moles-join.md | 5 +++++ .../src/internal/client/reactivity/effects.js | 8 +------- .../samples/effect-tracking-unowned/_config.js | 16 ++++++++++++++++ .../samples/effect-tracking-unowned/main.svelte | 12 ++++++++++++ 4 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 .changeset/long-moles-join.md create mode 100644 packages/svelte/tests/runtime-runes/samples/effect-tracking-unowned/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/effect-tracking-unowned/main.svelte diff --git a/.changeset/long-moles-join.md b/.changeset/long-moles-join.md new file mode 100644 index 0000000000..92c3d7bf9d --- /dev/null +++ b/.changeset/long-moles-join.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure tracking returns true, even if in unowned diff --git a/packages/svelte/src/internal/client/reactivity/effects.js b/packages/svelte/src/internal/client/reactivity/effects.js index eab6c767f8..9d7b5e9de6 100644 --- a/packages/svelte/src/internal/client/reactivity/effects.js +++ b/packages/svelte/src/internal/client/reactivity/effects.js @@ -164,13 +164,7 @@ function create_effect(type, fn, sync, push = true) { * @returns {boolean} */ export function effect_tracking() { - if (active_reaction === null || untracking) { - return false; - } - - // If it's skipped, that's because we're inside an unowned - // that is not being tracked by another reaction - return !skip_reaction; + return active_reaction !== null && !untracking; } /** diff --git a/packages/svelte/tests/runtime-runes/samples/effect-tracking-unowned/_config.js b/packages/svelte/tests/runtime-runes/samples/effect-tracking-unowned/_config.js new file mode 100644 index 0000000000..749b9997c2 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/effect-tracking-unowned/_config.js @@ -0,0 +1,16 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + async test({ assert, target, logs }) { + const b1 = target.querySelector('button'); + + b1?.click(); + flushSync(); + + assert.htmlEqual( + target.innerHTML, + `Store: new

Text: new message

` + ); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/effect-tracking-unowned/main.svelte b/packages/svelte/tests/runtime-runes/samples/effect-tracking-unowned/main.svelte new file mode 100644 index 0000000000..3c16e3c036 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/effect-tracking-unowned/main.svelte @@ -0,0 +1,12 @@ + + +Store: {$store} +

Text: {text}

+ From ed1cf75b79f0bffbb5122f88a570b91deb744708 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 5 Feb 2025 11:42:24 -0500 Subject: [PATCH 5/8] chore: add download/hash scripts for sandbox (#15218) * chore: add download/hash scripts for sandbox * remove logging --- playgrounds/sandbox/index.html | 2 +- playgrounds/sandbox/package.json | 4 +- playgrounds/sandbox/scripts/download.js | 52 +++++++++++++++++++++++++ playgrounds/sandbox/scripts/hash.js | 45 +++++++++++++++++++++ playgrounds/sandbox/ssr-dev.js | 2 +- playgrounds/sandbox/ssr-prod.js | 2 +- 6 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 playgrounds/sandbox/scripts/download.js create mode 100644 playgrounds/sandbox/scripts/hash.js diff --git a/playgrounds/sandbox/index.html b/playgrounds/sandbox/index.html index 512b5426a9..845538abf0 100644 --- a/playgrounds/sandbox/index.html +++ b/playgrounds/sandbox/index.html @@ -12,7 +12,7 @@