diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index f6a3fd7e330a..4f1409b090a7 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -159,6 +159,8 @@ export function set(source, value) { return internal_set(source, value); } +export const old_values = new Map(); + /** * @template V * @param {Source} source @@ -167,6 +169,8 @@ export function set(source, value) { */ export function internal_set(source, value) { if (!source.equals(value)) { + old_values.set(source, source.v); + var old_value = source.v; source.v = value; source.wv = increment_write_version(); diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index bbe4dc3d9b8f..0cdb9c2443e1 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -25,7 +25,7 @@ import { BOUNDARY_EFFECT } from './constants.js'; import { flush_tasks } from './dom/task.js'; -import { internal_set } from './reactivity/sources.js'; +import { internal_set, old_values } from './reactivity/sources.js'; import { destroy_derived_effects, update_derived } from './reactivity/deriveds.js'; import * as e from './errors.js'; import { FILENAME } from '../../constants.js'; @@ -673,6 +673,8 @@ function flush_queued_root_effects() { if (DEV) { dev_effect_stack = []; } + + old_values.clear(); } } @@ -923,6 +925,10 @@ export function get(signal) { } } + if (is_destroying_effect && old_values.has(signal)) { + return old_values.get(signal); + } + return signal.v; }