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 679dbe7

Browse files
committedMay 16, 2024·
[inertiajs#1866] Merge pull request #8 (with improvements)
Merge punyflash/inertia with some tweaks and fixes
1 parent 3dd8814 commit 679dbe7

28 files changed

+1374
-389
lines changed
 

‎.github/workflows/build.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88

99
strategy:
1010
matrix:
11-
adapter: ['react', 'vue2', 'vue3']
11+
adapter: ['react', 'vue2', 'vue3', 'svelte']
1212
node-version: [20]
1313

1414
steps:

‎packages/svelte/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
dist
2+
types
23
node_modules
34
package-lock.json
45
yarn.lock
6+
.svelte-kit

‎packages/svelte/package.json

+40-5
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,52 @@
1919
"keywords": [
2020
"svelte"
2121
],
22+
"scripts": {
23+
"build": "npm run package",
24+
"package": "svelte-kit sync && svelte-package && publint",
25+
"prepublishOnly": "npm run package",
26+
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
27+
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
28+
"test": "vitest"
29+
},
2230
"exports": {
23-
".": "./src/index.js",
24-
"./server": "./src/server.js"
31+
".": {
32+
"types": "./dist/index.d.ts",
33+
"svelte": "./dist/index.js"
34+
},
35+
"./server": {
36+
"types": "./dist/server.d.ts",
37+
"svelte": "./dist/server.js"
38+
}
2539
},
26-
"main": "src/index.js",
40+
"files": [
41+
"dist",
42+
"!dist/**/*.test.*",
43+
"!dist/**/*.spec.*"
44+
],
2745
"peerDependencies": {
28-
"svelte": "^3.20.0 || ^4.0.0 || ^5.0.0 || 5.0.0-next.1"
46+
"svelte": "^5.0.0-next.1"
2947
},
3048
"dependencies": {
3149
"@inertiajs/core": "workspace:*",
3250
"lodash.clonedeep": "^4.5.0",
3351
"lodash.isequal": "^4.5.0"
34-
}
52+
},
53+
"devDependencies": {
54+
"axios": "^1.6.8",
55+
"@sveltejs/adapter-auto": "^3.2.0",
56+
"@sveltejs/kit": "^2.5.7",
57+
"@sveltejs/package": "^2.3.1",
58+
"@sveltejs/vite-plugin-svelte": "^3.1.0",
59+
"publint": "^0.1.16",
60+
"svelte": "^4.2.16",
61+
"svelte-check": "^3.7.1",
62+
"tslib": "^2.6.2",
63+
"typescript": "^5.4.5",
64+
"vite": "^5.2.11",
65+
"vitest": "^1.6.0"
66+
},
67+
"svelte": "./dist/index.js",
68+
"types": "./dist/index.d.ts",
69+
"type": "module"
3570
}

‎packages/svelte/src/App.svelte

-17
This file was deleted.

‎packages/svelte/src/Render.svelte

-36
This file was deleted.

‎packages/svelte/src/SSR.svelte

-8
This file was deleted.

‎packages/svelte/src/createInertiaApp.js

-62
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script lang="ts">
2+
import Render, { h } from './Render.svelte'
3+
import store from '../store'
4+
5+
$: child = $store.component?.default && h($store.component.default, $store.page?.props)
6+
$: layout = $store.component && $store.component.layout
7+
$: components = layout
8+
? Array.isArray(layout)
9+
? layout
10+
.concat(child)
11+
.reverse()
12+
.reduce((child, layout) => h(layout, $store.page?.props, [child]))
13+
: h(layout, $store.page?.props, child ? [child] : [])
14+
: child
15+
</script>
16+
17+
<Render {...components} />

‎packages/svelte/src/Link.svelte ‎packages/svelte/src/lib/components/Link.svelte

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1-
<script>
1+
<script lang="ts">
2+
import type { Method, PreserveStateOption, RequestPayload } from '@inertiajs/core'
23
import { beforeUpdate } from 'svelte'
3-
import { default as inertia } from './link'
4+
import { inertia } from '../index'
45
5-
export let href
6-
export let as = 'a'
7-
export let data = {}
8-
export let method = 'get'
9-
export let replace = false
10-
export let preserveScroll = false
11-
export let preserveState = null
12-
export let only = []
13-
export let headers = {}
14-
export let queryStringArrayFormat = 'brackets'
6+
export let href: string
7+
export let as: keyof HTMLElementTagNameMap = 'a'
8+
export let data: RequestPayload = {}
9+
export let method: Method = 'get'
10+
export let replace: boolean = false
11+
export let preserveScroll: PreserveStateOption = false
12+
export let preserveState: PreserveStateOption | null = null
13+
export let only: string[] = []
14+
export let headers: Record<string, string> = {}
15+
export let queryStringArrayFormat: 'brackets' | 'indices' = 'brackets'
1516
1617
beforeUpdate(() => {
1718
if (as === 'a' && method.toLowerCase() !== 'get') {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<script context="module" lang="ts">
2+
import type { PageProps } from '@inertiajs/core'
3+
import type { ComponentType } from 'svelte'
4+
5+
type RenderProps = {
6+
component: ComponentType
7+
props?: PageProps
8+
children?: RenderProps[]
9+
} | null
10+
11+
export const h = (component: ComponentType, props?: PageProps, children?: RenderProps[]): RenderProps => {
12+
return {
13+
component,
14+
...(props ? { props } : {}),
15+
...(children ? { children } : {}),
16+
}
17+
}
18+
</script>
19+
20+
<script lang="ts">
21+
import store from '../store'
22+
23+
export let component: ComponentType
24+
export let props: PageProps = {}
25+
export let children: RenderProps[] = []
26+
27+
let prevComponent: ComponentType
28+
let key: number
29+
$: {
30+
if (prevComponent !== component) {
31+
key = Date.now()
32+
prevComponent = component
33+
}
34+
}
35+
</script>
36+
37+
{#if $store.component}
38+
{#key key}
39+
<svelte:component this={component} {...props}>
40+
{#each children as child, index (component && component.length === index ? $store.key : null)}
41+
<svelte:self {...child} />
42+
{/each}
43+
</svelte:component>
44+
{/key}
45+
{/if}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script context="module" lang="ts">
2+
import type { Page } from '@inertiajs/core'
3+
export type SSRProps = { id: string; initialPage: Page }
4+
</script>
5+
6+
<script lang="ts">
7+
import App from './App.svelte'
8+
9+
interface $$Props extends SSRProps {}
10+
11+
export let id: $$Props['id']
12+
export let initialPage: $$Props['initialPage']
13+
</script>
14+
15+
<div data-server-rendered="true" {id} data-page={JSON.stringify(initialPage)}>
16+
<App />
17+
</div>
+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import { router, setupProgress, type InertiaAppResponse, type Page } from '@inertiajs/core'
2+
import type { ComponentType } from 'svelte'
3+
import App from './components/App.svelte'
4+
import type { SSRProps } from './components/SSR.svelte'
5+
import SSR from './components/SSR.svelte'
6+
import store from './store'
7+
import type { ComponentsResolver, ResolvedComponents } from './types'
8+
9+
type SvelteRenderResult = { html: string; head: string; css?: { code: string } }
10+
type SSRComponent = ComponentType<SSR> & { render?: (props: SSRProps) => SvelteRenderResult }
11+
12+
interface CreateInertiaAppProps {
13+
id?: string
14+
resolve: ComponentsResolver
15+
setup: (props: {
16+
el: Element
17+
App: ComponentType<App>
18+
props: {
19+
initialPage: Page
20+
resolveComponent: ComponentsResolver
21+
}
22+
}) => void | App
23+
progress?:
24+
| false
25+
| {
26+
delay?: number
27+
color?: string
28+
includeCSS?: boolean
29+
showSpinner?: boolean
30+
}
31+
page?: Page
32+
ssr?: (AppSSR: SSRComponent, props: SSRProps) => SvelteRenderResult
33+
}
34+
35+
export default async function createInertiaApp({
36+
id = 'app',
37+
resolve,
38+
setup,
39+
progress = {},
40+
page,
41+
ssr,
42+
}: CreateInertiaAppProps): InertiaAppResponse {
43+
const isServer = typeof window === 'undefined'
44+
const el = isServer ? null : document.getElementById(id)
45+
const initialPage: Page = page || JSON.parse(el?.dataset?.page || '{}')
46+
const resolveComponent = (name: string, page: Page) => Promise.resolve(resolve(name, page))
47+
48+
await resolveComponent(initialPage.component, initialPage).then((initialComponent) => {
49+
store.set({
50+
component: initialComponent,
51+
page: initialPage,
52+
})
53+
})
54+
55+
if (!isServer) {
56+
if (!el) {
57+
throw new Error(`Element with ID "${id}" not found.`)
58+
}
59+
60+
router.init({
61+
initialPage,
62+
resolveComponent,
63+
swapComponent: async ({ component, page, preserveState }) => {
64+
store.update((current) => ({
65+
component: component as ResolvedComponents,
66+
page,
67+
key: preserveState ? current.key : Date.now(),
68+
}))
69+
},
70+
})
71+
72+
if (progress) {
73+
setupProgress(progress)
74+
}
75+
76+
setup({
77+
el,
78+
App,
79+
props: {
80+
initialPage,
81+
resolveComponent,
82+
},
83+
})
84+
}
85+
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 as SSRComponent, { 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+
}
101+
}
102+
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export { router } from '@inertiajs/core'
2-
export { default as Link } from './Link.svelte'
2+
export { default as Link } from './components/Link.svelte'
33
export { default as createInertiaApp } from './createInertiaApp'
44
export { default as inertia } from './link'
55
export { default as page } from './page'
66
export { default as remember } from './remember'
7-
export { default as useForm } from './useForm'
7+
export { default as useForm, type InertiaForm } from './useForm'

‎packages/svelte/src/link.js ‎packages/svelte/src/lib/link.ts

+16-7
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,36 @@
1-
import { mergeDataIntoQueryString, router, shouldIntercept } from '@inertiajs/core'
1+
import { mergeDataIntoQueryString, router, shouldIntercept, type VisitOptions } from '@inertiajs/core'
2+
import type { Action } from 'svelte/action'
23

3-
export default (node, options = {}) => {
4+
interface ActionElement extends HTMLElement {
5+
href?: string
6+
}
7+
8+
type ActionParameters = VisitOptions & { href?: string }
9+
10+
const link: Action<ActionElement, ActionParameters> = (node, options = {}) => {
411
const [href, data] = hrefAndData(options)
512
node.href = href
613
options.data = data
714

8-
function fireEvent(name, eventOptions = {}) {
15+
function fireEvent(name: string, eventOptions = {}) {
916
return node.dispatchEvent(new CustomEvent(name, eventOptions))
1017
}
1118

12-
function hrefAndData(options) {
19+
function hrefAndData(options: ActionParameters) {
1320
return mergeDataIntoQueryString(
1421
options.method || 'get',
1522
node.href || options.href || '',
16-
options.data || {},
23+
options.data || ({} as any),
1724
options.queryStringArrayFormat || 'brackets',
1825
)
1926
}
2027

21-
function visit(event) {
28+
function visit(event: Event) {
2229
if (!node.href) {
2330
throw new Error('Option "href" is required')
2431
}
2532

26-
if (shouldIntercept(event)) {
33+
if (shouldIntercept(event as KeyboardEvent)) {
2734
event.preventDefault()
2835

2936
router.visit(node.href, {
@@ -53,3 +60,5 @@ export default (node, options = {}) => {
5360
},
5461
}
5562
}
63+
64+
export default link
File renamed without changes.

‎packages/svelte/src/remember.js ‎packages/svelte/src/lib/remember.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { router } from '@inertiajs/core'
22
import { onDestroy } from 'svelte'
33
import { writable } from 'svelte/store'
44

5-
function useRemember(initialState, key) {
6-
const restored = router.restore(key)
5+
function useRemember<State>(initialState: State, key?: string) {
6+
const restored = router.restore(key) as State | undefined
77
const store = writable(restored !== undefined ? restored : initialState)
88
const unsubscribe = store.subscribe((state) => router.remember(state, key))
99

File renamed without changes.

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

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { Page } from '@inertiajs/core'
2+
import { writable } from 'svelte/store'
3+
import type { ResolvedComponents } from './types'
4+
5+
interface Store {
6+
component: ResolvedComponents | null
7+
page: Page | null
8+
key?: number | null
9+
}
10+
11+
const store = writable<Store>({
12+
component: null,
13+
page: null,
14+
key: null,
15+
})
16+
17+
export default store

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

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { Page } from '@inertiajs/core'
2+
import type { ComponentType } from 'svelte'
3+
4+
export type ComponentsResolver = (name: string, page: Page) => ResolvedComponents | Promise<ResolvedComponents>
5+
6+
export type ResolvedComponents = {
7+
default?: ComponentType
8+
layout?: ComponentType
9+
}

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

+266
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
1+
import type {
2+
ActiveVisit,
3+
Errors,
4+
FormDataConvertible,
5+
Method,
6+
Page,
7+
PendingVisit,
8+
Progress,
9+
RequestPayload,
10+
VisitOptions,
11+
} from '@inertiajs/core'
12+
import { router } from '@inertiajs/core'
13+
import type { AxiosProgressEvent } from 'axios'
14+
import cloneDeep from 'lodash.clonedeep'
15+
import isEqual from 'lodash.isequal'
16+
import { writable, type Writable } from 'svelte/store'
17+
18+
type FormDataType = Record<string, FormDataConvertible>
19+
20+
interface InertiaFormProps<TForm extends FormDataType> {
21+
isDirty: boolean
22+
errors: Partial<Record<keyof TForm, string>>
23+
hasErrors: boolean
24+
progress: Progress | null
25+
wasSuccessful: boolean
26+
recentlySuccessful: boolean
27+
processing: boolean
28+
setStore(data: TForm): void
29+
setStore(key: keyof TForm, value?: FormDataConvertible): void
30+
data(): TForm
31+
transform(callback: (data: TForm) => object): this
32+
defaults(): this
33+
defaults(fields: Partial<TForm>): this
34+
defaults(field?: keyof TForm, value?: FormDataConvertible): this
35+
reset(...fields: (keyof TForm)[]): this
36+
clearErrors(...fields: (keyof TForm)[]): this
37+
setError(field: keyof TForm, value: string): this
38+
setError(errors: Errors): this
39+
submit(method: Method, url: string, options?: Partial<VisitOptions>): void
40+
get(url: string, options?: Partial<VisitOptions>): void
41+
post(url: string, options?: Partial<VisitOptions>): void
42+
put(url: string, options?: Partial<VisitOptions>): void
43+
patch(url: string, options?: Partial<VisitOptions>): void
44+
delete(url: string, options?: Partial<VisitOptions>): void
45+
cancel(): void
46+
}
47+
48+
export type InertiaForm<TForm extends FormDataType> = InertiaFormProps<TForm> & TForm
49+
50+
export default function useForm<TForm extends FormDataType>(data: TForm | (() => TForm)): Writable<InertiaForm<TForm>>
51+
export default function useForm<TForm extends FormDataType>(
52+
rememberKey: string,
53+
data: TForm | (() => TForm),
54+
): Writable<InertiaForm<TForm>>
55+
export default function useForm<TForm extends FormDataType>(
56+
rememberKeyOrData: string | TForm | (() => TForm),
57+
maybeData?: TForm | (() => TForm),
58+
): Writable<InertiaForm<TForm>> {
59+
const rememberKey = typeof rememberKeyOrData === 'string' ? rememberKeyOrData : null
60+
const data = typeof rememberKeyOrData === 'string' ? maybeData : rememberKeyOrData
61+
const restored = rememberKey
62+
? (router.restore(rememberKey) as { data: TForm; errors: Record<keyof TForm, string> })
63+
: null
64+
let defaults = typeof data === 'function' ? cloneDeep(data()) : cloneDeep(data)
65+
let cancelToken: { cancel: () => void } | null = null
66+
let recentlySuccessfulTimeoutId: ReturnType<typeof setTimeout> | null = null
67+
let transform = (data: TForm) => data as object
68+
69+
const store = writable<InertiaForm<TForm>>({
70+
...(restored ? restored.data : data),
71+
isDirty: false,
72+
errors: restored ? restored.errors : {},
73+
hasErrors: false,
74+
progress: null,
75+
wasSuccessful: false,
76+
recentlySuccessful: false,
77+
processing: false,
78+
setStore(keyOrData, maybeData = undefined) {
79+
store.update((store) => {
80+
return Object.assign(store, typeof keyOrData === 'string' ? { [keyOrData]: maybeData } : keyOrData)
81+
})
82+
},
83+
data() {
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
88+
},
89+
transform(callback) {
90+
transform = callback
91+
92+
return this
93+
},
94+
defaults(fieldOrFields?: keyof TForm | Record<keyof TForm, string>, maybeValue?: string) {
95+
if (typeof fieldOrFields === 'undefined') {
96+
defaults = Object.assign(defaults, cloneDeep(this.data()))
97+
98+
return this
99+
}
100+
101+
defaults = Object.assign(
102+
cloneDeep(defaults),
103+
cloneDeep(typeof fieldOrFields === 'string' ? { [fieldOrFields]: maybeValue } : fieldOrFields),
104+
)
105+
106+
return this
107+
},
108+
reset(...fields) {
109+
const resolvedData = typeof data === 'object' ? cloneDeep(defaults) : cloneDeep(data!())
110+
const clonedData = cloneDeep(resolvedData)
111+
if (fields.length === 0) {
112+
this.setStore(clonedData)
113+
} else {
114+
this.setStore(
115+
Object.keys(clonedData)
116+
.filter((key) => fields.includes(key))
117+
.reduce((carry, key) => {
118+
carry[key] = clonedData[key]
119+
return carry
120+
}, {} as FormDataType) as TForm,
121+
)
122+
}
123+
124+
return this
125+
},
126+
setError(fieldOrFields: keyof TForm | Errors, maybeValue?: string) {
127+
this.setStore('errors', {
128+
...this.errors,
129+
...((typeof fieldOrFields === 'string' ? { [fieldOrFields]: maybeValue } : fieldOrFields) as any),
130+
})
131+
132+
return this
133+
},
134+
clearErrors(...fields) {
135+
this.setStore(
136+
'errors',
137+
Object.keys(this.errors).reduce(
138+
(carry, field) => ({
139+
...carry,
140+
...(fields.length > 0 && !fields.includes(field) ? { [field]: this.errors[field] } : {}),
141+
}),
142+
{},
143+
),
144+
)
145+
146+
return this
147+
},
148+
submit(method, url, options = {}) {
149+
const data = transform(this.data()) as RequestPayload
150+
const _options: Omit<VisitOptions, 'method'> = {
151+
...options,
152+
onCancelToken: (token: { cancel: () => void }) => {
153+
cancelToken = token
154+
155+
if (options.onCancelToken) {
156+
return options.onCancelToken(token)
157+
}
158+
},
159+
onBefore: (visit: PendingVisit) => {
160+
this.setStore('wasSuccessful', false)
161+
this.setStore('recentlySuccessful', false)
162+
if (recentlySuccessfulTimeoutId) {
163+
clearTimeout(recentlySuccessfulTimeoutId)
164+
}
165+
166+
if (options.onBefore) {
167+
return options.onBefore(visit)
168+
}
169+
},
170+
onStart: (visit: PendingVisit) => {
171+
this.setStore('processing', true)
172+
173+
if (options.onStart) {
174+
return options.onStart(visit)
175+
}
176+
},
177+
onProgress: (event?: AxiosProgressEvent) => {
178+
this.setStore('progress', event as any)
179+
180+
if (options.onProgress) {
181+
return options.onProgress(event)
182+
}
183+
},
184+
onSuccess: async (page: Page) => {
185+
this.setStore('processing', false)
186+
this.setStore('progress', null)
187+
this.clearErrors()
188+
this.setStore('wasSuccessful', true)
189+
this.setStore('recentlySuccessful', true)
190+
recentlySuccessfulTimeoutId = setTimeout(() => this.setStore('recentlySuccessful', false), 2000)
191+
192+
if (options.onSuccess) {
193+
return options.onSuccess(page)
194+
}
195+
},
196+
onError: (errors: Errors) => {
197+
this.setStore('processing', false)
198+
this.setStore('progress', null)
199+
this.clearErrors().setError(errors)
200+
201+
if (options.onError) {
202+
return options.onError(errors)
203+
}
204+
},
205+
onCancel: () => {
206+
this.setStore('processing', false)
207+
this.setStore('progress', null)
208+
209+
if (options.onCancel) {
210+
return options.onCancel()
211+
}
212+
},
213+
onFinish: (visit: ActiveVisit) => {
214+
this.setStore('processing', false)
215+
this.setStore('progress', null)
216+
cancelToken = null
217+
218+
if (options.onFinish) {
219+
return options.onFinish(visit)
220+
}
221+
},
222+
}
223+
224+
if (method === 'delete') {
225+
router.delete(url, { ..._options, data })
226+
} else {
227+
router[method](url, data, _options)
228+
}
229+
},
230+
get(url, options) {
231+
this.submit('get', url, options)
232+
},
233+
post(url, options) {
234+
this.submit('post', url, options)
235+
},
236+
put(url, options) {
237+
this.submit('put', url, options)
238+
},
239+
patch(url, options) {
240+
this.submit('patch', url, options)
241+
},
242+
delete(url, options) {
243+
this.submit('delete', url, options)
244+
},
245+
cancel() {
246+
cancelToken?.cancel()
247+
},
248+
} as InertiaForm<TForm>)
249+
250+
store.subscribe((form) => {
251+
if (form.isDirty === isEqual(form.data(), defaults)) {
252+
form.setStore('isDirty', !form.isDirty)
253+
}
254+
255+
const hasErrors = Object.keys(form.errors).length > 0
256+
if (form.hasErrors !== hasErrors) {
257+
form.setStore('hasErrors', !form.hasErrors)
258+
}
259+
260+
if (rememberKey) {
261+
router.remember({ data: form.data(), errors: form.errors }, rememberKey)
262+
}
263+
})
264+
265+
return store as Writable<InertiaForm<TForm>>
266+
}

‎packages/svelte/src/store.js

-10
This file was deleted.

‎packages/svelte/src/useForm.js

-210
This file was deleted.

‎packages/svelte/svelte.config.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import adapter from '@sveltejs/adapter-auto'
2+
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
3+
4+
/** @type {import('@sveltejs/kit').Config} */
5+
const config = {
6+
preprocess: vitePreprocess(),
7+
kit: {
8+
adapter: adapter(),
9+
},
10+
}
11+
12+
export default config

‎packages/svelte/tsconfig.json

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"extends": "./.svelte-kit/tsconfig.json",
3+
"compilerOptions": {
4+
"allowJs": true,
5+
"checkJs": true,
6+
"esModuleInterop": true,
7+
"forceConsistentCasingInFileNames": true,
8+
"resolveJsonModule": true,
9+
"skipLibCheck": true,
10+
"sourceMap": true,
11+
"strict": true
12+
}
13+
}

‎packages/svelte/vite.config.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { sveltekit } from '@sveltejs/kit/vite'
2+
import { defineConfig } from 'vite'
3+
4+
export default defineConfig({
5+
plugins: [sveltekit()],
6+
})

‎playgrounds/svelte/resources/js/ssr.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { createInertiaApp } from '@inertiajs/svelte'
22
import createServer from '@inertiajs/svelte/server'
33
import { render } from 'svelte/server'
4+
45
createServer((page) =>
56
createInertiaApp({
67
page,

‎playgrounds/svelte/vite.config.js

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

‎pnpm-lock.yaml

+787-11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.