fix: link offscreen items and last effect in each block correctly #17240
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
It's possible that due to how new elements are inserted into the array that
effect.lastis wrong. We need to ensure it is really the last item to keep items properly connected to the graph. In addition we link offscreen items after all onscreen items, to ensure they don't have wrong pointers.#17244 as an alternative didn't work because it is possible due to how we don't link all items during reconciliation to end up with the wrong
effect.last, which subsequently can mean that an item "falls out" of the graph. The added test showcases how this goes wrong with the previous logic:[1, 2, 3]4-> is noweffect.last[1, 4, 2, 3]->effect.lastnow2(not3because that isn't relinked because the order didn't change and reconciliation sees that)5-> is noweffect.last, which means2.nextis now5and no longer3effect.lastnow2again -> noone has3asnext->3fell out of the graph3-> nothing happensThe fix is to go back to the behavior prior to #17150 which is "set the last item as
last", additionally taking into account offscreen items.Fixes #17201
Fixes #17239
Before submitting the PR, please make sure you do the following
feat:,fix:,chore:, ordocs:.packages/svelte/src, add a changeset (npx changeset).Tests and linting
pnpm testand lint the project withpnpm lint