Skip to content

Commit 1993963

Browse files
author
Timothy Johnson
committed
Render await blocks
1 parent f6fac8a commit 1993963

File tree

3 files changed

+56
-7
lines changed

3 files changed

+56
-7
lines changed

dest/background.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ function instrument(str) {
2121
${post}`
2222
)
2323
.replace(
24-
/(\/\/.+?({(?:#|:).+})?\s+function\s+create_((?:each|if|else)_block(?:_\d+?)?(?:\$\d+?)?)\s*\(\s*ctx\s*\)\s*{[^]+?)return\s+({[^]+?}\s*;)\s*}/g,
24+
/(\/\/.+?({(?:#|:).+})?\s+function\s+create_((?:each|if|else|pending|then|catch)_block(?:_\d+?)?(?:\$\d+?)?)\s*\(\s*ctx\s*\)\s*{[^]+?)return\s+({[^]+?}\s*;)\s*}/g,
2525
(_, fn, source, blockId, block) => `${fn}
2626
const block = ${block}
2727
document.dispatchEvent(new CustomEvent("SvelteRegisterBlock", { detail: { block, blockId: '${blockId}', source: "${

dest/privilegedContent.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,12 +221,14 @@
221221
}
222222
})
223223

224+
let lastPromiseParent = null
224225
document.addEventListener('SvelteRegisterBlock', e => {
225226
const mountFn = e.detail.block.m
226227
const patchFn = e.detail.block.p
227228
const detachFn = e.detail.block.d
228229
const blockId = e.detail.blockId
229230
e.detail.block.m = (target, anchor) => {
231+
const tagName = blockId.substring(0, blockId.indexOf('_'))
230232
let node = nodeMap.get(blockId)
231233
if (!node) {
232234
node = {
@@ -236,8 +238,11 @@
236238
ctx: e.detail.ctx,
237239
source: e.detail.source
238240
},
239-
tagName: blockId.substring(0, blockId.indexOf('_')),
240-
parentComponent: currentComponent
241+
tagName: tagName == 'pending' ? 'await' : tagName,
242+
parentComponent:
243+
tagName == 'then' || tagName == 'catch'
244+
? currentComponent || lastPromiseParent
245+
: currentComponent
241246
}
242247
nodeMap.set(blockId, node)
243248
addNode(node, target, anchor)
@@ -263,6 +268,8 @@
263268

264269
e.detail.block.d = detaching => {
265270
const node = nodeMap.get(blockId)
271+
if (node.tagName == 'await') lastPromiseParent = node.parentComponent
272+
266273
nodeMap.delete(node.id)
267274
nodeMap.delete(node.detail)
268275
nodeMap.delete(blockId)

test/src/Blocks.svelte

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
44
let value = 0
55
setTimeout(() => (value = 1), 0)
6+
7+
let promise = new Promise((resolve, reject) =>
8+
setTimeout(() => resolve(5), 2000)
9+
)
610
</script>
711

812
<div>
@@ -15,9 +19,47 @@
1519
<span>{value}</span>
1620
{/each}
1721

18-
<br />
22+
<div>
23+
{#if value > 10}
24+
Value is over 10
25+
{:else if value > 5}Value is over 5{:else}Value is under 5{/if}
26+
</div>
27+
28+
<div>
29+
{#await promise}
30+
waiting for the promise to resolve...
31+
{:then value}
32+
Promise resolved to {value}
33+
{:catch error}
34+
Something went wrong {error.message}
35+
{/await}
36+
</div>
37+
<div>
38+
{#await new Promise(() => {})}
39+
Pending forever
40+
{:then value}
41+
Something went wrong {value}
42+
{:catch error}
43+
Something went wrong {error.message}
44+
{/await}
45+
</div>
1946

20-
{#if value > 10}
21-
Value is over 10
22-
{:else if value > 5}Value is over 5{:else}Value is under 5{/if}
47+
<div>
48+
{#await Promise.resolve(5)}
49+
Something went wrong
50+
{:then value}
51+
Promise resolved to {value}
52+
{:catch error}
53+
Something went wrong {error.message}
54+
{/await}
55+
</div>
56+
<div>
57+
{#await Promise.reject('rejected')}
58+
Something went wrong
59+
{:then value}
60+
Something went wrong {value}
61+
{:catch error}
62+
Should reject {error}
63+
{/await}
64+
</div>
2365
</div>

0 commit comments

Comments
 (0)