| 6 | export const port = ports['legacy/ssr'] |
| 7 | |
| 8 | export async function serve(): Promise<{ close(): Promise<void> }> { |
| 9 | const { build } = await import('vite') |
| 10 | await build({ |
| 11 | root: rootDir, |
| 12 | logLevel: 'silent', |
| 13 | build: { |
| 14 | target: 'esnext', |
| 15 | ssr: 'entry-server.js', |
| 16 | outDir: 'dist/server', |
| 17 | }, |
| 18 | }) |
| 19 | |
| 20 | const { default: express } = await import('express') |
| 21 | const app = express() |
| 22 | |
| 23 | app.use('/', async (_req, res) => { |
| 24 | const { render } = await import( |
| 25 | path.resolve(rootDir, './dist/server/entry-server.js') |
| 26 | ) |
| 27 | const html = await render() |
| 28 | res.status(200).set({ 'Content-Type': 'text/html' }).end(html) |
| 29 | }) |
| 30 | |
| 31 | return new Promise((resolve, reject) => { |
| 32 | try { |
| 33 | const server = app.listen(port, () => { |
| 34 | resolve({ |
| 35 | // for test teardown |
| 36 | async close() { |
| 37 | await new Promise((resolve) => { |
| 38 | server.close(resolve) |
| 39 | }) |
| 40 | }, |
| 41 | }) |
| 42 | }) |
| 43 | } catch (e) { |
| 44 | reject(e) |
| 45 | } |
| 46 | }) |
| 47 | } |