Skip to content

Commit 279ee63

Browse files
committed
[inertiajs#1872] Update Svelte 5 compatibility
1 parent 19192b9 commit 279ee63

File tree

8 files changed

+148
-68
lines changed

8 files changed

+148
-68
lines changed

packages/svelte/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@
5555
"@sveltejs/adapter-auto": "^3.2.0",
5656
"@sveltejs/kit": "^2.5.7",
5757
"@sveltejs/package": "^2.3.1",
58-
"@sveltejs/vite-plugin-svelte": "4.0.0-next.0",
58+
"@sveltejs/vite-plugin-svelte": "^3.1.0",
5959
"publint": "^0.1.16",
60-
"svelte": "5.0.0-next.131",
60+
"svelte": "^4.2.16",
6161
"svelte-check": "^3.7.1",
6262
"tslib": "^2.6.2",
6363
"typescript": "^5.4.5",
@@ -67,4 +67,4 @@
6767
"svelte": "./dist/index.js",
6868
"types": "./dist/index.d.ts",
6969
"type": "module"
70-
}
70+
}

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

+15-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { VERSION } from 'svelte/compiler';
21
import { router, setupProgress, type InertiaAppResponse, type Page } from '@inertiajs/core'
32
import type { ComponentType } from 'svelte'
43
import App from './components/App.svelte'
4+
import type { SSRProps } from './components/SSR.svelte'
55
import SSR from './components/SSR.svelte'
66
import store from './store'
77
import type { ComponentsResolver, ResolvedComponents } from './types'
88

9-
const SVELTE_MAJOR_VERSION = parseInt(VERSION.split('.')[0]);
9+
type SvelteRenderResult = { html: string; head: string; css?: { code: string } }
10+
type SSRComponent = ComponentType<SSR> & { render?: (props: SSRProps) => SvelteRenderResult }
1011

1112
interface CreateInertiaAppProps {
1213
id?: string
@@ -28,6 +29,7 @@ interface CreateInertiaAppProps {
2829
showSpinner?: boolean
2930
}
3031
page?: Page
32+
ssr?: (AppSSR: SSRComponent, props: SSRProps) => SvelteRenderResult
3133
}
3234

3335
export default async function createInertiaApp({
@@ -36,6 +38,7 @@ export default async function createInertiaApp({
3638
setup,
3739
progress = {},
3840
page,
41+
ssr,
3942
}: CreateInertiaAppProps): InertiaAppResponse {
4043
const isServer = typeof window === 'undefined'
4144
const el = isServer ? null : document.getElementById(id)
@@ -81,18 +84,19 @@ export default async function createInertiaApp({
8184
}
8285

8386
if (isServer) {
84-
const { html, head } = await (async () => {
85-
if (SVELTE_MAJOR_VERSION < 5) {
86-
return (SSR as any).render({ id, initialPage })
87-
} else {
88-
const { render } = await import('svelte/server')
89-
return render(SSR as any, { props: { id, initialPage } })
90-
}
91-
})()
87+
if (!ssr) {
88+
throw new Error(`createInertiaApp must provide ssr(...) for server-side rendering.`)
89+
}
90+
91+
const { html, head, css } = ssr(SSR as SSRComponent, { id, initialPage })
9292

9393
return {
9494
body: html,
95-
head: [head],
95+
head: [
96+
head,
97+
// Note: Svelte 5 no longer output CSS
98+
...(css?.code ? [`<style data-vite-css>${css?.code}</style>`] : []),
99+
],
96100
}
97101
}
98102
}

packages/svelte/src/lib/useForm.ts

+5-10
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@ interface InertiaFormProps<TForm extends FormDataType> {
4747

4848
export type InertiaForm<TForm extends FormDataType> = InertiaFormProps<TForm> & TForm
4949

50-
export default function useForm<TForm extends FormDataType>(
51-
data: TForm | (() => TForm),
52-
): Writable<InertiaForm<TForm>>
50+
export default function useForm<TForm extends FormDataType>(data: TForm | (() => TForm)): Writable<InertiaForm<TForm>>
5351
export default function useForm<TForm extends FormDataType>(
5452
rememberKey: string,
5553
data: TForm | (() => TForm),
@@ -83,13 +81,10 @@ export default function useForm<TForm extends FormDataType>(
8381
})
8482
},
8583
data() {
86-
return Object.keys((typeof data === 'function' ? data() : data) as FormDataType).reduce(
87-
(carry, key) => {
88-
carry[key] = this[key]
89-
return carry
90-
},
91-
{} as FormDataType,
92-
) as TForm
84+
return Object.keys((typeof data === 'function' ? data() : data) as FormDataType).reduce((carry, key) => {
85+
carry[key] = this[key]
86+
return carry
87+
}, {} as FormDataType) as TForm
9388
},
9489
transform(callback) {
9590
transform = callback

playgrounds/svelte/resources/js/app.js

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ createInertiaApp({
77
return pages[`./Pages/${name}.svelte`]
88
},
99
setup({ el, App }) {
10+
// Svelte 4: new App({ target: el, hydrate: true })
11+
12+
// Svelte 5
1013
if (el.dataset.serverRendered === 'true') {
1114
hydrate(App, { target: el })
1215
} else {

playgrounds/svelte/resources/js/ssr.js

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createInertiaApp } from '@inertiajs/svelte'
22
import createServer from '@inertiajs/svelte/server'
3+
import { render } from 'svelte/server'
34

45
createServer((page) =>
56
createInertiaApp({
@@ -8,5 +9,10 @@ createServer((page) =>
89
const pages = import.meta.glob('./Pages/**/*.svelte', { eager: true })
910
return pages[`./Pages/${name}.svelte`]
1011
},
12+
ssr: (AppSSR, props) => {
13+
// Svelte 4: return AppSSR.render(props)
14+
// Svelte 5: return render(AppSSR, { props })
15+
return render(AppSSR, { props })
16+
},
1117
}),
1218
)

playgrounds/svelte/vite.config.js

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

0 commit comments

Comments
 (0)