Skip to content

Commit 04c38b0

Browse files
fix: allow binding to const with spread in legacy mode (#13849)
1 parent 4fbd2a6 commit 04c38b0

File tree

6 files changed

+47
-1
lines changed

6 files changed

+47
-1
lines changed

.changeset/nine-pigs-approve.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: allow binding to const with spread in legacy mode

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,19 @@ const spread_props_handler = {
177177
if (typeof p === 'object' && p !== null && key in p) return p[key];
178178
}
179179
},
180+
set(target, key, value) {
181+
let i = target.props.length;
182+
while (i--) {
183+
let p = target.props[i];
184+
if (is_function(p)) p = p();
185+
const desc = get_descriptor(p, key);
186+
if (desc && desc.set) {
187+
desc.set(value);
188+
return true;
189+
}
190+
}
191+
return false;
192+
},
180193
getOwnPropertyDescriptor(target, key) {
181194
let i = target.props.length;
182195
while (i--) {

packages/svelte/src/internal/server/index.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,12 @@ export function spread_props(props) {
270270
for (let i = 0; i < props.length; i++) {
271271
const obj = props[i];
272272
for (key in obj) {
273-
merged_props[key] = obj[key];
273+
const desc = Object.getOwnPropertyDescriptor(obj, key);
274+
if (desc) {
275+
Object.defineProperty(merged_props, key, desc);
276+
} else {
277+
merged_props[key] = obj[key];
278+
}
274279
}
275280
}
276281
return merged_props;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<script>
2+
export const x = 42;
3+
</script>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
html: `<p>42</p>`,
5+
async test({ target, assert }) {
6+
const p = target.querySelector('p');
7+
assert.equal(p?.innerHTML, '42');
8+
}
9+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script>
2+
import Test from "./Test.svelte";
3+
4+
let x;
5+
</script>
6+
7+
<Test
8+
bind:x
9+
{...{}}
10+
/>
11+
<p>{x}</p>

0 commit comments

Comments
 (0)