Skip to content

Commit 1b675c0

Browse files
authored
fix: transform textarea and contenteditable binding expressions (#10187)
fixes #10185
1 parent d509de2 commit 1b675c0

File tree

5 files changed

+31
-13
lines changed

5 files changed

+31
-13
lines changed

.changeset/big-cars-serve.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: transform textarea and contenteditable binding expressions

packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2595,16 +2595,14 @@ export const template_visitors = {
25952595
);
25962596
}
25972597

2598-
const getter = b.thunk(
2599-
/** @type {import('estree').Expression} */ (context.visit(node.expression))
2600-
);
2598+
const getter = b.thunk(/** @type {import('estree').Expression} */ (visit(node.expression)));
26012599
const assignment = b.assignment('=', node.expression, b.id('$$value'));
26022600
const setter = b.arrow(
26032601
[b.id('$$value')],
26042602
serialize_set_binding(
26052603
assignment,
26062604
context,
2607-
() => /** @type {import('estree').Expression} */ (context.visit(assignment)),
2605+
() => /** @type {import('estree').Expression} */ (visit(assignment)),
26082606
{
26092607
skip_proxy_and_freeze: true
26102608
}
@@ -2767,9 +2765,7 @@ export const template_visitors = {
27672765
group_getter = b.thunk(
27682766
b.block([
27692767
b.stmt(serialize_attribute_value(value, context)[1]),
2770-
b.return(
2771-
/** @type {import('estree').Expression} */ (context.visit(node.expression))
2772-
)
2768+
b.return(/** @type {import('estree').Expression} */ (visit(node.expression)))
27732769
])
27742770
);
27752771
}

packages/svelte/src/compiler/phases/3-transform/server/transform-server.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1452,9 +1452,6 @@ const template_visitors = {
14521452
context.state.init.push(b.stmt(b.call('$.add_snippet_symbol', node.expression)));
14531453
}
14541454
},
1455-
BindDirective(node, context) {
1456-
// TODO
1457-
},
14581455
Component(node, context) {
14591456
const state = context.state;
14601457
const [dec, id] = serialize_anchor(state);
@@ -1694,9 +1691,19 @@ function serialize_element_attributes(node, context) {
16941691
if (binding?.omit_in_ssr) continue;
16951692

16961693
if (ContentEditableBindings.includes(attribute.name)) {
1697-
content = { escape: false, expression: attribute.expression };
1694+
content = {
1695+
escape: false,
1696+
expression: /** @type {import('estree').Expression} */ (
1697+
context.visit(attribute.expression)
1698+
)
1699+
};
16981700
} else if (attribute.name === 'value' && node.name === 'textarea') {
1699-
content = { escape: true, expression: attribute.expression };
1701+
content = {
1702+
escape: true,
1703+
expression: /** @type {import('estree').Expression} */ (
1704+
context.visit(attribute.expression)
1705+
)
1706+
};
17001707
} else if (attribute.name === 'group') {
17011708
const value_attribute = /** @type {import('#compiler').Attribute | undefined} */ (
17021709
node.attributes.find((attr) => attr.type === 'Attribute' && attr.name === 'value')

packages/svelte/tests/runtime-legacy/samples/binding-store/_config.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@ export default test({
44
html: `
55
<input>
66
<p>hello world</p>
7+
<textarea></textarea>
8+
<div contenteditable="true">world</div>
79
`,
810

911
ssrHtml: `
1012
<input value="world">
1113
<p>hello world</p>
14+
<textarea>world</textarea>
15+
<div contenteditable="true">world</div>
1216
`,
1317

1418
async test({ assert, component, target, window }) {
@@ -34,6 +38,8 @@ export default test({
3438
`
3539
<input>
3640
<p>hello everybody</p>
41+
<textarea></textarea>
42+
<div contenteditable="true">everybody</div>
3743
`
3844
);
3945

@@ -44,6 +50,8 @@ export default test({
4450
`
4551
<input>
4652
<p>hello goodbye</p>
53+
<textarea></textarea>
54+
<div contenteditable="true">goodbye</div>
4755
`
4856
);
4957

packages/svelte/tests/runtime-legacy/samples/binding-store/main.svelte

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@
66
</script>
77

88
<input bind:value={$name}>
9-
<p>hello {$name}</p>
9+
<p>hello {$name}</p>
10+
<textarea bind:value={$name} />
11+
<div contenteditable="true" bind:innerHTML={$name}></div>

0 commit comments

Comments
 (0)