From e5beb7297d09feb0dfd8acaa490c738a20e7dc5b Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Mon, 1 Jun 2026 19:14:59 +0200 Subject: [PATCH] fix: push renderer in effects even if it's `null` This is needed because effects record the renderer they were created with. But if we interlieve a DOM renderer with a Custom one, current_renderer could be a custom one when the effect reruns and if we don't push `null` it will use the custom_renderer methods instead of the DOM ones. --- .../svelte/src/internal/client/custom-renderer/state.js | 5 +++-- packages/svelte/src/internal/client/dom/blocks/boundary.js | 6 +++--- packages/svelte/src/internal/client/dom/blocks/branches.js | 2 +- packages/svelte/src/internal/client/dom/blocks/each.js | 2 +- packages/svelte/src/internal/client/reactivity/effects.js | 4 ++-- packages/svelte/src/internal/client/runtime.js | 2 +- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/svelte/src/internal/client/custom-renderer/state.js b/packages/svelte/src/internal/client/custom-renderer/state.js index b14eb48895..a952ccbd34 100644 --- a/packages/svelte/src/internal/client/custom-renderer/state.js +++ b/packages/svelte/src/internal/client/custom-renderer/state.js @@ -20,8 +20,9 @@ export function set_renderer(value) { */ export function push_renderer(value) { var previous_hydrating = hydrating; + var should_disable_hydration = hydrating && value != null; // this is to allow hydration code to treeshake - if (hydrating) { + if (should_disable_hydration) { set_hydrating(false); } var previous_renderer = current_renderer; @@ -29,7 +30,7 @@ export function push_renderer(value) { return () => { current_renderer = previous_renderer; - if (previous_hydrating) { + if (should_disable_hydration) { set_hydrating(previous_hydrating); } }; diff --git a/packages/svelte/src/internal/client/dom/blocks/boundary.js b/packages/svelte/src/internal/client/dom/blocks/boundary.js index 6b5ec4f9c7..3cca70076a 100644 --- a/packages/svelte/src/internal/client/dom/blocks/boundary.js +++ b/packages/svelte/src/internal/client/dom/blocks/boundary.js @@ -230,7 +230,7 @@ export class Boundary { this.#pending_effect = branch(() => pending(this.#anchor)); queue_micro_task(() => { - var pop_renderer = this.#effect.r !== null ? push_renderer(this.#effect.r) : null; + var pop_renderer = push_renderer(this.#effect.r); var fragment = (this.#offscreen_fragment = create_fragment()); var anchor = create_text(); @@ -324,7 +324,7 @@ export class Boundary { set_active_reaction(this.#effect); set_component_context(this.#effect.ctx); - var pop_renderer = this.#effect.r !== null ? push_renderer(this.#effect.r) : null; + var pop_renderer = push_renderer(this.#effect.r); try { Batch.ensure(); @@ -368,7 +368,7 @@ export class Boundary { } if (this.#offscreen_fragment) { - var pop_renderer = this.#effect.r !== null ? push_renderer(this.#effect.r) : null; + var pop_renderer = push_renderer(this.#effect.r); insert_before(this.#anchor, this.#offscreen_fragment); this.#offscreen_fragment = null; pop_renderer?.(); diff --git a/packages/svelte/src/internal/client/dom/blocks/branches.js b/packages/svelte/src/internal/client/dom/blocks/branches.js index bd5d4aac11..2c045df256 100644 --- a/packages/svelte/src/internal/client/dom/blocks/branches.js +++ b/packages/svelte/src/internal/client/dom/blocks/branches.js @@ -96,7 +96,7 @@ export class BranchManager { // if this batch was made obsolete, bail if (!this.#batches.has(batch)) return; - var pop_renderer = this.#renderer !== null ? push_renderer(this.#renderer) : null; + var pop_renderer = push_renderer(this.#renderer); var key = /** @type {Key} */ (this.#batches.get(batch)); diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index d47610fa9a..5e8bccd37d 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -267,7 +267,7 @@ export function each(node, flags, get_collection, get_key, render_fn, fallback_f return; } - var pop_renderer = renderer !== null ? push_renderer(renderer) : null; + var pop_renderer = push_renderer(renderer); state.pending.delete(batch); diff --git a/packages/svelte/src/internal/client/reactivity/effects.js b/packages/svelte/src/internal/client/reactivity/effects.js index b14b129066..ae7408abd8 100644 --- a/packages/svelte/src/internal/client/reactivity/effects.js +++ b/packages/svelte/src/internal/client/reactivity/effects.js @@ -513,7 +513,7 @@ export function destroy_block_effect_children(signal) { export function destroy_effect(effect, remove_dom = true) { var removed = false; - var pop_renderer = effect.r !== null ? push_renderer(effect.r) : null; + var pop_renderer = push_renderer(effect.r); if ( (remove_dom || (effect.f & HEAD_EFFECT) !== 0) && @@ -738,7 +738,7 @@ export function aborted(effect = /** @type {Effect} */ (active_effect)) { export function move_effect(effect, fragment) { if (!effect.nodes) return; - var pop_renderer = effect.r !== null ? push_renderer(effect.r) : null; + var pop_renderer = push_renderer(effect.r); /** @type {TemplateNode | null} */ var node = effect.nodes.start; diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index f4dacfed83..01220d52e3 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -446,7 +446,7 @@ export function update_effect(effect) { active_effect = effect; is_updating_effect = true; - var pop_renderer = effect.r !== null ? push_renderer(effect.r) : null; + var pop_renderer = push_renderer(effect.r); if (DEV) { var previous_component_fn = dev_current_component_function;