diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js index 8ba2dd1b07..b31ca94c6e 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/utils.js @@ -281,10 +281,9 @@ export function create_child_block(body, async) { export function create_async_block(body, blockers = b.array([]), has_await = true, markers = true) { return b.stmt( b.call( - '$$renderer.async', + markers ? '$$renderer.async_block' : '$$renderer.async', blockers, - b.arrow([b.id('$$renderer')], body, has_await), - markers && b.true + b.arrow([b.id('$$renderer')], body, has_await) ) ); } diff --git a/packages/svelte/src/internal/server/renderer.js b/packages/svelte/src/internal/server/renderer.js index d60fe81d03..5dc845e376 100644 --- a/packages/svelte/src/internal/server/renderer.js +++ b/packages/svelte/src/internal/server/renderer.js @@ -102,9 +102,18 @@ export class Renderer { /** * @param {Array>} blockers * @param {(renderer: Renderer) => void} fn - * @param {boolean} markers */ - async(blockers, fn, markers) { + async_block(blockers, fn) { + this.#out.push(BLOCK_OPEN); + this.async(blockers, fn); + this.#out.push(BLOCK_CLOSE); + } + + /** + * @param {Array>} blockers + * @param {(renderer: Renderer) => void} fn + */ + async(blockers, fn) { let callback = fn; if (blockers.length > 0) { @@ -124,9 +133,7 @@ export class Renderer { }; } - if (markers) this.#out.push(BLOCK_OPEN); this.child(callback); - if (markers) this.#out.push(BLOCK_CLOSE); } /** diff --git a/packages/svelte/tests/snapshot/samples/async-each-fallback-hoisting/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-each-fallback-hoisting/_expected/server/index.svelte.js index 448267de8c..7249fd6e4f 100644 --- a/packages/svelte/tests/snapshot/samples/async-each-fallback-hoisting/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/async-each-fallback-hoisting/_expected/server/index.svelte.js @@ -2,28 +2,24 @@ import 'svelte/internal/flags/async'; import * as $ from 'svelte/internal/server'; export default function Async_each_fallback_hoisting($$renderer) { - $$renderer.async( - [], - async ($$renderer) => { - const each_array = $.ensure_array_like((await $.save(Promise.resolve([])))()); + $$renderer.async_block([], async ($$renderer) => { + const each_array = $.ensure_array_like((await $.save(Promise.resolve([])))()); - if (each_array.length !== 0) { - $$renderer.push(''); + if (each_array.length !== 0) { + $$renderer.push(''); - for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) { - let item = each_array[$$index]; + for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) { + let item = each_array[$$index]; - $$renderer.push(``); - $$renderer.push(async () => $.escape(await Promise.reject('This should never be reached'))); - } - } else { - $$renderer.push(''); $$renderer.push(``); - $$renderer.push(async () => $.escape(await Promise.resolve(4))); + $$renderer.push(async () => $.escape(await Promise.reject('This should never be reached'))); } - }, - true - ); + } else { + $$renderer.push(''); + $$renderer.push(``); + $$renderer.push(async () => $.escape(await Promise.resolve(4))); + } + }); $$renderer.push(``); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/async-each-hoisting/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-each-hoisting/_expected/server/index.svelte.js index 6d214df2d4..10fa06e860 100644 --- a/packages/svelte/tests/snapshot/samples/async-each-hoisting/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/async-each-hoisting/_expected/server/index.svelte.js @@ -8,20 +8,16 @@ export default function Async_each_hoisting($$renderer) { $$renderer.push(``); - $$renderer.async( - [], - async ($$renderer) => { - const each_array = $.ensure_array_like((await $.save(Promise.resolve([first, second, third])))()); + $$renderer.async_block([], async ($$renderer) => { + const each_array = $.ensure_array_like((await $.save(Promise.resolve([first, second, third])))()); - for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) { - let item = each_array[$$index]; + for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) { + let item = each_array[$$index]; - $$renderer.push(``); - $$renderer.push(async () => $.escape(await item)); - } - }, - true - ); + $$renderer.push(``); + $$renderer.push(async () => $.escape(await item)); + } + }); $$renderer.push(``); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/async-if-alternate-hoisting/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-if-alternate-hoisting/_expected/server/index.svelte.js index 3e0b50f3f2..1e7330429a 100644 --- a/packages/svelte/tests/snapshot/samples/async-if-alternate-hoisting/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/async-if-alternate-hoisting/_expected/server/index.svelte.js @@ -2,19 +2,15 @@ import 'svelte/internal/flags/async'; import * as $ from 'svelte/internal/server'; export default function Async_if_alternate_hoisting($$renderer) { - $$renderer.async( - [], - async ($$renderer) => { - if ((await $.save(Promise.resolve(false)))()) { - $$renderer.push(''); - $$renderer.push(async () => $.escape(await Promise.reject('no no no'))); - } else { - $$renderer.push(''); - $$renderer.push(async () => $.escape(await Promise.resolve('yes yes yes'))); - } - }, - true - ); + $$renderer.async_block([], async ($$renderer) => { + if ((await $.save(Promise.resolve(false)))()) { + $$renderer.push(''); + $$renderer.push(async () => $.escape(await Promise.reject('no no no'))); + } else { + $$renderer.push(''); + $$renderer.push(async () => $.escape(await Promise.resolve('yes yes yes'))); + } + }); $$renderer.push(``); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/async-if-hoisting/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-if-hoisting/_expected/server/index.svelte.js index fadaec745f..1ca24cf81a 100644 --- a/packages/svelte/tests/snapshot/samples/async-if-hoisting/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/async-if-hoisting/_expected/server/index.svelte.js @@ -2,19 +2,15 @@ import 'svelte/internal/flags/async'; import * as $ from 'svelte/internal/server'; export default function Async_if_hoisting($$renderer) { - $$renderer.async( - [], - async ($$renderer) => { - if ((await $.save(Promise.resolve(true)))()) { - $$renderer.push(''); - $$renderer.push(async () => $.escape(await Promise.resolve('yes yes yes'))); - } else { - $$renderer.push(''); - $$renderer.push(async () => $.escape(await Promise.reject('no no no'))); - } - }, - true - ); + $$renderer.async_block([], async ($$renderer) => { + if ((await $.save(Promise.resolve(true)))()) { + $$renderer.push(''); + $$renderer.push(async () => $.escape(await Promise.resolve('yes yes yes'))); + } else { + $$renderer.push(''); + $$renderer.push(async () => $.escape(await Promise.reject('no no no'))); + } + }); $$renderer.push(``); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/server/index.svelte.js index 49b8bf9cda..bece6402c6 100644 --- a/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/server/index.svelte.js @@ -18,28 +18,24 @@ export default function Async_in_derived($$renderer, $$props) { } ]); - $$renderer.async( - [], - async ($$renderer) => { - if (true) { - $$renderer.push(''); - - const yes1 = (await $.save(1))(); - const yes2 = foo((await $.save(1))()); - - const no1 = (async () => { - return await 1; - })(); - - const no2 = (async () => { - return await 1; - })(); - } else { - $$renderer.push(''); - } - }, - true - ); + $$renderer.async_block([], async ($$renderer) => { + if (true) { + $$renderer.push(''); + + const yes1 = (await $.save(1))(); + const yes2 = foo((await $.save(1))()); + + const no1 = (async () => { + return await 1; + })(); + + const no2 = (async () => { + return await 1; + })(); + } else { + $$renderer.push(''); + } + }); $$renderer.push(``); });