From 2a16f17de717e6ad6859d2e35d8786f43762adb7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 30 Jun 2025 21:48:35 -0400 Subject: [PATCH] reorder a bit --- .../src/internal/client/reactivity/props.js | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/props.js b/packages/svelte/src/internal/client/reactivity/props.js index 37e53b5a6d..101e8f2dd2 100644 --- a/packages/svelte/src/internal/client/reactivity/props.js +++ b/packages/svelte/src/internal/client/reactivity/props.js @@ -264,18 +264,24 @@ export function prop(props, key, flags, fallback) { var runes = !legacy_mode_flag || (flags & PROPS_IS_RUNES) !== 0; var bindable = (flags & PROPS_IS_BINDABLE) !== 0; var lazy = (flags & PROPS_IS_LAZY_INITIAL) !== 0; - var is_store_sub = false; - var prop_value; - if (bindable) { - [prop_value, is_store_sub] = capture_store_binding(() => /** @type {V} */ (props[key])); - } else { - prop_value = /** @type {V} */ (props[key]); - } + var fallback_value = /** @type {V} */ (fallback); + var fallback_dirty = true; + var fallback_used = false; + + var get_fallback = () => { + fallback_used = true; - // Can be the case when someone does `mount(Component, props)` with `let props = $state({...})` - // or `createClassComponent(Component, props)` - var is_entry_props = STATE_SYMBOL in props || LEGACY_PROPS in props; + if (fallback_dirty) { + fallback_dirty = false; + + fallback_value = lazy + ? untrack(/** @type {() => V} */ (fallback)) + : /** @type {V} */ (fallback); + } + + return fallback_value; + }; /** @type {((v: V) => void) | undefined} */ var setter; @@ -284,36 +290,31 @@ export function prop(props, key, flags, fallback) { var getter; if (bindable) { + // Can be the case when someone does `mount(Component, props)` with `let props = $state({...})` + // or `createClassComponent(Component, props)` + var is_entry_props = STATE_SYMBOL in props || LEGACY_PROPS in props; + setter = get_descriptor(props, key)?.set ?? (is_entry_props && key in props ? (v) => (props[key] = v) : undefined); } - var fallback_value = /** @type {V} */ (fallback); - var fallback_dirty = true; - var fallback_used = false; + var initial_value; + var is_store_sub = false; - var get_fallback = () => { - fallback_used = true; - if (fallback_dirty) { - fallback_dirty = false; - if (lazy) { - fallback_value = untrack(/** @type {() => V} */ (fallback)); - } else { - fallback_value = /** @type {V} */ (fallback); - } - } + if (bindable) { + [initial_value, is_store_sub] = capture_store_binding(() => /** @type {V} */ (props[key])); + } else { + initial_value = /** @type {V} */ (props[key]); + } - return fallback_value; - }; + if (initial_value === undefined && fallback !== undefined) { + initial_value = get_fallback(); - if (prop_value === undefined && fallback !== undefined) { - if (setter && runes) { - e.props_invalid_value(key); + if (setter) { + if (runes) e.props_invalid_value(key); + setter(initial_value); } - - prop_value = get_fallback(); - setter?.(prop_value); } if (runes) {