From 8ebbb3c7bccfba4f509456b5b4f5b81ccf13d65c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 1 Nov 2025 23:35:20 +0100 Subject: [PATCH 1/2] fix: preserve symbols when creating derived rest properties (#17096) fixes #17094 --- .changeset/sixty-comics-bow.md | 5 +++++ packages/svelte/src/internal/client/runtime.js | 14 ++++++++++---- .../derived-rest-includes-symbol/_config.js | 5 +++++ .../derived-rest-includes-symbol/main.svelte | 8 ++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 .changeset/sixty-comics-bow.md create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/main.svelte diff --git a/.changeset/sixty-comics-bow.md b/.changeset/sixty-comics-bow.md new file mode 100644 index 0000000000..2463e52430 --- /dev/null +++ b/.changeset/sixty-comics-bow.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: preserve symbols when creating derived rest properties diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 2197f34d16..6485d21ec2 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -763,12 +763,12 @@ export function set_signal_status(signal, status) { } /** - * @param {Record} obj - * @param {string[]} keys - * @returns {Record} + * @param {Record} obj + * @param {Array} keys + * @returns {Record} */ export function exclude_from_object(obj, keys) { - /** @type {Record} */ + /** @type {Record} */ var result = {}; for (var key in obj) { @@ -777,6 +777,12 @@ export function exclude_from_object(obj, keys) { } } + for (var symbol of Object.getOwnPropertySymbols(obj)) { + if (!keys.includes(symbol)) { + result[symbol] = obj[symbol]; + } + } + return result; } diff --git a/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/_config.js new file mode 100644 index 0000000000..eec60928a2 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: `

42

` +}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/main.svelte new file mode 100644 index 0000000000..ee161696e1 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/main.svelte @@ -0,0 +1,8 @@ + + +

{b[symbol]}

From b7625fd42c067b7cd03fea9589ef45349f9dedbe Mon Sep 17 00:00:00 2001 From: 7nik Date: Sun, 2 Nov 2025 11:40:32 +0200 Subject: [PATCH 2/2] fix: do not spread non-enumerable symbols (#17097) --- packages/svelte/src/internal/client/runtime.js | 2 +- .../samples/derived-rest-includes-symbol/_config.js | 2 +- .../samples/derived-rest-includes-symbol/main.svelte | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 6485d21ec2..76531d3320 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -778,7 +778,7 @@ export function exclude_from_object(obj, keys) { } for (var symbol of Object.getOwnPropertySymbols(obj)) { - if (!keys.includes(symbol)) { + if (Object.propertyIsEnumerable.call(obj, symbol) && !keys.includes(symbol)) { result[symbol] = obj[symbol]; } } diff --git a/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/_config.js index eec60928a2..d0633983d2 100644 --- a/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/_config.js @@ -1,5 +1,5 @@ import { test } from '../../test'; export default test({ - html: `

42

` + html: `

true false

` }); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/main.svelte index ee161696e1..2454e98ab7 100644 --- a/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/derived-rest-includes-symbol/main.svelte @@ -1,8 +1,11 @@ -

{b[symbol]}

+

{symbol1 in b} {symbol2 in b}