@ -10,10 +10,17 @@ import {
import { get _descriptor , is _function } from '../../shared/utils.js' ;
import { mutable _source , set , source } from './sources.js' ;
import { derived , derived _safe _equal } from './deriveds.js' ;
import { get , is _signals _recorded , untrack , update } from '../runtime.js' ;
import {
active _effect ,
get ,
is _signals _recorded ,
set _active _effect ,
untrack ,
update
} from '../runtime.js' ;
import { safe _equals } from './equality.js' ;
import * as e from '../errors.js' ;
import { LEGACY _DERIVED _PROP } from '../constants.js' ;
import { BRANCH_EFFECT , LEGACY_DERIVED _PROP , ROOT _EFFECT } from '../constants.js' ;
import { proxy } from '../proxy.js' ;
/ * *
@ -217,6 +224,26 @@ export function spread_props(...props) {
return new Proxy ( { props } , spread _props _handler ) ;
}
/ * *
* @ template T
* @ param { ( ) => T } fn
* @ returns { T }
* /
function with _parent _branch ( fn ) {
var effect = active _effect ;
var previous _effect = active _effect ;
while ( effect !== null && ( effect . f & ( BRANCH _EFFECT | ROOT _EFFECT ) ) === 0 ) {
effect = effect . parent ;
}
try {
set _active _effect ( effect ) ;
return fn ( ) ;
} finally {
set _active _effect ( previous _effect ) ;
}
}
/ * *
* This function is responsible for synchronizing a possibly bound prop with the inner component state .
* It is used whenever the compiler sees that the component writes to the prop , or when it has a default prop _value .
@ -276,8 +303,8 @@ export function prop(props, key, flags, fallback) {
} else {
// Svelte 4 did not trigger updates when a primitive value was updated to the same value.
// Replicate that behavior through using a derived
var derived _getter = ( immutable ? derived : derived _safe _equal ) (
( ) => /** @type {V} */ ( props [ key ] )
var derived _getter = with _parent _branch ( ( ) =>
( immutable ? derived : derived _safe _equal ) ( ( ) => /** @type {V} */ ( props [ key ] ) )
) ;
derived _getter . f |= LEGACY _DERIVED _PROP ;
getter = ( ) => {
@ -321,19 +348,21 @@ export function prop(props, key, flags, fallback) {
// The derived returns the current value. The underlying mutable
// source is written to from various places to persist this value.
var inner _current _value = mutable _source ( prop _value ) ;
var current _value = derived ( ( ) => {
var parent _value = getter ( ) ;
var child _value = get ( inner _current _value ) ;
if ( from _child ) {
from _child = false ;
was _from _child = true ;
return child _value ;
}
var current _value = with _parent _branch ( ( ) =>
derived ( ( ) => {
var parent _value = getter ( ) ;
var child _value = get ( inner _current _value ) ;
if ( from _child ) {
from _child = false ;
was _from _child = true ;
return child _value ;
}
was _from _child = false ;
return ( inner _current _value . v = parent _value ) ;
} ) ;
was _from _child = false ;
return ( inner _current _value . v = parent _value ) ;
} )
) ;
if ( ! immutable ) current _value . equals = safe _equals ;