* fix: mark parent effect as dirty on error boundary initialization
This change ensures that if an error occurs while a parent effect is still initializing, the parent effect is marked as dirty and scheduled to re-run. This addresses scenarios where state updates in the onerror handler do not trigger a re-evaluation of the condition, improving error handling in Svelte components.
* chore: add changeset for #17553
* fix: run boundary callbacks in a microtask, in case they result in the boundary's destruction
---------
Co-authored-by: frozenflux2 <snowflake30518@gmail.com>
* fix: each block breaking with effects interspersed among items
* test sample with interspersed non-branch effects
* Apply suggestion from @Rich-Harris
* use $effect.pre in sample instead
---------
Co-authored-by: Rich Harris <hello@rich-harris.dev>
* fix: add pointer and touch events to a11y_no_static_element_interactions warning
Fixes#17527
The a11y_no_static_element_interactions warning now triggers for pointer
and touch events (onpointerdown, onpointerenter, ontouchstart, etc.)
in addition to mouse and drag events.
This ensures accessibility warnings are consistent across all pointer
input methods.
* fix test
---------
Co-authored-by: Daniel <daniel@example.com>
Co-authored-by: Rich Harris <rich.harris@vercel.com>
* fix: handle falsy dynamic components in SSR
Closes#17408
Adds a dynamic check for the component in the SSR.
Changes:
- Modified server-side component renderer to use b.maybe_call for dynamic components
- Added SSR test case for falsy component values
* fix types
---------
Co-authored-by: Rich Harris <rich.harris@vercel.com>
* fix: avoid using dev-mode array.includes wrapper on internal array checks
* use includes rather than index_of
* unused imports
---------
Co-authored-by: Rich Harris <rich.harris@vercel.com>
* add samples for async readable freeze
* test updating without changing reference too
* fix: treat block effects as maybe dirty in revive()
* even simpler - put block effects in maybe_dirty_effects
---------
Co-authored-by: Rich Harris <rich.harris@vercel.com>
PR #17461 added the `wait` function to `reactivity/async.js` and modified the compiler to generate `$.wait()` calls, but forgot to export it from `index.js`.
This causes a runtime error when using `await` inside `$derived()` with `experimental.async: true`:
```
TypeError: $.wait is not a function
```
Fixes#17529
* fix: batch resolution of async work
Co-authored-by: David Roizenman <hmnd@users.noreply.github.com>
* fix
* drive-by tidy up — Batch.enqueue is (apparently?) a useless wrapper around queue_micro_task
* 99% sure it's impossible for is_flushing to be true inside a queued task
* add some comments
* return early, reduce indentation
---------
Co-authored-by: David Roizenman <hmnd@users.noreply.github.com>
* chore: reduce indirection, simplify logic in batch.process(...)
* this is unnecessary, previous_batch is only read in specific effects that run later
* perf: use Set for new_deps to avoid O(n) includes check
* fix: only call revive() when batch is no longer deferred
* fix: avoid unnecessary async tracking when blockers are already settled
* add changeset
* only record promises as settled after cleanup is complete
* don't flush when already flushing
* skip settled blockers more aggressively
* batch decrement and pending count updates to reduce flush pressure
* extract new_deps changes to a separate PR
* remove changeset that applies to the other branch
* mark promises as settled as they settle — at the end is too late to do any good
* remove unnecessary microtask
* extract batch changes to separate PR
* this too
* avoid assigning to parameter
* wrong promise added to settled_promises due to reassignment
* WIP
* WIP
* fix
* unused
* oops
* bad import
---------
Co-authored-by: Rich Harris <rich.harris@vercel.com>
* fix: handle non-string values in svelte:element this attribute
* chore: add changeset
* fix(review): throw error in DEV for invalid svelte:element tag, ignore in PROD
* chore: remove unused expected.html from test
* fix(review): refine validate.js logic
* fix(review): use else if (string) logic in server/index.js
* fix(review): swap validation order in compiler, revert runtime changes
* test: move reproduction to runtime-legacy per review
* Apply suggestion from @7nik
---------
Co-authored-by: tensorworker <tensorworker@proton.me>
Co-authored-by: 7nik <kfiiranet@gmail.com>
* feat: export from
* changeset
* fix: Errors
* set_source, so state is correct if an error occurs
* simplify
---------
Co-authored-by: Rich Harris <rich.harris@vercel.com>
* feat: customizable select
* fix: treat inner of options as separate templates
* fix: add hydration comment
* fix: clear with textContent
* fix: mark rich content option as dynamic and allow optgroup
* fix: allow select with rich content and rename
* chore: revert tests
* fix: recursively check rich options
* chore: change name of template
* fix: mark boundary as dynamic
* chore: add snapshot tests
* chore: include comprehensive hydration test
* fix: consider `selectedelement` as ancestor of `option` elements
* fix: make `:has` work with `selectedcontent`
* chore: failing test for css
* fix: also return parent for adjacent_only
* fix: move hydration marker at the end
* chore: apply suggestions from code review
Co-authored-by: Rich Harris <rich.harris@vercel.com>
* fix: treat text elements in select and optgroup as rich
* fix hydration
* colocate code
* drop the element, it's cleaner
* rename module
* update test
* Update .changeset/chubby-dingos-laugh.md
* fix a11y warning that occurs when button only contains selectedcontent
* remove unused parameter
* last part is redundant
* simplify
* unnecessary, the constraints overlap
* this is taken care of during analysis
* simplify
* tweak
* tweak
* tweak
* fix/tweak
* tweak
---------
Co-authored-by: Rich Harris <rich.harris@vercel.com>
* add test sample
* add test for sveltejs/kit#15059
* fix: reconnect deriveds inside branch effects
* add changeset
* fix: derived with no deps always set as MAYBE_DIRTY
fixes#17342
* add test for #17342
* additional changeset
* refactor: extract setting derived status to helper, apply to sources.js
* add test case for #17352
* fix: reconnect child deriveds when evaluating connected parent derived
fixes#17352
* fix import order causing Cannot read properties of undefined on dev load
* remove duplicate iteration over deps
* minor style tweaks
* oops, fix merge
* use update_derived_status, so that we never set a dep-less derived MAYBE_DIRTY
* tweak
* reaction.deps cannot be null for a MAYBE_DIRTY derived
* make it such that reactions without deps are never MAYBE_DIRTY
* since we no longer need to check reaction.deps === null, we can revert this bit
* more explicit check
* tidy up
* more
* gah whoops
* move import
* simplify test
* make dep-less derived behaviour more explicit, move it above is_destroying_effect handling
* remove test - this is adequately covered by #17445
* replace tricky unit test with component-based test
* remove incorrect test
* remove the BRANCH_EFFECT stuff
* tidy up
* DRY
* tweak, add explanatory comment
* tweak
* explanatory comment
* remove changeset
* update changeset
---------
Co-authored-by: Tee Ming <chewteeming01@gmail.com>
Co-authored-by: Rich Harris <rich.harris@vercel.com>
* feat: type `currentTarget` in `on` function
* `EventTarget &` is redundant, `Element` already extends `EventTarget`
* no need for optional chaining
* add currentTarget for other overloads
* update changeset
---------
Co-authored-by: Rich Harris <rich.harris@vercel.com>
* fix: prevent infinite loop when HMRing a component with an `await`
* update test
* fix
* reintroduce old logic to fix ever-growing stack of block effects
* update snapshot
* tweak names for clarity, simplify `update` slightly
---------
Co-authored-by: Simon Holthausen <simon.holthausen@vercel.com>
* fix: set Root start/end to null when fragment contains only whitespace
* format
* always set root.start to 0 and root.end to template.length
* Update .changeset/fruity-knives-ring.md
---------
Co-authored-by: Rich Harris <rich.harris@vercel.com>
Co-authored-by: Rich Harris <hello@rich-harris.dev>
In #17105 one line in `update_reaction` was changed that can cause reactivity loss. It checks if the reaction is updated inside of an effect and only then will push to the reactions. The prior version had an additional check to still add to the reactions if there is already at least one reaction on the derived, indicating it is connected. Removing this check fixes#17263 while keeping correctness: a connected derived by definition at least has one reaction and therefore can properly cleanup.
* chore: more effect helpers
This adds two new helpers that helped me tremendously with getting to the bottom of #17197:
- `log_reactions`: Logs the graph of reactions starting from the given signal, and also checks if the effect leafs are reachable and if they are able to schedule a root
- `log_inconsistent_branches`: Logs if there are paths in the graph where a branch is clean above a non-clean branch, which means that the part of the graph cannot schedule batches anymore
* shut up eslint