This commit is contained in:
2025-05-24 01:47:40 +09:00
commit 09d97cbb0b
1594 changed files with 184634 additions and 0 deletions

67
server/serve/event.ts Normal file
View File

@@ -0,0 +1,67 @@
import { readFileSync } from 'node:fs'
import {
setResponseStatus,
setResponseHeader,
getRequestURL,
eventHandler,
} from 'h3'
import { isProduction, isDebug } from 'std-env'
import type { ViteDevServer } from 'vite'
import type { VueroServerRender } from '../types'
import { resolve } from '../utils'
export function createEventHandler({
vite,
render,
template: baseTemplate,
manifest,
}: {
vite?: ViteDevServer
render: VueroServerRender
template: string
manifest: Record<string, any>
}) {
return eventHandler(async (event) => {
try {
// load template and render function from vue app
let template = baseTemplate
if (!isProduction && vite) {
const url = getRequestURL(event)
// always read fresh template in dev
template = readFileSync(resolve('../index.html'), 'utf-8')
template = await vite.transformIndexHtml(url.pathname, template)
// reload the server entrypoint on every request in dev
render = (await vite.ssrLoadModule('/src/entry-server.ts')).render
}
// render the vue app to HTML
return await render({
event,
manifest,
template,
})
}
catch (error: any) {
// handle error 500 page
if (!isProduction || isDebug) {
setResponseHeader(event, 'Cache-Control', 'no-cache, no-store, must-revalidate')
setResponseStatus(event, 500)
vite?.ssrFixStacktrace(error)
console.error('[dev] [pageError] ', error)
return error.message
}
else {
setResponseHeader(event, 'Cache-Control', 'no-cache, no-store, must-revalidate')
setResponseStatus(event, 500)
console.error('[pageError] ' + error)
return 'Internal Server Error'
}
}
})
}

View File

@@ -0,0 +1,20 @@
import { isProduction, isDebug } from 'std-env'
export function registerProcessHandlers() {
if (!isProduction || isDebug) {
process.on('unhandledRejection', error =>
console.error('[dev] [unhandledRejection]', error),
)
process.on('uncaughtException', error =>
console.error('[dev] [uncaughtException]', error),
)
}
else {
process.on('unhandledRejection', error =>
console.error('[unhandledRejection] ' + error),
)
process.on('uncaughtException', error =>
console.error('[uncaughtException] ' + error),
)
}
}

68
server/serve/renderer.ts Normal file
View File

@@ -0,0 +1,68 @@
/* eslint-disable @typescript-eslint/ban-ts-comment */
import { readFileSync } from 'node:fs'
import type { ViteDevServer } from 'vite'
import type { VueroServerRender } from '../types.js'
import { isProduction } from 'std-env'
import { resolve } from '../utils.js'
export async function createRenderer() {
let vite: ViteDevServer | undefined
let render: VueroServerRender
if (!isProduction) {
const createServer = await import('vite').then(m => m.createServer)
vite = await createServer({
root: process.cwd(),
logLevel: 'info',
appType: 'custom',
server: {
middlewareMode: true,
},
define: {
__VUERO_SSR_BUILD__: true,
},
})
// mock renderer, it will be reloaded on each request in dev
render = async () => ''
}
else {
/**
* Otherwise, we load compiled version,
* and we register compression and serve-static express handlers in h3
*
* @see https://github.com/expressjs/compression
* @see https://github.com/expressjs/serve-static
*/
// @ts-ignore - file present only when built
render = await import('../../dist/server/entry-server.mjs').then(m => m.render)
}
return {
vite,
render,
}
}
export async function loadAssets() {
const manifest: Record<string, any> = isProduction
? await import(
// @ts-ignore - file present only when built
'../../dist/client/.vite/ssr-manifest.json',
{ assert: { type: 'json' } }
)
: {}
const template = isProduction
? readFileSync(resolve('../dist/client/index.html'), 'utf-8')
: ''
return {
manifest,
template,
}
}