Skip to content

Commit e2fc04d

Browse files
authored
fix: improve template literal expression output generation (#10147)
* fix: improve template literal expression output generation * do not proxy template literal
1 parent a13c946 commit e2fc04d

File tree

14 files changed

+151
-3
lines changed

14 files changed

+151
-3
lines changed

.changeset/eighty-days-cheat.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: improve template literal expression output generation

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,7 @@ export function should_proxy_or_freeze(node) {
615615
if (
616616
!node ||
617617
node.type === 'Literal' ||
618+
node.type === 'TemplateLiteral' ||
618619
node.type === 'ArrowFunctionExpression' ||
619620
node.type === 'FunctionExpression' ||
620621
node.type === 'UnaryExpression' ||

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1663,6 +1663,11 @@ function serialize_template_literal(values, visit, state) {
16631663
if (node.type === 'Text') {
16641664
const last = /** @type {import('estree').TemplateElement} */ (quasis.at(-1));
16651665
last.value.raw += sanitize_template_string(node.data);
1666+
} else if (node.type === 'ExpressionTag' && node.expression.type === 'Literal') {
1667+
const last = /** @type {import('estree').TemplateElement} */ (quasis.at(-1));
1668+
if (node.expression.value != null) {
1669+
last.value.raw += sanitize_template_string(node.expression.value + '');
1670+
}
16661671
} else {
16671672
if (node.type === 'ExpressionTag' && node.metadata.contains_call_expression) {
16681673
contains_call_expression = true;

packages/svelte/src/internal/client/render.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2803,7 +2803,7 @@ export function mount(component, options) {
28032803
).c = options.context;
28042804
}
28052805
// @ts-expect-error the public typings are not what the actual function looks like
2806-
accessors = component(anchor, options.props || {}, options.events || {});
2806+
accessors = component(anchor, options.props || {});
28072807
if (options.context) {
28082808
pop();
28092809
}

packages/svelte/tests/snapshot/samples/dynamic-attributes-casing/_expected/client/main.svelte.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,4 @@ export default function Main($$anchor, $$props) {
4545

4646
$.close_frag($$anchor, fragment);
4747
$.pop();
48-
}
48+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { test } from '../../test';
2+
3+
export default test({});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// index.svelte (Svelte VERSION)
2+
// Note: compiler output will change before 5.0 is released!
3+
import "svelte/internal/disclose-version";
4+
import * as $ from "svelte/internal";
5+
6+
export default function Each_string_template($$anchor, $$props) {
7+
$.push($$props, false);
8+
9+
/* Init */
10+
var fragment = $.comment($$anchor);
11+
var node = $.child_frag(fragment);
12+
13+
$.each_indexed(
14+
node,
15+
() => ['foo', 'bar', 'baz'],
16+
1,
17+
($$anchor, thing, $$index) => {
18+
/* Init */
19+
var node_1 = $.space($$anchor);
20+
21+
/* Update */
22+
$.text_effect(node_1, () => `${$.stringify($.unwrap(thing))}, `);
23+
$.close($$anchor, node_1);
24+
},
25+
null
26+
);
27+
28+
$.close_frag($$anchor, fragment);
29+
$.pop();
30+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// index.svelte (Svelte VERSION)
2+
// Note: compiler output will change before 5.0 is released!
3+
import * as $ from "svelte/internal/server";
4+
5+
export default function Each_string_template($$payload, $$props) {
6+
$.push(false);
7+
8+
const anchor = $.create_anchor($$payload);
9+
const each_array = $.ensure_array_like(['foo', 'bar', 'baz']);
10+
11+
$$payload.out += `${anchor}`;
12+
13+
for (let $$index = 0; $$index < each_array.length; $$index++) {
14+
const thing = each_array[$$index];
15+
const anchor_1 = $.create_anchor($$payload);
16+
17+
$$payload.out += `${anchor_1}${$.escape(thing)},${$.escape(' ')}${anchor_1}`;
18+
}
19+
20+
$$payload.out += `${anchor}`;
21+
$.pop();
22+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{#each ['foo', 'bar', 'baz'] as thing}
2+
{thing},{' '}
3+
{/each}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { test } from '../../test';
2+
3+
export default test({});

0 commit comments

Comments
 (0)