Skip to content

Commit 6be30df

Browse files
committed
conflict
2 parents 335a49e + f411f77 commit 6be30df

File tree

15 files changed

+252
-123
lines changed

15 files changed

+252
-123
lines changed

.changeset/eight-jeans-compare.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: improve reactive Map and Set implementations

.changeset/gentle-ties-fetch.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: improve controlled each block cleanup performance

.changeset/pre.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
"eight-carrots-hunt",
111111
"eight-cougars-watch",
112112
"eight-hornets-punch",
113+
"eight-jeans-compare",
113114
"eight-pianos-raise",
114115
"eight-steaks-shout",
115116
"eighty-bikes-camp",
@@ -170,6 +171,7 @@
170171
"gentle-dolls-juggle",
171172
"gentle-sheep-hug",
172173
"gentle-spies-happen",
174+
"gentle-ties-fetch",
173175
"gentle-toys-chew",
174176
"gentle-trees-exercise",
175177
"gentle-wasps-pull",

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.0.0-next.147
4+
5+
### Patch Changes
6+
7+
- fix: improve reactive Map and Set implementations ([#11827](https://github.com/sveltejs/svelte/pull/11827))
8+
9+
- fix: improve controlled each block cleanup performance ([#11839](https://github.com/sveltejs/svelte/pull/11839))
10+
311
## 5.0.0-next.146
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.0.0-next.146",
5+
"version": "5.0.0-next.147",
66
"type": "module",
77
"types": "./types/index.d.ts",
88
"engines": {

packages/svelte/src/internal/client/dev/inspect.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,6 @@ export function inspect(get_value, inspector = console.log) {
6262
*/
6363
function deep_snapshot(value, visited = new Map()) {
6464
if (typeof value === 'object' && value !== null && !visited.has(value)) {
65-
if (DEV) {
66-
// When dealing with ReactiveMap or ReactiveSet, return normal versions
67-
// so that console.log provides better output versions
68-
if (value instanceof Map && value.constructor !== Map) {
69-
return new Map(value);
70-
}
71-
if (value instanceof Set && value.constructor !== Set) {
72-
return new Set(value);
73-
}
74-
}
7565
const unstated = snapshot(value);
7666

7767
if (unstated !== value) {

packages/svelte/src/internal/client/dom/blocks/each.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,20 @@ function pause_effects(items, controlled_anchor, callback) {
6868
pause_children(items[i].e, transitions, true);
6969
}
7070

71+
var is_controlled = length > 0 && transitions.length === 0 && controlled_anchor !== null;
7172
// If we have a controlled anchor, it means that the each block is inside a single
7273
// DOM element, so we can apply a fast-path for clearing the contents of the element.
73-
if (length > 0 && transitions.length === 0 && controlled_anchor !== null) {
74-
var parent_node = /** @type {Element} */ (controlled_anchor.parentNode);
74+
if (is_controlled) {
75+
var parent_node = /** @type {Element} */ (
76+
/** @type {Element} */ (controlled_anchor).parentNode
77+
);
7578
clear_text_content(parent_node);
76-
parent_node.append(controlled_anchor);
79+
parent_node.append(/** @type {Element} */ (controlled_anchor));
7780
}
7881

7982
run_out_transitions(transitions, () => {
8083
for (var i = 0; i < length; i++) {
81-
destroy_effect(items[i].e);
84+
destroy_effect(items[i].e, !is_controlled);
8285
}
8386

8487
if (callback !== undefined) callback();

packages/svelte/src/internal/client/dom/elements/events.js

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -172,38 +172,59 @@ export function handle_event_propagation(handler_element, event) {
172172
}
173173
});
174174

175-
/** @param {Element} next_target */
176-
function next(next_target) {
177-
current_target = next_target;
178-
/** @type {null | Element} */
179-
var parent_element = next_target.parentNode || /** @type {any} */ (next_target).host || null;
180-
181-
try {
182-
// @ts-expect-error
183-
var delegated = next_target['__' + event_name];
184-
185-
if (delegated !== undefined && !(/** @type {any} */ (next_target).disabled)) {
186-
if (is_array(delegated)) {
187-
var [fn, ...data] = delegated;
188-
fn.apply(next_target, [event, ...data]);
175+
try {
176+
/**
177+
* @type {unknown}
178+
*/
179+
var throw_error;
180+
/**
181+
* @type {unknown[]}
182+
*/
183+
var other_errors = [];
184+
while (current_target !== null) {
185+
/** @type {null | Element} */
186+
var parent_element =
187+
current_target.parentNode || /** @type {any} */ (current_target).host || null;
188+
189+
try {
190+
// @ts-expect-error
191+
var delegated = current_target['__' + event_name];
192+
193+
if (delegated !== undefined && !(/** @type {any} */ (current_target).disabled)) {
194+
if (is_array(delegated)) {
195+
var [fn, ...data] = delegated;
196+
fn.apply(current_target, [event, ...data]);
197+
} else {
198+
delegated.call(current_target, event);
199+
}
200+
}
201+
} catch (error) {
202+
if (throw_error) {
203+
other_errors.push(error);
189204
} else {
190-
delegated.call(next_target, event);
205+
throw_error = error;
191206
}
192207
}
193-
} finally {
194208
if (
195-
!event.cancelBubble &&
196-
parent_element !== handler_element &&
197-
parent_element !== null &&
198-
next_target !== handler_element
209+
event.cancelBubble ||
210+
parent_element === handler_element ||
211+
parent_element === null ||
212+
current_target === handler_element
199213
) {
200-
next(parent_element);
214+
break;
201215
}
216+
current_target = parent_element;
202217
}
203-
}
204218

205-
try {
206-
next(/** @type {Element} */ (current_target));
219+
if (throw_error) {
220+
for (let error of other_errors) {
221+
// Throw the rest of the errors, one-by-one on a microtask
222+
queueMicrotask(() => {
223+
throw error;
224+
});
225+
}
226+
throw throw_error;
227+
}
207228
} finally {
208229
// @ts-expect-error is used above
209230
event.__root = handler_element;

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,16 +311,17 @@ export function execute_effect_teardown(effect) {
311311

312312
/**
313313
* @param {import('#client').Effect} effect
314+
* @param {boolean} [remove_dom]
314315
* @returns {void}
315316
*/
316-
export function destroy_effect(effect) {
317+
export function destroy_effect(effect, remove_dom = true) {
317318
var dom = effect.dom;
318319

319-
if (dom !== null) {
320+
if (dom !== null && remove_dom) {
320321
remove(dom);
321322
}
322323

323-
destroy_effect_children(effect);
324+
destroy_effect_children(effect, remove_dom);
324325
remove_reactions(effect, 0);
325326
set_signal_status(effect, DESTROYED);
326327

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,16 +476,17 @@ export function remove_reactions(signal, start_index) {
476476

477477
/**
478478
* @param {import('#client').Reaction} signal
479+
* @param {boolean} [remove_dom]
479480
* @returns {void}
480481
*/
481-
export function destroy_effect_children(signal) {
482+
export function destroy_effect_children(signal, remove_dom = true) {
482483
let effect = signal.first;
483484
signal.first = null;
484485
signal.last = null;
485486
var sibling;
486487
while (effect !== null) {
487488
sibling = effect.next;
488-
destroy_effect(effect);
489+
destroy_effect(effect, remove_dom);
489490
effect = sibling;
490491
}
491492
}

0 commit comments

Comments
 (0)