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