Skip to content

Commit 98e463b

Browse files
committed
dev ssr
1 parent 2ca0409 commit 98e463b

File tree

17 files changed

+145
-12
lines changed

17 files changed

+145
-12
lines changed

package-lock.json

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

packages/core/build.js

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const builds = [
3030
{ entryPoints: ['src/index.ts'], format: 'cjs', outfile: 'dist/index.js', platform: 'browser' },
3131
{ entryPoints: ['src/server.ts'], format: 'esm', outfile: 'dist/server.esm.js', platform: 'node' },
3232
{ entryPoints: ['src/server.ts'], format: 'cjs', outfile: 'dist/server.js', platform: 'node' },
33+
{ entryPoints: ['src/vite.ts'], format: 'esm', outfile: 'dist/vite.js', platform: 'node' },
3334
]
3435

3536
builds.forEach(async (build) => {

packages/core/package.json

+14-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
"types": "./types/server.d.ts",
3535
"import": "./dist/server.esm.js",
3636
"require": "./dist/server.js"
37+
},
38+
"./vite": {
39+
"types": "./types/vite.d.ts",
40+
"default": "./dist/vite.js"
3741
}
3842
},
3943
"typesVersions": {
@@ -55,13 +59,22 @@
5559
"deepmerge": "^4.0.0",
5660
"qs": "^6.9.0"
5761
},
62+
"peerDependencies": {
63+
"vite": "^5.4.0 | ^6.0.0"
64+
},
65+
"peerDependenciesMeta": {
66+
"vite": {
67+
"optional": true
68+
}
69+
},
5870
"devDependencies": {
5971
"@types/deepmerge": "^2.2.0",
6072
"@types/node": "^14.0",
6173
"@types/nprogress": "^0.2.0",
6274
"@types/qs": "^6.9.0",
6375
"esbuild": "^0.25.0",
6476
"esbuild-node-externals": "^1.6.0",
65-
"typescript": "^4.9.4"
77+
"typescript": "^4.9.4",
78+
"vite": "^5.4.8"
6679
}
6780
}

packages/core/src/server.ts

+4-10
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
11
import { createServer, IncomingMessage } from 'http'
22
import * as process from 'process'
3-
import { InertiaAppResponse, Page } from './types'
3+
import { readableToString } from './serverUtils'
4+
import type { InertiaAppResponse, Page } from './types'
45

5-
type AppCallback = (page: Page) => InertiaAppResponse
6-
type RouteHandler = (request: IncomingMessage) => Promise<unknown>
6+
export type AppCallback = (page: Page) => InertiaAppResponse
77

8-
const readableToString: (readable: IncomingMessage) => Promise<string> = (readable) =>
9-
new Promise((resolve, reject) => {
10-
let data = ''
11-
readable.on('data', (chunk) => (data += chunk))
12-
readable.on('end', () => resolve(data))
13-
readable.on('error', (err) => reject(err))
14-
})
8+
type RouteHandler = (request: IncomingMessage) => Promise<unknown>
159

1610
export default (render: AppCallback, port?: number): void => {
1711
const _port = port || 13714

packages/core/src/serverUtils.ts

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { IncomingMessage } from 'http'
2+
3+
export const readableToString: (readable: IncomingMessage) => Promise<string> = (readable) =>
4+
new Promise((resolve, reject) => {
5+
let data = ''
6+
readable.on('data', (chunk) => (data += chunk))
7+
readable.on('end', () => resolve(data))
8+
readable.on('error', (err) => reject(err))
9+
})

packages/core/src/vite.ts

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import type { Plugin } from 'vite'
2+
import { readableToString } from './serverUtils'
3+
4+
interface PluginConfig {
5+
renderer: string
6+
}
7+
8+
export default function inertia(config: string | PluginConfig): Plugin {
9+
const resolvedConfig = resolveConfig(config)
10+
11+
return {
12+
name: '@inertiajs/core/vite',
13+
async configureServer(server) {
14+
return () =>
15+
server.middlewares.use(async (req, res, next) => {
16+
if (req.url !== '/render') {
17+
next()
18+
}
19+
20+
const { default: render } = await server.ssrLoadModule(resolvedConfig.renderer)
21+
const response = await render(JSON.parse(await readableToString(req)))
22+
res.writeHead(200, { 'Content-Type': 'application/json' })
23+
res.end(JSON.stringify(response))
24+
})
25+
},
26+
}
27+
}
28+
29+
function resolveConfig(config: string | PluginConfig) {
30+
if (typeof config === 'undefined') {
31+
throw new Error('@inertiajs/core/vite: missing configuration.')
32+
}
33+
34+
if (typeof config === 'string') {
35+
return { renderer: config }
36+
}
37+
38+
if (typeof config.renderer === 'undefined') {
39+
throw new Error('@inertiajs/core/vite: missing configuration for "renderer".')
40+
}
41+
42+
return config
43+
}

packages/react/src/server.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
export * from '@inertiajs/core/server'
12
export { default as default } from '@inertiajs/core/server'

packages/svelte/src/server.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
export * from '@inertiajs/core/server'
12
export { default as default } from '@inertiajs/core/server'

packages/vue3/src/server.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
export * from '@inertiajs/core/server'
12
export { default as default } from '@inertiajs/core/server'
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { createInertiaApp } from '@inertiajs/react'
2+
import type { AppCallback } from '@inertiajs/react/server'
3+
import * as ReactDOMServer from 'react-dom/server'
4+
5+
const render: AppCallback = (page) =>
6+
createInertiaApp({
7+
page,
8+
render: ReactDOMServer.renderToString,
9+
title: (title) => `${title} - React Playground`,
10+
resolve: (name) => import(`./Pages/${name}.tsx`),
11+
setup: ({ App, props }) => <App {...props} />,
12+
})
13+
14+
export default render

playgrounds/react/vite.config.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import inertia from '@inertiajs/core/vite'
12
import react from '@vitejs/plugin-react'
23
import laravel from 'laravel-vite-plugin'
34
import { defineConfig } from 'vite'
@@ -9,6 +10,7 @@ export default defineConfig({
910
ssr: 'resources/js/ssr.tsx',
1011
refresh: true,
1112
}),
13+
inertia('resources/js/viteSsr.tsx'),
1214
react({}),
1315
],
1416
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { createInertiaApp } from '@inertiajs/svelte'
2+
import type { AppCallback } from '@inertiajs/svelte/server'
3+
4+
const render: AppCallback = (page) =>
5+
createInertiaApp({
6+
page,
7+
resolve: (name) => import(`./Pages/${name}.svelte`),
8+
})
9+
10+
export default render

playgrounds/svelte4/vite.config.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import inertia from '@inertiajs/core/vite'
12
import { svelte } from '@sveltejs/vite-plugin-svelte'
23
import laravel from 'laravel-vite-plugin'
34
import { defineConfig } from 'vite'
@@ -9,6 +10,7 @@ export default defineConfig({
910
ssr: 'resources/js/ssr.ts',
1011
refresh: true,
1112
}),
13+
inertia('resources/js/viteSsr.ts'),
1214
svelte({
1315
compilerOptions: {
1416
hydratable: true,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { createInertiaApp } from '@inertiajs/svelte'
2+
import type { AppCallback } from '@inertiajs/svelte/server'
3+
4+
const render: AppCallback = (page) =>
5+
createInertiaApp({
6+
page,
7+
resolve: (name) => import(`./Pages/${name}.svelte`),
8+
})
9+
10+
export default render

playgrounds/svelte5/vite.config.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { svelte } from '@sveltejs/vite-plugin-svelte'
22
import laravel from 'laravel-vite-plugin'
33
import { defineConfig } from 'vite'
4+
import inertia from '@inertiajs/core/vite';
45

56
export default defineConfig({
67
plugins: [
@@ -9,6 +10,7 @@ export default defineConfig({
910
ssr: 'resources/js/ssr.ts',
1011
refresh: true,
1112
}),
13+
inertia('resources/js/viteSsr.ts'),
1214
svelte(),
1315
],
1416
})
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { createInertiaApp } from '@inertiajs/vue3'
2+
import type { AppCallback } from '@inertiajs/vue3/server'
3+
import { renderToString } from '@vue/server-renderer'
4+
import { createSSRApp, h } from 'vue'
5+
6+
const render: AppCallback = (page) =>
7+
createInertiaApp({
8+
page,
9+
render: renderToString,
10+
title: (title) => `${title} - Vue 3 Playground`,
11+
resolve: (name) => import(`./Pages/${name}.vue`),
12+
setup({ App, props, plugin }) {
13+
return createSSRApp({
14+
render: () => h(App, props),
15+
}).use(plugin)
16+
},
17+
})
18+
19+
export default render

playgrounds/vue3/vite.config.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import inertia from '@inertiajs/core/vite'
12
import vue from '@vitejs/plugin-vue'
23
import laravel from 'laravel-vite-plugin'
34
import { defineConfig } from 'vite'
@@ -9,6 +10,7 @@ export default defineConfig({
910
ssr: 'resources/js/ssr.ts',
1011
refresh: true,
1112
}),
13+
inertia('resources/js/viteSsr.ts'),
1214
vue({
1315
template: {
1416
transformAssetUrls: {

0 commit comments

Comments
 (0)