fix: more informative error when effects run in an infinite loop #16405
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.
Supersedes #16247, closes #16092.
Today, if you have an effect that runs in an infinite loop, you get this somewhat unhelpful log:
Expanding the array usually reveals 10 copies of the same compiled function:
While you can click through to the
[[FunctionLocation]]
......even that doesn't necessarily tell you where the offending state change occurred.
We can do better. In this PR, we track the site of updates to state that occur inside an effect, then if we do encounter an infinite loop we can pinpoint those sites:
This works for things like array mutations, and even works for effects that ping-pong (as opposed to the probably-more-common case in which an effect invalidates itself):
Better yet, this is actually simpler than what we currently have — the implementation of
infinite_loop_guard
can be much leaner, andlog_effect_stack
anddev_effect_stack
are no more.This PR also adds an explanation of the error. For things like this I prefer progressive disclosure (i.e. link to the docs when it becomes relevant) rather than adding stuff that you have to read upfront, so I view this as an alternative to #16247.
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 test
and lint the project withpnpm lint