summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Bjorn Lu <bjornlu.dev@gmail.com> 2024-11-06 22:09:22 +0800
committerGravatar GitHub <noreply@github.com> 2024-11-06 22:09:22 +0800
commit6fd3d5960f5ab16591bfdb94d1f9b9a9b72006cf (patch)
tree04cf330b790417cdae2c860e5abc4b9bd7f4bbcc
parentb7e46910fb90b78c0754c65d572375cd27646c29 (diff)
downloadastro-6fd3d5960f5ab16591bfdb94d1f9b9a9b72006cf.tar.gz
astro-6fd3d5960f5ab16591bfdb94d1f9b9a9b72006cf.tar.zst
astro-6fd3d5960f5ab16591bfdb94d1f9b9a9b72006cf.zip
Add support for Svelte 5 @render syntax (#12390)
Co-authored-by: Jonas Robertsson <jonas.robertsson@icloud.com>
-rw-r--r--.changeset/shaggy-kids-juggle.md5
-rw-r--r--packages/integrations/svelte/client-v5.js16
-rw-r--r--packages/integrations/svelte/server-v5.js9
3 files changed, 30 insertions, 0 deletions
diff --git a/.changeset/shaggy-kids-juggle.md b/.changeset/shaggy-kids-juggle.md
new file mode 100644
index 000000000..ceb208dc4
--- /dev/null
+++ b/.changeset/shaggy-kids-juggle.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/svelte': patch
+---
+
+Adds support for Svelte 5's new `@render` syntax while maintaining backward compatibility with traditional slots.
diff --git a/packages/integrations/svelte/client-v5.js b/packages/integrations/svelte/client-v5.js
index 7a046b5bf..f2cc647a2 100644
--- a/packages/integrations/svelte/client-v5.js
+++ b/packages/integrations/svelte/client-v5.js
@@ -8,7 +8,11 @@ export default (element) => {
let children = undefined;
let $$slots = undefined;
+ let renderFns = {};
+
+
for (const [key, value] of Object.entries(slotted)) {
+ // Legacy slot support
$$slots ??= {};
if (key === 'default') {
$$slots.default = true;
@@ -20,6 +24,16 @@ export default (element) => {
render: () => `<astro-slot name="${key}">${value}</astro-slot>`,
}));
}
+ // @render support for Svelte ^5.0
+ if (key === 'default') {
+ renderFns.children = createRawSnippet(() => ({
+ render: () => `<astro-slot>${value}</astro-slot>`
+ }));
+ } else {
+ renderFns[key] = createRawSnippet(() => ({
+ render: () => `<astro-slot name="${key}">${value}</astro-slot>`
+ }));
+ }
}
const bootstrap = client !== 'only' ? hydrate : mount;
@@ -28,6 +42,7 @@ export default (element) => {
...props,
children,
$$slots,
+ ...renderFns
});
} else {
const component = bootstrap(Component, {
@@ -36,6 +51,7 @@ export default (element) => {
...props,
children,
$$slots,
+ ...renderFns
},
});
existingApplications.set(element, component);
diff --git a/packages/integrations/svelte/server-v5.js b/packages/integrations/svelte/server-v5.js
index acffd10df..932a52b1f 100644
--- a/packages/integrations/svelte/server-v5.js
+++ b/packages/integrations/svelte/server-v5.js
@@ -17,7 +17,10 @@ async function renderToStaticMarkup(Component, props, slotted, metadata) {
let children = undefined;
let $$slots = undefined;
+ const renderProps = {};
+
for (const [key, value] of Object.entries(slotted)) {
+ // Legacy slot support
$$slots ??= {};
if (key === 'default') {
$$slots.default = true;
@@ -29,6 +32,11 @@ async function renderToStaticMarkup(Component, props, slotted, metadata) {
render: () => `<${tagName} name="${key}">${value}</${tagName}>`,
}));
}
+ // @render support for Svelte ^5.0
+ const slotName = key === 'default' ? 'children' : key;
+ renderProps[slotName] = createRawSnippet(() => ({
+ render: () => `<${tagName}${key !== 'default' ? ` name="${key}"` : ''}>${value}</${tagName}>`
+ }));
}
const result = render(Component, {
@@ -36,6 +44,7 @@ async function renderToStaticMarkup(Component, props, slotted, metadata) {
...props,
children,
$$slots,
+ ...renderProps
},
});
return { html: result.body };