diff --git a/.changeset/spicy-years-stick.md b/.changeset/spicy-years-stick.md new file mode 100644 index 0000000000..76834e8381 --- /dev/null +++ b/.changeset/spicy-years-stick.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: remove `$inspect` calls after await expressions when compiling for production server code diff --git a/packages/svelte/src/compiler/phases/3-transform/shared/transform-async.js b/packages/svelte/src/compiler/phases/3-transform/shared/transform-async.js index 2b9c219d7d..8d3a6b2769 100644 --- a/packages/svelte/src/compiler/phases/3-transform/shared/transform-async.js +++ b/packages/svelte/src/compiler/phases/3-transform/shared/transform-async.js @@ -86,7 +86,14 @@ export function transform_body(instance_body, runner, transform) { } if (s.node.type === 'ExpressionStatement') { - const expression = /** @type {ESTree.Expression} */ (transform(s.node.expression)); + // the expression may be a $inspect call, which will be transformed into an empty statement + const expression = /** @type {ESTree.Expression | ESTree.EmptyStatement} */ ( + transform(s.node.expression) + ); + + if (expression.type === 'EmptyStatement') { + return null; + } return expression.type === 'AwaitExpression' ? b.thunk(expression, true) diff --git a/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/_config.js b/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/_config.js new file mode 100644 index 0000000000..6214e6b429 --- /dev/null +++ b/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/_config.js @@ -0,0 +1,8 @@ +import { test } from '../../test'; + +export default test({ + compileOptions: { + experimental: { async: true }, + dev: false + } +}); diff --git a/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/_expected/client/index.svelte.js new file mode 100644 index 0000000000..e8aa8dfa11 --- /dev/null +++ b/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/_expected/client/index.svelte.js @@ -0,0 +1,16 @@ +import 'svelte/internal/disclose-version'; +import 'svelte/internal/flags/async'; +import * as $ from 'svelte/internal/client'; + +var root = $.from_html(`

`); + +export default function Async_top_level_inspect_server($$anchor) { + var data; + var $$promises = $.run([async () => data = await Promise.resolve(42),,]); + var p = root(); + var text = $.child(p, true); + + $.reset(p); + $.template_effect(() => $.set_text(text, data), void 0, void 0, [$$promises[1]]); + $.append($$anchor, p); +} \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/_expected/server/index.svelte.js new file mode 100644 index 0000000000..eb99a2fe1d --- /dev/null +++ b/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/_expected/server/index.svelte.js @@ -0,0 +1,15 @@ +import 'svelte/internal/flags/async'; +import * as $ from 'svelte/internal/server'; + +export default function Async_top_level_inspect_server($$renderer) { + var data; + var $$promises = $$renderer.run([async () => data = await Promise.resolve(42),,]); + + $$renderer.push(`

`); + + $$renderer.async([$$promises[1]], ($$renderer) => { + $$renderer.push(() => $.escape(data)); + }); + + $$renderer.push(`

`); +} \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/index.svelte b/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/index.svelte new file mode 100644 index 0000000000..06bb995b1e --- /dev/null +++ b/packages/svelte/tests/snapshot/samples/async-top-level-inspect-server/index.svelte @@ -0,0 +1,6 @@ + + +

{data}