/
serve.ts
101 lines (92 loc) · 2.39 KB
/
serve.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// this is automatically detected by playground/vitestSetup.ts and will replace
// the default e2e test serve behavior
import path from 'path'
import http from 'http'
import sirv from 'sirv'
import {
isBuild,
page,
ports,
rootDir,
serverLogs,
setViteUrl,
viteTestUrl
} from '~utils'
export const port = ports.lib
export async function serve(): Promise<{ close(): Promise<void> }> {
setupConsoleWarnCollector()
if (!isBuild) {
const { createServer } = await import('vite')
process.env.VITE_INLINE = 'inline-serve'
const viteServer = await (
await createServer({
root: rootDir,
logLevel: 'silent',
server: {
watch: {
usePolling: true,
interval: 100
},
host: true,
fs: {
strict: !isBuild
}
},
build: {
target: 'esnext'
}
})
).listen()
// use resolved port/base from server
const base = viteServer.config.base === '/' ? '' : viteServer.config.base
setViteUrl(`http://localhost:${viteServer.config.server.port}${base}`)
await page.goto(viteTestUrl)
return viteServer
} else {
const { build } = await import('vite')
await build({
root: rootDir,
logLevel: 'silent',
configFile: path.resolve(__dirname, '../vite.config.js')
})
await build({
root: rootDir,
logLevel: 'warn', // output esbuild warns
configFile: path.resolve(__dirname, '../vite.dyimport.config.js')
})
// start static file server
const serve = sirv(path.resolve(rootDir, 'dist'))
const httpServer = http.createServer((req, res) => {
if (req.url === '/ping') {
res.statusCode = 200
res.end('pong')
} else {
serve(req, res)
}
})
return new Promise((resolve, reject) => {
try {
const server = httpServer.listen(port, async () => {
await page.goto(`http://localhost:${port}`)
resolve({
// for test teardown
async close() {
await new Promise((resolve) => {
server.close(resolve)
})
}
})
})
} catch (e) {
reject(e)
}
})
}
}
function setupConsoleWarnCollector() {
const warn = console.warn
console.warn = (...args) => {
serverLogs.push(args.join(' '))
return warn.call(console, ...args)
}
}