From b799868c3c4ed8bfd250dc6d4603a3982034fa6b Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 1 Feb 2024 09:53:28 +0000 Subject: [PATCH] more fixes --- packages/svelte/src/internal/client/proxy.js | 14 +++++++++++++- packages/svelte/src/internal/client/runtime.js | 8 ++++---- packages/svelte/src/internal/client/types.d.ts | 1 + 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/internal/client/proxy.js b/packages/svelte/src/internal/client/proxy.js index 07003a193d..72190f9679 100644 --- a/packages/svelte/src/internal/client/proxy.js +++ b/packages/svelte/src/internal/client/proxy.js @@ -8,7 +8,10 @@ import { updating_derived, UNINITIALIZED, mutable_source, - batch_inspect + batch_inspect, + current_derived_property_access, + effect_active_and_not_render_effect, + is_primitive_or_function_or_state_object } from './runtime.js'; import { array_prototype, @@ -197,6 +200,15 @@ const state_proxy_handler = { } if (s !== undefined) { + if ( + current_derived_property_access !== null && + current_derived_property_access.v === receiver && + (effect_active_and_not_render_effect() || updating_derived) && + is_primitive_or_function_or_state_object(s.v) + ) { + current_derived_property_access.v = s.v; + current_derived_property_access.p.push(prop); + } const value = get(s); return value === UNINITIALIZED ? undefined : value; } diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 0ecd18de02..2364e91029 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -62,7 +62,7 @@ let current_queued_effects = []; /** * @type {import('./types.js').DerivedPropertyAccess | null} */ -let current_derived_property_access = null; +export let current_derived_property_access = null; /** @type {Array<() => void>} */ let current_queued_tasks = []; @@ -1452,7 +1452,7 @@ function proxify_object(signal, value, handler, path) { /** * @param {any} value */ -function is_primitive_or_function_or_state_object(value) { +export function is_primitive_or_function_or_state_object(value) { const type = typeof value; return ( value == null || @@ -1505,7 +1505,7 @@ function create_derived_proxy(signal, derived_value) { if (current_derived_property_access !== null) { capture_derived_property_access(current_derived_property_access); } else { - current_derived_property_access = { s: signal, p: new_path }; + current_derived_property_access = { s: signal, p: new_path, v: value }; } } if (should_proxy_derived_value(value)) { @@ -1614,7 +1614,7 @@ export function effect_active() { /** * @returns {boolean} */ -function effect_active_and_not_render_effect() { +export function effect_active_and_not_render_effect() { return current_effect ? (current_effect.f & (MANAGED | RENDER_EFFECT)) === 0 : false; } diff --git a/packages/svelte/src/internal/client/types.d.ts b/packages/svelte/src/internal/client/types.d.ts index 1edc2e99a0..f0578371ae 100644 --- a/packages/svelte/src/internal/client/types.d.ts +++ b/packages/svelte/src/internal/client/types.d.ts @@ -130,6 +130,7 @@ export type ComputationSignal = { export type DerivedPropertyAccess = { s: ComputationSignal; p: Array; + v: any; }; export type Signal = SourceSignal | ComputationSignal;