Skip to content

Commit d2518f3

Browse files
authored
fix await typing issue (#378)
1. Now use helper function for then 2. Support `PromiseLike` 3. Support await on anything 4. fix hover on then value (sourcemap issue)
1 parent 8e3c8b5 commit d2518f3

File tree

12 files changed

+59
-53
lines changed

12 files changed

+59
-53
lines changed

packages/svelte2tsx/src/htmlxtojsx.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ export function convertHtmlxToJsx(
517517
const handleAwait = (awaitBlock: Node) => {
518518
str.overwrite(awaitBlock.start, awaitBlock.expression.start, '{() => {let _$$p = (');
519519
// then value } | {:then value} ->
520-
// _$$p.then((value) => {<>
520+
// __sveltets_awaitThen(_$$p, (value) => {<>
521521
let thenStart: number;
522522
let thenEnd: number;
523523
if (!awaitBlock.pending.skip) {
@@ -543,18 +543,13 @@ export function convertHtmlxToJsx(
543543
str.overwrite(awaitBlock.expression.end, thenStart, '); ');
544544
}
545545
if (awaitBlock.value) {
546-
str.overwrite(
547-
thenStart,
548-
thenEnd,
549-
'_$$p.then((' +
550-
htmlx.substring(awaitBlock.value.start, awaitBlock.value.end) +
551-
') => {<>',
552-
);
546+
str.overwrite(thenStart, awaitBlock.value.start, '__sveltets_awaitThen(_$$p, (');
547+
str.overwrite(awaitBlock.value.end, thenEnd, ') => {<>');
553548
} else {
554-
str.overwrite(thenStart, thenEnd, '_$$p.then(() => {<>');
549+
str.overwrite(thenStart, thenEnd, '__sveltets_awaitThen(_$$p, () => {<>');
555550
}
556551
//{:catch error} ->
557-
//</>}).catch((error) => {<>
552+
//</>}, (error) => {<>
558553
if (!awaitBlock.catch.skip) {
559554
//catch block includes the {:catch}
560555
const catchStart = awaitBlock.catch.start;
@@ -563,7 +558,7 @@ export function convertHtmlxToJsx(
563558
const errorStart = awaitBlock.error ? awaitBlock.error.start : catchSymbolEnd;
564559
const errorEnd = awaitBlock.error ? awaitBlock.error.end : errorStart;
565560
const catchEnd = htmlx.indexOf('}', errorEnd) + 1;
566-
str.overwrite(catchStart, errorStart, '</>}).catch((');
561+
str.overwrite(catchStart, errorStart, '</>}, (');
567562
str.overwrite(errorEnd, catchEnd, ') => {<>');
568563
}
569564
// {/await} ->

packages/svelte2tsx/svelte-shims.d.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,14 @@ declare function __sveltets_bubbleEventDef<
7878
TEvent,
7979
TKey extends keyof T = TEvent extends keyof T ? TEvent : string
8080
>(on: SvelteOnAllEvent<T>, event: TEvent): T[TKey];
81+
82+
declare function __sveltets_awaitThen<T>(
83+
promise: PromiseLike<T>,
84+
onfulfilled: (value: T) => any,
85+
onrejected?: (value: any) => any
86+
): any;
87+
declare function __sveltets_awaitThen<T>(
88+
promise: T,
89+
onfulfilled: (value: T) => any,
90+
onrejected?: (value: never) => any
91+
): any;
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
<>{() => {let _$$p = (somePromise); _$$p.then((value) => {<>
2-
<h1>Promise Resolved</h1>
3-
</>}).catch(() => {<>
4-
<h2>Promise Errored</h2>
5-
</>})}}</>
1+
<>{() => {let _$$p = (somePromise); __sveltets_awaitThen(_$$p, (value) => {<>
2+
<h1>Promise Resolved</h1>
3+
</>}, () => {<>
4+
<h2>Promise Errored</h2>
5+
</>})}}</>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
<>{() => {let _$$p = (somePromise); _$$p.then((value) => {<>
1+
<>{() => {let _$$p = (somePromise); __sveltets_awaitThen(_$$p, (value) => {<>
22
<h1>Promise Resolved</h1>
33
</>})}}
44

55
{() => {let _$$p = (somePromise); <>
66
<h1>Loading...</h1>
7-
</>; _$$p.then(() => {<>
7+
</>; __sveltets_awaitThen(_$$p, () => {<>
88
<h1>Promise Resolved</h1>
99
</>})}}</>
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<>{() => {let _$$p = (thePromise); <>
22
loading
3-
</>; _$$p.then(([ a, b ]) => {<>
3+
</>; __sveltets_awaitThen(_$$p, ([ a, b ]) => {<>
44
then
5-
</>}).catch(([c, [d, e]]) => {<>
5+
</>}, ([c, [d, e]]) => {<>
66
catch
7-
</>})}}</>
7+
</>})}}</>
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
<>{() => {let _$$p = (object); _$$p.then(({ a = 3, b = 4, c }) => {<>
1+
<>{() => {let _$$p = (object); __sveltets_awaitThen(_$$p, ({ a = 3, b = 4, c }) => {<>
22
then
33
</>})}}
44

5-
{() => {let _$$p = (array); _$$p.then(([a, b, c = 3]) => {<>
5+
{() => {let _$$p = (array); __sveltets_awaitThen(_$$p, ([a, b, c = 3]) => {<>
66
then
77
</>})}}
88

9-
{() => {let _$$p = (objectReject); _$$p.then((value) => {<>
9+
{() => {let _$$p = (objectReject); __sveltets_awaitThen(_$$p, (value) => {<>
1010
then
11-
</>}).catch(({ a = 3, b = 4, c }) => {<>
11+
</>}, ({ a = 3, b = 4, c }) => {<>
1212
catch
1313
</>})}}
1414

15-
{() => {let _$$p = (arrayReject); _$$p.then((value) => {<>
15+
{() => {let _$$p = (arrayReject); __sveltets_awaitThen(_$$p, (value) => {<>
1616
then
17-
</>}).catch(([a, b, c = 3]) => {<>
17+
</>}, ([a, b, c = 3]) => {<>
1818
catch
19-
</>})}}</>
19+
</>})}}</>
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<>{() => {let _$$p = (thePromise); <>
22
loading
3-
</>; _$$p.then(({ result, error }) => {<>
3+
</>; __sveltets_awaitThen(_$$p, ({ result, error }) => {<>
44
then
5-
</>}).catch(({ error: { message, code } }) => {<>
5+
</>}, ({ error: { message, code } }) => {<>
66
catch
7-
</>})}}</>
7+
</>})}}</>
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
<>{() => {let _$$p = (object); _$$p.then(({ a, ...rest }) => {<>
1+
<>{() => {let _$$p = (object); __sveltets_awaitThen(_$$p, ({ a, ...rest }) => {<>
22
then
33
</>})}}
44

5-
{() => {let _$$p = (array); _$$p.then(([a, b, ...rest]) => {<>
5+
{() => {let _$$p = (array); __sveltets_awaitThen(_$$p, ([a, b, ...rest]) => {<>
66
then
77
</>})}}
88

9-
{() => {let _$$p = (objectReject); _$$p.then((value) => {<>
9+
{() => {let _$$p = (objectReject); __sveltets_awaitThen(_$$p, (value) => {<>
1010
then
11-
</>}).catch(({ a, ...rest }) => {<>
11+
</>}, ({ a, ...rest }) => {<>
1212
catch
1313
</>})}}
1414

15-
{() => {let _$$p = (arrayReject); _$$p.then((value) => {<>
15+
{() => {let _$$p = (arrayReject); __sveltets_awaitThen(_$$p, (value) => {<>
1616
then
17-
</>}).catch(([a, b, ...rest]) => {<>
17+
</>}, ([a, b, ...rest]) => {<>
1818
catch
19-
</>})}}</>
19+
</>})}}</>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
<>{() => {let _$$p = (somePromise); _$$p.then((value) => {<>
1+
<>{() => {let _$$p = (somePromise); __sveltets_awaitThen(_$$p, (value) => {<>
22
<h1>Promise Resolved</h1>
33
</>})}}
44

55
{() => {let _$$p = (somePromise); <>
66
<h1>Loading...</h1>
7-
</>; _$$p.then(() => {<>
7+
</>; __sveltets_awaitThen(_$$p, () => {<>
88
<h1>Promise Resolved</h1>
99
</>})}}</>
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
<>{() => {let _$$p = (somePromise); <>
2-
<h1>Promise Pending</h1>
3-
</>; _$$p.then((value) => {<>
4-
<h1>Promise Resolved {value}</h1>
5-
</>}).catch((error) => {<>
6-
<h1>Promise Errored {error}</h1>
7-
</>})}}</>
1+
<>{() => {let _$$p = (somePromise); <>
2+
<h1>Promise Pending</h1>
3+
</>; __sveltets_awaitThen(_$$p, (value) => {<>
4+
<h1>Promise Resolved {value}</h1>
5+
</>}, (error) => {<>
6+
<h1>Promise Errored {error}</h1>
7+
</>})}}</>
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
<>{() => {let _$$p = (somePromise); <>
2-
<h1>Promise Pending</h1>
3-
</>; _$$p.then((value) => {<>
4-
<h1>Promise Resolved {value}</h1>
5-
</>})}}</>
1+
<>{() => {let _$$p = (somePromise); <>
2+
<h1>Promise Pending</h1>
3+
</>; __sveltets_awaitThen(_$$p, (value) => {<>
4+
<h1>Promise Resolved {value}</h1>
5+
</>})}}</>

packages/svelte2tsx/test/svelte2tsx/samples/await-with-$store/expected.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ function render() {
99

1010
{() => {let _$$p = (__sveltets_store_get(store)); <>
1111
<p>loading</p>
12-
</>; _$$p.then((data) => {<>
12+
</>; __sveltets_awaitThen(_$$p, (data) => {<>
1313
{data}
1414
</>})}}</>);
1515
return { props: {}, slots: {}, getters: {}, events: {} }}

0 commit comments

Comments
 (0)