Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 0d54284

Browse files
committedMay 28, 2024·
Svelte 5: Minimalest upgrade
Extract rendering outside createInertiaApp to allow Svelte 4 & 5 compatibility
1 parent e270d69 commit 0d54284

File tree

8 files changed

+645
-85
lines changed

8 files changed

+645
-85
lines changed
 

‎package-lock.json

+592-64
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",
+10-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
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)}>
1016
<App />
11-
</div>
17+
</div>

‎packages/svelte/src/lib/createInertiaApp.ts

+21-9
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)
@@ -76,15 +81,22 @@ export default async function createInertiaApp({
7681
resolveComponent,
7782
},
7883
})
79-
80-
return
8184
}
8285

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>`],
86+
if (isServer) {
87+
if (!ssr) {
88+
throw new Error(`createInertiaApp must provide ssr(...) for server-side rendering.`)
89+
}
90+
91+
const { html, head, css } = ssr(SSR, { id, initialPage })
92+
93+
return {
94+
body: html,
95+
head: [
96+
head,
97+
// Note: Svelte 5 no longer output CSS
98+
...(css?.code ? [`<style data-vite-css>${css?.code}</style>`] : []),
99+
],
100+
}
89101
}
90102
}

‎playgrounds/svelte/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
},
99
"devDependencies": {
1010
"@inertiajs/svelte": "^1.0.0",
11-
"@sveltejs/vite-plugin-svelte": "^2.4.2",
11+
"@sveltejs/vite-plugin-svelte": "^3.1.0",
1212
"autoprefixer": "^10.4.13",
1313
"axios": "^1.6.0",
1414
"laravel-vite-plugin": "^0.7.2",
1515
"lodash": "^4.17.19",
1616
"postcss": "^8.4.31",
17-
"svelte": "^4.2.14",
17+
"svelte": "^5.0.0-next.126",
1818
"tailwindcss": "^3.2.4",
19-
"vite": "^4.5.3"
19+
"vite": "^5.2.11"
2020
}
2121
}
+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

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ export default defineConfig({
1111
}),
1212
svelte({
1313
compilerOptions: {
14-
hydratable: true,
15-
},
14+
// Svelte 4 only
15+
// hydratable: true
16+
}
1617
}),
1718
],
1819
})

0 commit comments

Comments
 (0)
Please sign in to comment.