From efcb7353bb4526a64d8d69e2d43ce8314d8ceb8c Mon Sep 17 00:00:00 2001 From: ai-man-codes Date: Mon, 26 Jan 2026 20:59:12 +0530 Subject: [PATCH] fix: handle falsy dynamic components in SSR (#17542) * fix: handle falsy dynamic components in SSR Closes #17408 Adds a dynamic check for the component in the SSR. Changes: - Modified server-side component renderer to use b.maybe_call for dynamic components - Added SSR test case for falsy component values * fix types --------- Co-authored-by: Rich Harris --- .changeset/purple-guests-punch.md | 5 +++++ .../3-transform/server/visitors/shared/component.js | 12 ++++-------- .../samples/falsy-dynamic-component/_expected.html | 1 + .../samples/falsy-dynamic-component/main.svelte | 6 ++++++ 4 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 .changeset/purple-guests-punch.md create mode 100644 packages/svelte/tests/server-side-rendering/samples/falsy-dynamic-component/_expected.html create mode 100644 packages/svelte/tests/server-side-rendering/samples/falsy-dynamic-component/main.svelte diff --git a/.changeset/purple-guests-punch.md b/.changeset/purple-guests-punch.md new file mode 100644 index 0000000000..f18a1962d6 --- /dev/null +++ b/.changeset/purple-guests-punch.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: handle false dynamic components in SSR diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/component.js index a90b5e41df..cfd9a27d7b 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/component.js @@ -295,22 +295,18 @@ export function build_inline_component(node, expression, context) { b.array(props_and_spreads.map((p) => (Array.isArray(p) ? b.object(p) : p))) ); + const dynamic = + node.type === 'SvelteComponent' || (node.type === 'Component' && node.metadata.dynamic); + /** @type {Statement} */ let statement = b.stmt( - (node.type === 'SvelteComponent' ? b.maybe_call : b.call)( - expression, - b.id('$$renderer'), - props_expression - ) + (dynamic ? b.maybe_call : b.call)(expression, b.id('$$renderer'), props_expression) ); if (snippet_declarations.length > 0) { statement = b.block([...snippet_declarations, statement]); } - const dynamic = - node.type === 'SvelteComponent' || (node.type === 'Component' && node.metadata.dynamic); - if (custom_css_props.length > 0) { statement = b.stmt( b.call( diff --git a/packages/svelte/tests/server-side-rendering/samples/falsy-dynamic-component/_expected.html b/packages/svelte/tests/server-side-rendering/samples/falsy-dynamic-component/_expected.html new file mode 100644 index 0000000000..d87d3602f8 --- /dev/null +++ b/packages/svelte/tests/server-side-rendering/samples/falsy-dynamic-component/_expected.html @@ -0,0 +1 @@ +

Test

\ No newline at end of file diff --git a/packages/svelte/tests/server-side-rendering/samples/falsy-dynamic-component/main.svelte b/packages/svelte/tests/server-side-rendering/samples/falsy-dynamic-component/main.svelte new file mode 100644 index 0000000000..ee6dabc9aa --- /dev/null +++ b/packages/svelte/tests/server-side-rendering/samples/falsy-dynamic-component/main.svelte @@ -0,0 +1,6 @@ + + +

Test

+ \ No newline at end of file