Skip to content

Commit 9f2387b

Browse files
committed
fix: improve ssr output of dynamic textarea elements
1 parent ee4b1f2 commit 9f2387b

File tree

92 files changed

+170
-119
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+170
-119
lines changed

.changeset/nice-avocados-move.md

Lines changed: 5 additions & 0 deletions

packages/svelte/src/compiler/phases/2-analyze/validation.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,22 @@ const validation = {
609609
error(arg, 'invalid-render-spread-argument');
610610
}
611611
}
612+
const is_inside_textarea = context.path.find((n) => {
613+
return (
614+
n.type === 'SvelteElement' &&
615+
n.name === 'svelte:element' &&
616+
n.tag.type === 'Literal' &&
617+
n.tag.value === 'textarea'
618+
);
619+
});
620+
if (is_inside_textarea) {
621+
error(
622+
node,
623+
'invalid-tag-placement',
624+
'inside <textarea> or <svelte:element this="textarea">',
625+
node.expression.name
626+
);
627+
}
612628
},
613629
SvelteHead(node) {
614630
const attribute = node.attributes[0];

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

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,36 +1274,32 @@ const template_visitors = {
12741274
context.state.init.push(el_anchor);
12751275
context.state.template.push(t_expression(anchor_id));
12761276

1277-
const [inner_anchor, inner_id] = serialize_anchor(context.state);
1278-
inner_context.state.init.push(inner_anchor);
1279-
inner_context.state.template.push(t_string('<'), t_expression(tag));
1280-
serialize_element_attributes(node, inner_context);
1281-
inner_context.state.template.push(t_string('>'));
1282-
1283-
const before = serialize_template(inner_context.state.template);
12841277
const main = create_block(node, node.fragment.nodes, {
12851278
...context,
12861279
state: { ...context.state, metadata }
12871280
});
1288-
const after = serialize_template([
1289-
t_expression(inner_id),
1290-
t_string('</'),
1291-
t_expression(tag),
1292-
t_string('>')
1293-
]);
1281+
1282+
serialize_element_attributes(node, inner_context);
12941283

12951284
context.state.template.push(
12961285
t_statement(
12971286
b.if(
12981287
tag,
1299-
b.block([
1300-
...inner_context.state.init,
1301-
...before,
1302-
b.if(
1303-
b.unary('!', b.call('$.VoidElements.has', tag)),
1304-
b.block([...serialize_template([t_expression(inner_id)]), ...main, ...after])
1288+
1289+
b.stmt(
1290+
b.call(
1291+
'$.element',
1292+
b.id('$$payload'),
1293+
tag,
1294+
b.thunk(
1295+
b.block([
1296+
...inner_context.state.init,
1297+
...serialize_template(inner_context.state.template)
1298+
])
1299+
),
1300+
b.thunk(b.block(main))
13051301
)
1306-
])
1302+
)
13071303
)
13081304
),
13091305
t_expression(anchor_id)

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,31 @@ export function assign_payload(p1, p2) {
7979
p1.anchor = p2.anchor;
8080
}
8181

82+
/**
83+
* @param {Payload} payload
84+
* @param {string} tag
85+
* @param {() => void} attributes_fn
86+
* @param {() => void} children_fn
87+
* @returns {void}
88+
*/
89+
export function element(payload, tag, attributes_fn, children_fn) {
90+
payload.out += `<${tag} `;
91+
attributes_fn();
92+
payload.out += `>`;
93+
94+
if (!VoidElements.has(tag)) {
95+
const anchor = tag !== 'textarea' ? create_anchor(payload) : null;
96+
if (anchor !== null) {
97+
payload.out += anchor;
98+
}
99+
children_fn();
100+
if (anchor !== null) {
101+
payload.out += anchor;
102+
}
103+
payload.out += `</${tag}>`;
104+
}
105+
}
106+
82107
/**
83108
* Array of `onDestroy` callbacks that should be called at the end of the server render function
84109
* @type {Function[]}

packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@
3131
}
3232
]
3333
}
34-
}
34+
}

packages/svelte/tests/parser-legacy/samples/action-with-call/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,4 @@
7373
}
7474
]
7575
}
76-
}
76+
}

packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@
3838
}
3939
]
4040
}
41-
}
41+
}

packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@
3939
}
4040
]
4141
}
42-
}
42+
}

packages/svelte/tests/parser-legacy/samples/action/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@
2323
}
2424
]
2525
}
26-
}
26+
}

packages/svelte/tests/parser-legacy/samples/animation/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,4 @@
8888
}
8989
]
9090
}
91-
}
91+
}

packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@
3838
}
3939
]
4040
}
41-
}
41+
}

packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@
3838
}
3939
]
4040
}
41-
}
41+
}

packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,4 @@
5252
}
5353
]
5454
}
55-
}
55+
}

packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,4 @@
4444
}
4545
]
4646
}
47-
}
47+
}

packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,4 @@
8080
}
8181
]
8282
}
83-
}
83+
}

packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,4 @@
105105
}
106106
]
107107
}
108-
}
108+
}

packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@
3030
}
3131
]
3232
}
33-
}
33+
}

packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,4 @@
4545
}
4646
]
4747
}
48-
}
48+
}

packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@
3434
}
3535
]
3636
}
37-
}
37+
}

packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@
2222
}
2323
]
2424
}
25-
}
25+
}

packages/svelte/tests/parser-legacy/samples/attribute-static/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@
3030
}
3131
]
3232
}
33-
}
33+
}

packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
"end": 36,
1616
"type": "StyleDirective",
1717
"name": "color",
18-
"modifiers": ["important"],
18+
"modifiers": [
19+
"important"
20+
],
1921
"value": [
2022
{
2123
"type": "MustacheTag",
@@ -45,4 +47,4 @@
4547
}
4648
]
4749
}
48-
}
50+
}

packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@
2323
}
2424
]
2525
}
26-
}
26+
}

packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,4 +359,4 @@
359359
}
360360
]
361361
}
362-
}
362+
}

packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,4 @@
4545
}
4646
]
4747
}
48-
}
48+
}

packages/svelte/tests/parser-legacy/samples/attribute-style/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@
3838
}
3939
]
4040
}
41-
}
41+
}

packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@
3030
}
3131
]
3232
}
33-
}
33+
}

packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,4 @@
4646
}
4747
]
4848
}
49-
}
49+
}

packages/svelte/tests/parser-legacy/samples/await-catch/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,4 +183,4 @@
183183
}
184184
]
185185
}
186-
}
186+
}

packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,4 +252,4 @@
252252
}
253253
]
254254
}
255-
}
255+
}

packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,4 @@
109109
"sourceType": "module"
110110
}
111111
}
112-
}
112+
}

packages/svelte/tests/parser-legacy/samples/binding/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,4 +119,4 @@
119119
"sourceType": "module"
120120
}
121121
}
122-
}
122+
}

packages/svelte/tests/parser-legacy/samples/comment-with-ignores/output.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
"start": 0,
1010
"end": 30,
1111
"data": " svelte-ignore foo bar ",
12-
"ignores": ["foo", "bar"]
12+
"ignores": [
13+
"foo",
14+
"bar"
15+
]
1316
}
1417
]
1518
}
16-
}
19+
}

packages/svelte/tests/parser-legacy/samples/comment/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
}
1414
]
1515
}
16-
}
16+
}

packages/svelte/tests/parser-legacy/samples/component-dynamic/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,4 @@
7777
}
7878
]
7979
}
80-
}
80+
}

packages/svelte/tests/parser-legacy/samples/convert-entities-in-element/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@
2222
}
2323
]
2424
}
25-
}
25+
}

packages/svelte/tests/parser-legacy/samples/convert-entities/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
}
1414
]
1515
}
16-
}
16+
}

packages/svelte/tests/parser-legacy/samples/css/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,4 @@
8181
"styles": "\n\tdiv {\n\t\tcolor: red;\n\t}\n"
8282
}
8383
}
84-
}
84+
}

packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,4 @@
4747
}
4848
]
4949
}
50-
}
50+
}

packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,4 @@
7777
}
7878
]
7979
}
80-
}
80+
}

packages/svelte/tests/parser-legacy/samples/dynamic-import/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,4 +479,4 @@
479479
"sourceType": "module"
480480
}
481481
}
482-
}
482+
}

packages/svelte/tests/parser-legacy/samples/each-block-destructured/output.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,4 @@
265265
"sourceType": "module"
266266
}
267267
}
268-
}
268+
}

0 commit comments

Comments
 (0)