From 5b30fbfb0ba97bf031cb4b18cfac4bc45d54daf3 Mon Sep 17 00:00:00 2001
From: 7nik
Date: Mon, 3 Feb 2025 11:11:40 +0200
Subject: [PATCH 1/5] fix: encounter svelte:element in blocks as sibling during
pruning css (#15165)
Fixes #14890
---
.changeset/sweet-mails-clean.md | 5 +++++
.../compiler/phases/2-analyze/css/css-prune.js | 17 +++++++++--------
.../_config.js | 8 ++++----
.../expected.css | 3 +++
.../input.svelte | 6 ++++++
5 files changed, 27 insertions(+), 12 deletions(-)
create mode 100644 .changeset/sweet-mails-clean.md
diff --git a/.changeset/sweet-mails-clean.md b/.changeset/sweet-mails-clean.md
new file mode 100644
index 0000000000..f82913abf7
--- /dev/null
+++ b/.changeset/sweet-mails-clean.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: encounter svelte:element in blocks as sibling during pruning css
diff --git a/packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js b/packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js
index e719895798..fc8108e46e 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js
@@ -933,11 +933,9 @@ function get_possible_element_siblings(node, adjacent_only, seen = new Set()) {
/**
* @param {Compiler.AST.EachBlock | Compiler.AST.IfBlock | Compiler.AST.AwaitBlock | Compiler.AST.KeyBlock | Compiler.AST.SlotElement} node
* @param {boolean} adjacent_only
- * @returns {Map}
+ * @returns {Map}
*/
function get_possible_last_child(node, adjacent_only) {
- /** @typedef {Map} NodeMap */
-
/** @type {Array} */
let fragments = [];
@@ -960,7 +958,7 @@ function get_possible_last_child(node, adjacent_only) {
break;
}
- /** @type {NodeMap} */
+ /** @type {Map} NodeMap */
const result = new Map();
let exhaustive = node.type !== 'SlotElement';
@@ -1001,9 +999,10 @@ function has_definite_elements(result) {
}
/**
- * @template T
- * @param {Map} from
- * @param {Map} to
+ * @template T2
+ * @template {T2} T1
+ * @param {Map} from
+ * @param {Map} to
* @returns {void}
*/
function add_to_map(from, to) {
@@ -1028,7 +1027,7 @@ function higher_existence(exist1, exist2) {
* @param {boolean} adjacent_only
*/
function loop_child(children, adjacent_only) {
- /** @type {Map} */
+ /** @type {Map} */
const result = new Map();
let i = children.length;
@@ -1041,6 +1040,8 @@ function loop_child(children, adjacent_only) {
if (adjacent_only) {
break;
}
+ } else if (child.type === 'SvelteElement') {
+ result.set(child, NODE_PROBABLY_EXISTS);
} else if (is_block(child)) {
const child_result = get_possible_last_child(child, adjacent_only);
add_to_map(child_result, result);
diff --git a/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/_config.js b/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/_config.js
index 7c50a76bbb..a7d6c3a99d 100644
--- a/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/_config.js
+++ b/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/_config.js
@@ -5,15 +5,15 @@ export default test({
{
code: 'css_unused_selector',
end: {
- character: 496,
+ character: 627,
column: 10,
- line: 26
+ line: 32
},
message: 'Unused CSS selector ".x + .bar"',
start: {
- character: 487,
+ character: 618,
column: 1,
- line: 26
+ line: 32
}
}
]
diff --git a/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/expected.css b/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/expected.css
index 830d366702..d3fa8c97d2 100644
--- a/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/expected.css
+++ b/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/expected.css
@@ -9,5 +9,8 @@
.x.svelte-xyz ~ .foo:where(.svelte-xyz) span:where(.svelte-xyz) { color: green; }
.x.svelte-xyz ~ .bar:where(.svelte-xyz) { color: green; }
+ .z.svelte-xyz + .z:where(.svelte-xyz) { color: green; }
+ .z.svelte-xyz ~ .z:where(.svelte-xyz) { color: green; }
+
/* no match */
/* (unused) .x + .bar { color: green; }*/
diff --git a/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/input.svelte b/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/input.svelte
index 1c51a2c516..655fd86153 100644
--- a/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/input.svelte
+++ b/packages/svelte/tests/css/samples/general-siblings-combinator-svelteelement/input.svelte
@@ -10,6 +10,9 @@
bar
+{#each [1]}
+
+{/each}
From e12fe8795ca2b86a9509c8924fb0fe07a8858d03 Mon Sep 17 00:00:00 2001
From: pgliang001 <65393356+pgliang001@users.noreply.github.com>
Date: Mon, 3 Feb 2025 17:13:30 +0800
Subject: [PATCH 2/5] chore: simplify assignment expression (#15177)
---
packages/svelte/src/internal/client/render.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js
index bc74047f64..3256fe8274 100644
--- a/packages/svelte/src/internal/client/render.js
+++ b/packages/svelte/src/internal/client/render.js
@@ -55,7 +55,7 @@ export function set_text(text, value) {
if (str !== (text.__t ??= text.nodeValue)) {
// @ts-expect-error
text.__t = str;
- text.nodeValue = str == null ? '' : str + '';
+ text.nodeValue = str + '';
}
}
From e0b3dc020cb0ee693635d3ad9711a39689c32da6 Mon Sep 17 00:00:00 2001
From: Dominic Gannaway
Date: Mon, 3 Feb 2025 17:20:29 +0000
Subject: [PATCH 3/5] chore: remove unused code from signal logic (#15195)
---
.changeset/blue-sheep-joke.md | 5 +++++
.../src/internal/client/reactivity/deriveds.js | 12 ------------
.../src/internal/client/reactivity/effects.js | 2 +-
packages/svelte/src/internal/client/runtime.js | 16 +---------------
4 files changed, 7 insertions(+), 28 deletions(-)
create mode 100644 .changeset/blue-sheep-joke.md
diff --git a/.changeset/blue-sheep-joke.md b/.changeset/blue-sheep-joke.md
new file mode 100644
index 0000000000..1d9ff973c5
--- /dev/null
+++ b/.changeset/blue-sheep-joke.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+chore: remove unused code from signal logic
diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js
index 1f65ff38c3..60b55970e6 100644
--- a/packages/svelte/src/internal/client/reactivity/deriveds.js
+++ b/packages/svelte/src/internal/client/reactivity/deriveds.js
@@ -176,15 +176,3 @@ export function update_derived(derived) {
derived.wv = increment_write_version();
}
}
-
-/**
- * @param {Derived} derived
- * @returns {void}
- */
-export function destroy_derived(derived) {
- destroy_derived_effects(derived);
- remove_reactions(derived, 0);
- set_signal_status(derived, DESTROYED);
-
- derived.v = derived.deps = derived.ctx = derived.reactions = null;
-}
diff --git a/packages/svelte/src/internal/client/reactivity/effects.js b/packages/svelte/src/internal/client/reactivity/effects.js
index d014ff793d..eab6c767f8 100644
--- a/packages/svelte/src/internal/client/reactivity/effects.js
+++ b/packages/svelte/src/internal/client/reactivity/effects.js
@@ -42,7 +42,7 @@ import * as e from '../errors.js';
import { DEV } from 'esm-env';
import { define_property } from '../../shared/utils.js';
import { get_next_sibling } from '../dom/operations.js';
-import { derived, destroy_derived } from './deriveds.js';
+import { derived } from './deriveds.js';
import { component_context, dev_current_component_function } from '../context.js';
/**
diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js
index a572e27bf4..57cefccc01 100644
--- a/packages/svelte/src/internal/client/runtime.js
+++ b/packages/svelte/src/internal/client/runtime.js
@@ -27,12 +27,7 @@ import {
} from './constants.js';
import { flush_tasks } from './dom/task.js';
import { internal_set } from './reactivity/sources.js';
-import {
- destroy_derived,
- destroy_derived_effects,
- execute_derived,
- update_derived
-} from './reactivity/deriveds.js';
+import { destroy_derived_effects, update_derived } from './reactivity/deriveds.js';
import * as e from './errors.js';
import { FILENAME } from '../../constants.js';
import { tracing_mode_flag } from '../flags/index.js';
@@ -919,15 +914,6 @@ export function get(signal) {
var flags = signal.f;
var is_derived = (flags & DERIVED) !== 0;
- // If the derived is destroyed, just execute it again without retaining
- // its memoisation properties as the derived is stale
- if (is_derived && (flags & DESTROYED) !== 0) {
- var value = execute_derived(/** @type {Derived} */ (signal));
- // Ensure the derived remains destroyed
- destroy_derived(/** @type {Derived} */ (signal));
- return value;
- }
-
if (captured_signals !== null) {
captured_signals.add(signal);
}
From e1014e30160dfbca414bfa907d77f30f8e4f0204 Mon Sep 17 00:00:00 2001
From: Scott Wu
Date: Tue, 4 Feb 2025 01:21:28 +0800
Subject: [PATCH 4/5] Update 11-bind.md (#15192)
---
documentation/docs/03-template-syntax/11-bind.md | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/documentation/docs/03-template-syntax/11-bind.md b/documentation/docs/03-template-syntax/11-bind.md
index e56c2b4f77..119f87ed8e 100644
--- a/documentation/docs/03-template-syntax/11-bind.md
+++ b/documentation/docs/03-template-syntax/11-bind.md
@@ -219,11 +219,10 @@ You can give the `