Skip to content

Commit e04aebc

Browse files
committed
[inertiajs#1872] Merge pull request #5 from jamesst20/svelte5-minimal-main
[inertiajs#1872] Svelte 5: Minimalest upgrade
1 parent ddc47be commit e04aebc

File tree

8 files changed

+2095
-746
lines changed

8 files changed

+2095
-746
lines changed

package-lock.json

+2,042-727
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/svelte/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"!dist/**/*.spec.*"
3333
],
3434
"peerDependencies": {
35-
"svelte": "^3.20.0 || ^4.0.0"
35+
"svelte": "^3.20.0 || ^4.0.0 || ^5.0.0 || 5.0.0-next.1"
3636
},
3737
"devDependencies": {
3838
"@sveltejs/adapter-auto": "^3.2.0",

packages/svelte/src/lib/components/SSR.svelte

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
<script lang="ts">
1+
<script context="module" lang="ts">
22
import type { Page } from '@inertiajs/core'
3+
export type SSRProps = { id: string; initialPage: Page }
4+
</script>
5+
6+
<script lang="ts">
37
import App from './App.svelte'
48
5-
export let id: string
6-
export let initialPage: Page
9+
interface $$Props extends SSRProps {}
10+
11+
export let id: $$Props['id']
12+
export let initialPage: $$Props['initialPage']
713
</script>
814

915
<div data-server-rendered="true" {id} data-page={JSON.stringify(initialPage)}>

packages/svelte/src/lib/createInertiaApp.ts

+21-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import { router, setupProgress, type InertiaAppResponse, type Page } from '@inertiajs/core'
22
import type { ComponentType } from 'svelte'
33
import SvelteApp from './components/App.svelte'
4-
import SSR from './components/SSR.svelte'
4+
import SSR, { type SSRProps } from './components/SSR.svelte'
55
import store from './store'
66
import type { ComponentResolver, InertiaComponentType } from './types'
77

8+
type SvelteRenderResult = { html: string; head: string; css?: { code: string } }
9+
type SSRComponent = ComponentType<SSR> & { render?: (props: SSRProps) => SvelteRenderResult }
10+
811
interface CreateInertiaAppProps {
912
id?: string
1013
resolve: ComponentResolver
@@ -26,6 +29,7 @@ interface CreateInertiaAppProps {
2629
showSpinner?: boolean
2730
}
2831
page?: Page
32+
ssr?: (AppSSR: SSRComponent, props: SSRProps) => SvelteRenderResult
2933
}
3034

3135
export default async function createInertiaApp({
@@ -34,6 +38,7 @@ export default async function createInertiaApp({
3438
setup,
3539
progress = {},
3640
page,
41+
ssr
3742
}: CreateInertiaAppProps): InertiaAppResponse {
3843
const isServer = typeof window === 'undefined'
3944
const el = isServer ? null : document.getElementById(id)
@@ -80,11 +85,20 @@ export default async function createInertiaApp({
8085
return
8186
}
8287

83-
// Svelte types are written for the DOM API and not the SSR API.
84-
const { html, head, css } = (SSR as any).render({ id, initialPage })
85-
86-
return {
87-
body: html,
88-
head: [head, `<style data-vite-css>${css.code}</style>`],
88+
if (isServer) {
89+
if (!ssr) {
90+
throw new Error(`createInertiaApp must provide ssr(...) for server-side rendering.`)
91+
}
92+
93+
const { html, head, css } = ssr(SSR, { id, initialPage })
94+
95+
return {
96+
body: html,
97+
head: [
98+
head,
99+
// Note: Svelte 5 no longer output CSS
100+
...(css?.code ? [`<style data-vite-css>${css?.code}</style>`] : []),
101+
],
102+
}
89103
}
90104
}

playgrounds/svelte/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"laravel-vite-plugin": "^1.0.2",
1616
"lodash": "^4.17.21",
1717
"postcss": "^8.4.38",
18-
"svelte": "^4.2.16",
18+
"svelte": "^5.0.0-next.1",
1919
"svelte-check": "^3.7.1",
2020
"tailwindcss": "^3.4.3",
2121
"tslib": "^2.6.2",
+9-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
import { createInertiaApp } from '@inertiajs/svelte'
2+
import { hydrate, mount } from 'svelte'
23

34
createInertiaApp({
45
resolve: (name) => {
56
const pages = import.meta.glob('./Pages/**/*.svelte', { eager: true })
67
return pages[`./Pages/${name}.svelte`]
78
},
89
setup({ el, App }) {
9-
new App({ target: el, hydrate: true })
10+
// Svelte 4: new App({ target: el, hydrate: true })
11+
12+
// Svelte 5
13+
if (el.dataset.serverRendered === 'true') {
14+
hydrate(App, { target: el })
15+
} else {
16+
mount(App, { target: el })
17+
}
1018
},
1119
})
+6-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
import { createInertiaApp } from '@inertiajs/svelte'
22
import createServer from '@inertiajs/svelte/server'
3-
3+
import { render } from 'svelte/server'
44
createServer((page) =>
55
createInertiaApp({
66
page,
77
resolve: (name) => {
88
const pages = import.meta.glob('./Pages/**/*.svelte', { eager: true })
99
return pages[`./Pages/${name}.svelte`]
1010
},
11+
ssr: (AppSSR, props) => {
12+
// Svelte 4: return AppSSR.render(props)
13+
// Svelte 5: return render(AppSSR, { props })
14+
return render(AppSSR, { props })
15+
},
1116
}),
1217
)

playgrounds/svelte/vite.config.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ export default defineConfig({
99
ssr: 'resources/js/ssr.js',
1010
refresh: true,
1111
}),
12-
svelte({
13-
compilerOptions: {
14-
hydratable: true,
15-
},
16-
}),
12+
svelte({
13+
compilerOptions: {
14+
// Svelte 4 only
15+
// hydratable: true
16+
}
17+
}),
1718
],
1819
})

0 commit comments

Comments
 (0)