Skip to content

Commit 6fd3d59

Browse files
bluwyRobertsson
andauthored
Add support for Svelte 5 @render syntax (#12390)
Co-authored-by: Jonas Robertsson <jonas.robertsson@icloud.com>
1 parent b7e4691 commit 6fd3d59

3 files changed

Lines changed: 30 additions & 0 deletions

File tree

.changeset/shaggy-kids-juggle.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@astrojs/svelte': patch
3+
---
4+
5+
Adds support for Svelte 5's new `@render` syntax while maintaining backward compatibility with traditional slots.

packages/integrations/svelte/client-v5.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ export default (element) => {
88

99
let children = undefined;
1010
let $$slots = undefined;
11+
let renderFns = {};
12+
13+
1114
for (const [key, value] of Object.entries(slotted)) {
15+
// Legacy slot support
1216
$$slots ??= {};
1317
if (key === 'default') {
1418
$$slots.default = true;
@@ -20,6 +24,16 @@ export default (element) => {
2024
render: () => `<astro-slot name="${key}">${value}</astro-slot>`,
2125
}));
2226
}
27+
// @render support for Svelte ^5.0
28+
if (key === 'default') {
29+
renderFns.children = createRawSnippet(() => ({
30+
render: () => `<astro-slot>${value}</astro-slot>`
31+
}));
32+
} else {
33+
renderFns[key] = createRawSnippet(() => ({
34+
render: () => `<astro-slot name="${key}">${value}</astro-slot>`
35+
}));
36+
}
2337
}
2438

2539
const bootstrap = client !== 'only' ? hydrate : mount;
@@ -28,6 +42,7 @@ export default (element) => {
2842
...props,
2943
children,
3044
$$slots,
45+
...renderFns
3146
});
3247
} else {
3348
const component = bootstrap(Component, {
@@ -36,6 +51,7 @@ export default (element) => {
3651
...props,
3752
children,
3853
$$slots,
54+
...renderFns
3955
},
4056
});
4157
existingApplications.set(element, component);

packages/integrations/svelte/server-v5.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ async function renderToStaticMarkup(Component, props, slotted, metadata) {
1717

1818
let children = undefined;
1919
let $$slots = undefined;
20+
const renderProps = {};
21+
2022
for (const [key, value] of Object.entries(slotted)) {
23+
// Legacy slot support
2124
$$slots ??= {};
2225
if (key === 'default') {
2326
$$slots.default = true;
@@ -29,13 +32,19 @@ async function renderToStaticMarkup(Component, props, slotted, metadata) {
2932
render: () => `<${tagName} name="${key}">${value}</${tagName}>`,
3033
}));
3134
}
35+
// @render support for Svelte ^5.0
36+
const slotName = key === 'default' ? 'children' : key;
37+
renderProps[slotName] = createRawSnippet(() => ({
38+
render: () => `<${tagName}${key !== 'default' ? ` name="${key}"` : ''}>${value}</${tagName}>`
39+
}));
3240
}
3341

3442
const result = render(Component, {
3543
props: {
3644
...props,
3745
children,
3846
$$slots,
47+
...renderProps
3948
},
4049
});
4150
return { html: result.body };

0 commit comments

Comments
 (0)