Skip to content

Commit 6aa40f7

Browse files
authored
fix: handle #await inside #snippet (#2348)
#2342 also removes old versions of snippet and render tag AST
1 parent a8e45c6 commit 6aa40f7

File tree

6 files changed

+41
-55
lines changed

6 files changed

+41
-55
lines changed

packages/svelte2tsx/src/htmlxtojsx_v2/nodes/RenderTag.ts

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,9 @@ export function handleRenderTag(str: MagicString, renderTag: BaseNode): void {
99
str.overwrite(renderTag.start, renderTag.expression.start, ';__sveltets_2_ensureSnippet(', {
1010
contentOnly: true
1111
});
12-
13-
// argument was present until https://github.com/sveltejs/svelte/pull/9988 / https://github.com/sveltejs/svelte/pull/10656,
14-
// remove and only keep last else block at some point
15-
const arg = renderTag.argument || renderTag.arguments?.[renderTag.arguments.length - 1];
16-
17-
if (arg) {
18-
str.overwrite(withTrailingPropertyAccess(str.original, arg.end), renderTag.end, '));');
19-
} else if ('argument' in renderTag || 'arguments' in renderTag) {
20-
str.overwrite(
21-
withTrailingPropertyAccess(str.original, renderTag.expression.end),
22-
renderTag.end,
23-
'());'
24-
);
25-
} else {
26-
str.overwrite(
27-
withTrailingPropertyAccess(str.original, renderTag.expression.end),
28-
renderTag.end,
29-
');'
30-
);
31-
}
12+
str.overwrite(
13+
withTrailingPropertyAccess(str.original, renderTag.expression.end),
14+
renderTag.end,
15+
');'
16+
);
3217
}

packages/svelte2tsx/src/htmlxtojsx_v2/nodes/SnippetBlock.ts

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export function handleSnippet(
3636
str.overwrite(
3737
endSnippet,
3838
snippetBlock.end,
39-
`return __sveltets_2_any(0)}${isImplicitProp ? '' : ';'}`,
39+
`};return __sveltets_2_any(0)}${isImplicitProp ? '' : ';'}`,
4040
{
4141
contentOnly: true
4242
}
@@ -46,18 +46,15 @@ export function handleSnippet(
4646
str.original.indexOf(
4747
'}',
4848
// context was the first iteration in a .next release, remove at some point
49-
snippetBlock.context?.end ||
50-
snippetBlock.parameters?.at(-1)?.end ||
51-
snippetBlock.expression.end
49+
snippetBlock.parameters?.at(-1)?.end || snippetBlock.expression.end
5250
) + 1;
5351

5452
if (isImplicitProp) {
5553
str.overwrite(snippetBlock.start, snippetBlock.expression.start, '', { contentOnly: true });
5654
const transforms: TransformationArray = ['('];
57-
if (snippetBlock.context || snippetBlock.parameters?.length) {
58-
// context was the first iteration in a .next release, remove at some point
59-
const start = snippetBlock.context?.start || snippetBlock.parameters?.[0].start;
60-
const end = snippetBlock.context?.end || snippetBlock.parameters.at(-1).end;
55+
if (snippetBlock.parameters?.length) {
56+
const start = snippetBlock.parameters?.[0].start;
57+
const end = snippetBlock.parameters.at(-1).end;
6158
transforms.push([start, end]);
6259
str.overwrite(snippetBlock.expression.end, start, '', {
6360
contentOnly: true
@@ -66,24 +63,15 @@ export function handleSnippet(
6663
} else {
6764
str.overwrite(snippetBlock.expression.end, startEnd, '', { contentOnly: true });
6865
}
69-
transforms.push(') => {');
66+
transforms.push(') => {async () => {'); // inner async function for potential #await blocks
7067
transforms.push([startEnd, snippetBlock.end]);
7168
component.addProp(
7269
[[snippetBlock.expression.start, snippetBlock.expression.end]],
7370
transforms
7471
);
7572
} else {
7673
let generic = '';
77-
// context was the first iteration in a .next release, remove at some point
78-
if (snippetBlock.context) {
79-
generic = snippetBlock.context.typeAnnotation
80-
? `<${str.original.slice(
81-
snippetBlock.context.typeAnnotation.start + 1,
82-
snippetBlock.context.typeAnnotation.end
83-
)}>`
84-
: // slap any on to it to silence "implicit any" errors; JSDoc people can't add types to snippets
85-
'<any>';
86-
} else if (snippetBlock.parameters?.length) {
74+
if (snippetBlock.parameters?.length) {
8775
generic = `<[${snippetBlock.parameters
8876
.map((p) =>
8977
p.typeAnnotation
@@ -101,16 +89,13 @@ export function handleSnippet(
10189
typeAnnotation + ' = ('
10290
];
10391

104-
// context was the first iteration in a .next release, remove at some point
105-
if (snippetBlock.context) {
106-
transforms.push([snippetBlock.context.start, snippetBlock.context.end]);
107-
} else if (snippetBlock.parameters?.length) {
92+
if (snippetBlock.parameters?.length) {
10893
const start = snippetBlock.parameters[0].start;
10994
const end = snippetBlock.parameters.at(-1).end;
11095
transforms.push([start, end]);
11196
}
11297

113-
transforms.push(') => {');
98+
transforms.push(') => {async () => {'); // inner async function for potential #await blocks
11499
transform(str, snippetBlock.start, startEnd, startEnd, transforms);
115100
}
116101
}

packages/svelte2tsx/test/htmlx2jsx/samples/snippet.v5/expectedv2.js

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,32 @@
1-
var foo/*Ωignore_startΩ*/: import('svelte').Snippet<[any]>/*Ωignore_endΩ*/ = (x) => {
1+
var foo/*Ωignore_startΩ*/: import('svelte').Snippet<[any]>/*Ωignore_endΩ*/ = (x) => {async () => {
22
{ svelteHTML.createElement("div", {}); x; }
3-
return __sveltets_2_any(0)};
3+
};return __sveltets_2_any(0)};
44

5-
var bar/*Ωignore_startΩ*/: import('svelte').Snippet/*Ωignore_endΩ*/ = () => {
5+
var bar/*Ωignore_startΩ*/: import('svelte').Snippet/*Ωignore_endΩ*/ = () => {async () => {
66
{ svelteHTML.createElement("div", {}); }
7-
return __sveltets_2_any(0)};
7+
};return __sveltets_2_any(0)};
8+
9+
var await_inside/*Ωignore_startΩ*/: import('svelte').Snippet/*Ωignore_endΩ*/ = () => {async () => {
10+
{ const $$_value = await (foo);{ const bar = $$_value; bar;}}
11+
};return __sveltets_2_any(0)};
812

913
;__sveltets_2_ensureSnippet(foo(1));
1014
;__sveltets_2_ensureSnippet(bar());
15+
;__sveltets_2_ensureSnippet(await_inside());
1116

12-
{ const $$_tnenopmoC0C = __sveltets_2_ensureComponent(Component); new $$_tnenopmoC0C({ target: __sveltets_2_any(), props: {children:() => { return __sveltets_2_any(0); },bar:(x) => {
17+
{ const $$_tnenopmoC0C = __sveltets_2_ensureComponent(Component); new $$_tnenopmoC0C({ target: __sveltets_2_any(), props: {children:() => { return __sveltets_2_any(0); },bar:(x) => {async () => {
1318
{ svelteHTML.createElement("div", {}); x; }
14-
return __sveltets_2_any(0)},}});
19+
};return __sveltets_2_any(0)},}});
1520
{ svelteHTML.createElement("div", {});asd; }
1621

1722
Component}
1823

19-
{ const $$_tsiL0C = __sveltets_2_ensureComponent(List); new $$_tsiL0C({ target: __sveltets_2_any(), props: { "data":[1, 2, 3],row:(item) => {
24+
{ const $$_tsiL0C = __sveltets_2_ensureComponent(List); new $$_tsiL0C({ target: __sveltets_2_any(), props: {
25+
"data":[1, 2, 3],row:(item) => {async () => {
2026
item;
21-
return __sveltets_2_any(0)},}});
27+
};return __sveltets_2_any(0)},await_inside:() => {async () => {
28+
{ const $$_value = await (foo);{ const bar = $$_value; bar;}}
29+
};return __sveltets_2_any(0)},}});
2230

2331
List}
2432

packages/svelte2tsx/test/htmlx2jsx/samples/snippet.v5/input.svelte

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@
66
<div>asd</div>
77
{/snippet}
88

9+
{#snippet await_inside()}
10+
{#await foo then bar}{bar}{/await}
11+
{/snippet}
12+
913
{@render foo(1)}
1014
{@render bar()}
15+
{@render await_inside()}
1116

1217
<Component>
1318
<div>{asd}</div>
@@ -20,6 +25,9 @@
2025
{#snippet row(item)}
2126
{item}
2227
{/snippet}
28+
{#snippet await_inside()}
29+
{#await foo then bar}{bar}{/await}
30+
{/snippet}
2331
</List>
2432

2533
<List>

packages/svelte2tsx/test/htmlx2jsx/samples/ts-in-template.v5/expectedv2.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ try { const $$_value = await (foo as Promise<void>);{ const result: any = $$_val
1616

1717
item as string;
1818

19-
var foo/*Ωignore_startΩ*/: import('svelte').Snippet<[ string]>/*Ωignore_endΩ*/ = (bar: string) => { return __sveltets_2_any(0)};
19+
var foo/*Ωignore_startΩ*/: import('svelte').Snippet<[ string]>/*Ωignore_endΩ*/ = (bar: string) => {async () => { };return __sveltets_2_any(0)};
2020

2121
;__sveltets_2_ensureSnippet(foo(bar as string));
2222

packages/svelte2tsx/test/svelte2tsx/samples/snippet-instance-script.v5/expectedv2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
///<reference types="svelte" />
22
;function render() {
3-
var bar/*Ωignore_startΩ*/: import('svelte').Snippet/*Ωignore_endΩ*/ = () => { foo;
4-
return __sveltets_2_any(0)};
3+
var bar/*Ωignore_startΩ*/: import('svelte').Snippet/*Ωignore_endΩ*/ = () => {async () => { foo;
4+
};return __sveltets_2_any(0)};
55
let foo = true;
66
bar;
77
;

0 commit comments

Comments
 (0)