create sources when reading proxy properties inside deriveds

proxied-state-each-blocks
Rich Harris 9 months ago
parent 15136428a6
commit e28095f534

@ -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<string | symbol, import('./types.js').SourceSignal<any>>; v: import('./types.js').SourceSignal<number>; 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));

@ -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

Loading…
Cancel
Save