From 94d80c6e2c456d79a283164ae11f3991745be97d Mon Sep 17 00:00:00 2001 From: Shay Molcho <152275799+shaymolcho@users.noreply.github.com> Date: Mon, 27 Jan 2025 01:59:58 +0200 Subject: [PATCH 1/5] Added missing period for consistency and readability (#15114) Added a missing period in a specific part of the text to maintain consistency across the document. This ensures a uniform writing style, improves readability, and aligns with the formatting used throughout the content. --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f7d15f905e..0e2628f84f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -51,7 +51,7 @@ We use [GitHub issues](https://github.com/sveltejs/svelte/issues) for our public If you have questions about using Svelte, contact us on Discord at [svelte.dev/chat](https://svelte.dev/chat), and we will do our best to answer your questions. -If you see anything you'd like to be implemented, create a [feature request issue](https://github.com/sveltejs/svelte/issues/new?template=feature_request.yml) +If you see anything you'd like to be implemented, create a [feature request issue](https://github.com/sveltejs/svelte/issues/new?template=feature_request.yml). ### Reporting new issues From 0e0f01ee1cfe11461f799c034030840a1b7cd763 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 27 Jan 2025 08:13:13 -0500 Subject: [PATCH 2/5] fix: disallow $state/$derived in const tags (#15115) --- .changeset/strong-shoes-whisper.md | 5 +++++ .../phases/2-analyze/visitors/CallExpression.js | 3 ++- .../const-tag-invalid-rune-usage/errors.json | 14 ++++++++++++++ .../const-tag-invalid-rune-usage/input.svelte | 3 +++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 .changeset/strong-shoes-whisper.md create mode 100644 packages/svelte/tests/validator/samples/const-tag-invalid-rune-usage/errors.json create mode 100644 packages/svelte/tests/validator/samples/const-tag-invalid-rune-usage/input.svelte diff --git a/.changeset/strong-shoes-whisper.md b/.changeset/strong-shoes-whisper.md new file mode 100644 index 0000000000..ea7f8d6c5e --- /dev/null +++ b/.changeset/strong-shoes-whisper.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: disallow $state/$derived in const tags diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js index 96788d9f93..0a6b3f3ee5 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js @@ -79,7 +79,8 @@ export function CallExpression(node, context) { case '$derived': case '$derived.by': if ( - parent.type !== 'VariableDeclarator' && + (parent.type !== 'VariableDeclarator' || + get_parent(context.path, -3).type === 'ConstTag') && !(parent.type === 'PropertyDefinition' && !parent.static && !parent.computed) ) { e.state_invalid_placement(node, rune); diff --git a/packages/svelte/tests/validator/samples/const-tag-invalid-rune-usage/errors.json b/packages/svelte/tests/validator/samples/const-tag-invalid-rune-usage/errors.json new file mode 100644 index 0000000000..32594e4268 --- /dev/null +++ b/packages/svelte/tests/validator/samples/const-tag-invalid-rune-usage/errors.json @@ -0,0 +1,14 @@ +[ + { + "code": "state_invalid_placement", + "message": "`$derived(...)` can only be used as a variable declaration initializer or a class field", + "start": { + "line": 2, + "column": 15 + }, + "end": { + "line": 2, + "column": 26 + } + } +] diff --git a/packages/svelte/tests/validator/samples/const-tag-invalid-rune-usage/input.svelte b/packages/svelte/tests/validator/samples/const-tag-invalid-rune-usage/input.svelte new file mode 100644 index 0000000000..a056058cc5 --- /dev/null +++ b/packages/svelte/tests/validator/samples/const-tag-invalid-rune-usage/input.svelte @@ -0,0 +1,3 @@ +{#snippet test()} + {@const der = $derived(0)} +{/snippet} \ No newline at end of file From 3f8ce21f4709fe555fcc5ffc63728c6e8d139781 Mon Sep 17 00:00:00 2001 From: Elliott Johnson Date: Mon, 27 Jan 2025 13:55:49 -0700 Subject: [PATCH 3/5] fix: Add `bind:focused` to `HTMLAttributes` (#15122) * Revert "fix: ensure untrack correctly retains the active reaction (#15065)" This reverts commit 2ad519542dcba2d7802394068d412bb73d9cb803. * feat: Add `bind:focused` to `HTMLAttributes` * Revert "Revert "fix: ensure untrack correctly retains the active reaction (#15065)"" This reverts commit f4e98bf89f80cc332703c1da3c2bd3d1451d1dce. * changeset * tests --- .changeset/eleven-scissors-cheat.md | 5 +++++ packages/svelte/elements.d.ts | 1 + packages/svelte/tests/types/bindings.svelte | 8 ++++++++ 3 files changed, 14 insertions(+) create mode 100644 .changeset/eleven-scissors-cheat.md create mode 100644 packages/svelte/tests/types/bindings.svelte diff --git a/.changeset/eleven-scissors-cheat.md b/.changeset/eleven-scissors-cheat.md new file mode 100644 index 0000000000..5aa577d95d --- /dev/null +++ b/.changeset/eleven-scissors-cheat.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: Add `bind:focused` property to `HTMLAttributes` type diff --git a/packages/svelte/elements.d.ts b/packages/svelte/elements.d.ts index 96f1589800..6d256b5620 100644 --- a/packages/svelte/elements.d.ts +++ b/packages/svelte/elements.d.ts @@ -839,6 +839,7 @@ export interface HTMLAttributes extends AriaAttributes, D readonly 'bind:contentBoxSize'?: Array | undefined | null; readonly 'bind:borderBoxSize'?: Array | undefined | null; readonly 'bind:devicePixelContentBoxSize'?: Array | undefined | null; + readonly 'bind:focused'?: boolean | undefined | null; // SvelteKit 'data-sveltekit-keepfocus'?: true | '' | 'off' | undefined | null; diff --git a/packages/svelte/tests/types/bindings.svelte b/packages/svelte/tests/types/bindings.svelte new file mode 100644 index 0000000000..ce99b2c296 --- /dev/null +++ b/packages/svelte/tests/types/bindings.svelte @@ -0,0 +1,8 @@ + + + + + +
From fc4dd2dec4387933579762f1cf4113a26cc1e22b Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Tue, 28 Jan 2025 13:15:12 +0000 Subject: [PATCH 4/5] fix: lazily connect derievds (in deriveds) to their parent (#15129) --- .changeset/few-beans-bow.md | 5 ++++ .../internal/client/reactivity/deriveds.js | 4 --- .../svelte/src/internal/client/runtime.js | 24 ++++++++++------- packages/svelte/tests/signals/test.ts | 27 +++++++++++++++++++ 4 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 .changeset/few-beans-bow.md diff --git a/.changeset/few-beans-bow.md b/.changeset/few-beans-bow.md new file mode 100644 index 0000000000..5c17c242a8 --- /dev/null +++ b/.changeset/few-beans-bow.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: lazily connect derievds (in deriveds) to their parent diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index 7ec1ed30bd..da5a75eb6e 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -68,10 +68,6 @@ export function derived(fn) { signal.created = get_stack('CreatedAt'); } - if (parent_derived !== null) { - (parent_derived.children ??= []).push(signal); - } - return signal; } diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 1d695e1fee..a002665b51 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -957,26 +957,30 @@ export function get(signal) { new_deps.push(signal); } } - } else if (is_derived && /** @type {Derived} */ (signal).deps === null) { + } + + if ( + is_derived && + /** @type {Derived} */ (signal).deps === null && + (active_reaction === null || untracking || (active_reaction.f & DERIVED) !== 0) + ) { var derived = /** @type {Derived} */ (signal); var parent = derived.parent; - var target = derived; - while (parent !== null) { - // Attach the derived to the nearest parent effect, if there are deriveds - // in between then we also need to attach them too + if (parent !== null) { + // Attach the derived to the nearest parent effect or derived if ((parent.f & DERIVED) !== 0) { var parent_derived = /** @type {Derived} */ (parent); - target = parent_derived; - parent = parent_derived.parent; + if (!parent_derived.children?.includes(derived)) { + (parent_derived.children ??= []).push(derived); + } } else { var parent_effect = /** @type {Effect} */ (parent); - if (!parent_effect.deriveds?.includes(target)) { - (parent_effect.deriveds ??= []).push(target); + if (!parent_effect.deriveds?.includes(derived)) { + (parent_effect.deriveds ??= []).push(derived); } - break; } } } diff --git a/packages/svelte/tests/signals/test.ts b/packages/svelte/tests/signals/test.ts index e147fd1d0d..5f0b93e136 100644 --- a/packages/svelte/tests/signals/test.ts +++ b/packages/svelte/tests/signals/test.ts @@ -803,6 +803,33 @@ describe('signals', () => { }; }); + test('nested deriveds do not connect inside parent deriveds if unused', () => { + return () => { + let a = render_effect(() => {}); + let b: Derived | undefined; + + const destroy = effect_root(() => { + a = render_effect(() => { + $.untrack(() => { + b = derived(() => { + derived(() => {}); + derived(() => {}); + derived(() => {}); + }); + $.get(b); + }); + }); + }); + + assert.deepEqual(a.deriveds?.length, 1); + assert.deepEqual(b?.children, null); + + destroy(); + + assert.deepEqual(a.deriveds, null); + }; + }); + test('deriveds containing effects work correctly when used with untrack', () => { return () => { let a = render_effect(() => {}); From b2c8224a734511ad33e2fb7f4ce8309d4e722554 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Jan 2025 13:29:21 +0000 Subject: [PATCH 5/5] Version Packages (#15118) Co-authored-by: github-actions[bot] --- .changeset/eleven-scissors-cheat.md | 5 ----- .changeset/few-beans-bow.md | 5 ----- .changeset/strong-shoes-whisper.md | 5 ----- packages/svelte/CHANGELOG.md | 10 ++++++++++ packages/svelte/package.json | 2 +- packages/svelte/src/version.js | 2 +- 6 files changed, 12 insertions(+), 17 deletions(-) delete mode 100644 .changeset/eleven-scissors-cheat.md delete mode 100644 .changeset/few-beans-bow.md delete mode 100644 .changeset/strong-shoes-whisper.md diff --git a/.changeset/eleven-scissors-cheat.md b/.changeset/eleven-scissors-cheat.md deleted file mode 100644 index 5aa577d95d..0000000000 --- a/.changeset/eleven-scissors-cheat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'svelte': patch ---- - -fix: Add `bind:focused` property to `HTMLAttributes` type diff --git a/.changeset/few-beans-bow.md b/.changeset/few-beans-bow.md deleted file mode 100644 index 5c17c242a8..0000000000 --- a/.changeset/few-beans-bow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'svelte': patch ---- - -fix: lazily connect derievds (in deriveds) to their parent diff --git a/.changeset/strong-shoes-whisper.md b/.changeset/strong-shoes-whisper.md deleted file mode 100644 index ea7f8d6c5e..0000000000 --- a/.changeset/strong-shoes-whisper.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'svelte': patch ---- - -fix: disallow $state/$derived in const tags diff --git a/packages/svelte/CHANGELOG.md b/packages/svelte/CHANGELOG.md index ba912c1dd8..3b42ad6927 100644 --- a/packages/svelte/CHANGELOG.md +++ b/packages/svelte/CHANGELOG.md @@ -1,5 +1,15 @@ # svelte +## 5.19.4 + +### Patch Changes + +- fix: Add `bind:focused` property to `HTMLAttributes` type ([#15122](https://github.com/sveltejs/svelte/pull/15122)) + +- fix: lazily connect derievds (in deriveds) to their parent ([#15129](https://github.com/sveltejs/svelte/pull/15129)) + +- fix: disallow $state/$derived in const tags ([#15115](https://github.com/sveltejs/svelte/pull/15115)) + ## 5.19.3 ### Patch Changes diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 76ce768cb5..f94992e42e 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -2,7 +2,7 @@ "name": "svelte", "description": "Cybernetically enhanced web apps", "license": "MIT", - "version": "5.19.3", + "version": "5.19.4", "type": "module", "types": "./types/index.d.ts", "engines": { diff --git a/packages/svelte/src/version.js b/packages/svelte/src/version.js index 0e5fec3b81..b45197aa9c 100644 --- a/packages/svelte/src/version.js +++ b/packages/svelte/src/version.js @@ -4,5 +4,5 @@ * The current version, as set in package.json. * @type {string} */ -export const VERSION = '5.19.3'; +export const VERSION = '5.19.4'; export const PUBLIC_VERSION = '5';