From e28095f5342eee7bfe86a71539c46fa4be82894e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 30 Nov 2023 17:11:27 -0500 Subject: [PATCH] create sources when reading proxy properties inside deriveds --- packages/svelte/src/internal/client/proxy.js | 4 ++-- packages/svelte/src/internal/client/runtime.js | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/internal/client/proxy.js b/packages/svelte/src/internal/client/proxy.js index bdc0205c4f..15ff427e53 100644 --- a/packages/svelte/src/internal/client/proxy.js +++ b/packages/svelte/src/internal/client/proxy.js @@ -1,4 +1,4 @@ -import { effect_active, get, set, increment, source } from './runtime.js'; +import { effect_active, get, set, increment, source, updating_derived } from './runtime.js'; import { get_descriptor, is_array } from './utils.js'; /** @typedef {{ p: StateObject | null; s: Map>; v: import('./types.js').SourceSignal; a: boolean }} Metadata */ @@ -73,7 +73,7 @@ const handler = { // but only if it's an own property and not a prototype property if ( s === undefined && - effect_active() && + (effect_active() || updating_derived) && (!(prop in target) || get_descriptor(target, prop)?.writable) ) { s = source(wrap(target[prop], receiver)); diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 6661c86696..fdb9264c1d 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -87,6 +87,8 @@ export let current_block = null; export let current_component_context = null; export let is_ssr = false; +export let updating_derived = false; + /** * @param {boolean} ssr * @returns {void} @@ -661,7 +663,10 @@ export async function tick() { * @returns {void} */ function update_derived(signal, force_schedule) { + const previous_updating_derived = updating_derived; + updating_derived = true; const value = execute_signal_fn(signal); + updating_derived = previous_updating_derived; const status = current_skip_consumer || (current_effect === null && (signal.f & UNOWNED) !== 0) ? DIRTY