fix: correctly compile server code when using `$inspect` after a top-level await expression (#17407)

* add fix and test

* changeset

* Apply suggestion from @teemingc
pull/17416/head
Tee Ming 8 months ago committed by GitHub
parent 965bf6ceec
commit b1f44c46c3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: remove `$inspect` calls after await expressions when compiling for production server code

@ -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)

@ -0,0 +1,8 @@
import { test } from '../../test';
export default test({
compileOptions: {
experimental: { async: true },
dev: false
}
});

@ -0,0 +1,16 @@
import 'svelte/internal/disclose-version';
import 'svelte/internal/flags/async';
import * as $ from 'svelte/internal/client';
var root = $.from_html(`<p> </p>`);
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);
}

@ -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(`<p>`);
$$renderer.async([$$promises[1]], ($$renderer) => {
$$renderer.push(() => $.escape(data));
});
$$renderer.push(`</p>`);
}

@ -0,0 +1,6 @@
<script>
let data = await Promise.resolve(42);
$inspect(data);
</script>
<p>{data}</p>
Loading…
Cancel
Save