@@ -6,6 +6,12 @@ import {
6
6
} from '../internal/client/reactivity/effects.js' ;
7
7
import { get , writable } from './shared/index.js' ;
8
8
import { createSubscriber } from '../reactivity/create-subscriber.js' ;
9
+ import {
10
+ active_effect ,
11
+ active_reaction ,
12
+ set_active_effect ,
13
+ set_active_reaction
14
+ } from '../internal/client/runtime.js' ;
9
15
10
16
export { derived , get , readable , readonly , writable } from './shared/index.js' ;
11
17
@@ -39,19 +45,34 @@ export { derived, get, readable, readonly, writable } from './shared/index.js';
39
45
* @returns {Writable<V> | Readable<V> }
40
46
*/
41
47
export function toStore ( get , set ) {
42
- let init_value = get ( ) ;
48
+ var effect = active_effect ;
49
+ var reaction = active_reaction ;
50
+ var init_value = get ( ) ;
51
+
43
52
const store = writable ( init_value , ( set ) => {
44
53
// If the value has changed before we call subscribe, then
45
54
// we need to treat the value as already having run
46
- let ran = init_value !== get ( ) ;
55
+ var ran = init_value !== get ( ) ;
47
56
48
57
// TODO do we need a different implementation on the server?
49
- const teardown = effect_root ( ( ) => {
50
- render_effect ( ( ) => {
51
- const value = get ( ) ;
52
- if ( ran ) set ( value ) ;
58
+ var teardown ;
59
+ // Apply the reaction and effect at the time of toStore being called
60
+ var previous_reaction = active_reaction ;
61
+ var previous_effect = active_effect ;
62
+ set_active_reaction ( reaction ) ;
63
+ set_active_effect ( effect ) ;
64
+
65
+ try {
66
+ teardown = effect_root ( ( ) => {
67
+ render_effect ( ( ) => {
68
+ const value = get ( ) ;
69
+ if ( ran ) set ( value ) ;
70
+ } ) ;
53
71
} ) ;
54
- } ) ;
72
+ } finally {
73
+ set_active_reaction ( previous_reaction ) ;
74
+ set_active_effect ( previous_effect ) ;
75
+ }
55
76
56
77
ran = true ;
57
78
0 commit comments