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 `