Skip to content

Commit e13b0d9

Browse files
committed
merge main
2 parents d7659d5 + cf2ff5e commit e13b0d9

File tree

21 files changed

+201
-25
lines changed

21 files changed

+201
-25
lines changed

.changeset/cuddly-walls-tan.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: abort and reschedule effect processing after state change in user effect

.changeset/curvy-carrots-prove.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

.changeset/new-wolves-punch.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

packages/svelte/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# svelte
22

3+
## 5.35.3
4+
5+
### Patch Changes
6+
7+
- fix: account for mounting when `select_option` in `attribute_effect` ([#16309](https://github.com/sveltejs/svelte/pull/16309))
8+
9+
- fix: do not proxify the value assigned to a derived ([#16302](https://github.com/sveltejs/svelte/pull/16302))
10+
311
## 5.35.2
412

513
### Patch Changes

packages/svelte/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "svelte",
33
"description": "Cybernetically enhanced web apps",
44
"license": "MIT",
5-
"version": "5.35.2",
5+
"version": "5.35.3",
66
"type": "module",
77
"types": "./types/index.d.ts",
88
"engines": {

packages/svelte/src/internal/client/constants.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ export const INSPECT_EFFECT = 1 << 17;
1919
export const HEAD_EFFECT = 1 << 18;
2020
export const EFFECT_PRESERVED = 1 << 19;
2121
export const EFFECT_IS_UPDATING = 1 << 20;
22+
export const USER_EFFECT = 1 << 21;
2223

2324
// Flags used for async
24-
export const REACTION_IS_UPDATING = 1 << 21;
25-
export const EFFECT_ASYNC = 1 << 22;
25+
export const REACTION_IS_UPDATING = 1 << 22;
26+
export const EFFECT_ASYNC = 1 << 23;
2627

27-
export const ERROR_VALUE = 1 << 23;
28+
export const ERROR_VALUE = 1 << 24;
2829

2930
export const STATE_SYMBOL = Symbol('$state');
3031
export const LEGACY_PROPS = Symbol('legacy props');

packages/svelte/src/internal/client/context.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
set_active_effect,
1010
set_active_reaction
1111
} from './runtime.js';
12-
import { effect, teardown } from './reactivity/effects.js';
12+
import { create_user_effect, teardown } from './reactivity/effects.js';
1313
import { async_mode_flag, legacy_mode_flag } from '../flags/index.js';
1414
import { FILENAME } from '../../constants.js';
1515

@@ -189,7 +189,7 @@ export function pop(component) {
189189
var component_effect = component_effects[i];
190190
set_active_effect(component_effect.effect);
191191
set_active_reaction(component_effect.reaction);
192-
effect(component_effect.fn);
192+
create_user_effect(component_effect.fn);
193193
}
194194
} finally {
195195
set_active_effect(previous_effect);

packages/svelte/src/internal/client/reactivity/batch.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
EFFECT_ASYNC,
1010
INERT,
1111
RENDER_EFFECT,
12-
ROOT_EFFECT
12+
ROOT_EFFECT,
13+
USER_EFFECT
1314
} from '#client/constants';
1415
import { async_mode_flag } from '../../flags/index.js';
1516
import { deferred, define_property } from '../../shared/utils.js';
@@ -23,7 +24,8 @@ import {
2324
set_is_updating_effect,
2425
set_queued_root_effects,
2526
set_signal_status,
26-
update_effect
27+
update_effect,
28+
write_version
2729
} from '../runtime.js';
2830
import * as e from '../errors.js';
2931
import { flush_tasks } from '../dom/task.js';
@@ -513,7 +515,7 @@ function infinite_loop_guard() {
513515
* @param {Array<Effect>} effects
514516
* @returns {void}
515517
*/
516-
export function flush_queued_effects(effects) {
518+
function flush_queued_effects(effects) {
517519
var length = effects.length;
518520
if (length === 0) return;
519521

@@ -522,6 +524,8 @@ export function flush_queued_effects(effects) {
522524

523525
if ((effect.f & (DESTROYED | INERT)) === 0) {
524526
if (check_dirtiness(effect)) {
527+
var wv = write_version;
528+
525529
update_effect(effect);
526530

527531
// Effects with no dependencies or teardown do not get added to the effect tree.
@@ -538,9 +542,19 @@ export function flush_queued_effects(effects) {
538542
effect.fn = null;
539543
}
540544
}
545+
546+
// if state is written in a user effect, abort and re-schedule, lest we run
547+
// effects that should be removed as a result of the state change
548+
if (write_version > wv && (effect.f & USER_EFFECT) !== 0) {
549+
break;
550+
}
541551
}
542552
}
543553
}
554+
555+
for (; i < length; i += 1) {
556+
schedule_effect(effects[i]);
557+
}
544558
}
545559

546560
/**

packages/svelte/src/internal/client/reactivity/effects.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ import {
3232
MAYBE_DIRTY,
3333
EFFECT_PRESERVED,
3434
BOUNDARY_EFFECT,
35-
STALE_REACTION
35+
STALE_REACTION,
36+
USER_EFFECT
3637
} from '#client/constants';
3738
import * as e from '../errors.js';
3839
import { DEV } from 'esm-env';
@@ -203,11 +204,17 @@ export function user_effect(fn) {
203204
reaction: active_reaction
204205
});
205206
} else {
206-
var signal = effect(fn);
207-
return signal;
207+
return create_user_effect(fn);
208208
}
209209
}
210210

211+
/**
212+
* @param {() => void | (() => void)} fn
213+
*/
214+
export function create_user_effect(fn) {
215+
return create_effect(EFFECT | USER_EFFECT, fn, false);
216+
}
217+
211218
/**
212219
* Internal representation of `$effect.pre(...)`
213220
* @param {() => void | (() => void)} fn
@@ -220,7 +227,7 @@ export function user_pre_effect(fn) {
220227
value: '$effect.pre'
221228
});
222229
}
223-
return render_effect(fn);
230+
return create_effect(RENDER_EFFECT | USER_EFFECT, fn, true);
224231
}
225232

226233
/** @param {() => void | (() => void)} fn */

packages/svelte/src/internal/client/runtime.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export function set_untracked_writes(value) {
133133
* @type {number} Used by sources and deriveds for handling updates.
134134
* Version starts from 1 so that unowned deriveds differentiate between a created effect and a run one for tracing
135135
**/
136-
let write_version = 1;
136+
export let write_version = 1;
137137

138138
/** @type {number} Used to version each read of a source of derived to avoid duplicating depedencies inside a reaction */
139139
let read_version = 0;

0 commit comments

Comments
 (0)