-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdev.esbuild.config.mjs
77 lines (68 loc) · 2.08 KB
/
dev.esbuild.config.mjs
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
import { context } from 'esbuild';
import fs from 'node:fs';
import http from 'node:http';
import config from './esbuild.config.mjs';
const HOST = 'localhost';
const INTERVAL = 1000;
const PORT = '3000';
const serve = async () => {
const CTX = await context(config);
const { host, port } = await CTX.serve({
servedir: 'dist',
});
// Setup a proxy server
http
.createServer((req, res) => {
const { url, method, headers } = req;
const hasExtension = /.*\..*$/.test(url);
let path;
if (hasExtension && !url.endsWith('/index.html')) {
const parts = url.split('/').reverse();
for (let i = parts.length - 1; i >= 0; i -= 1) {
if (['css', 'js', 'assets'].includes(parts[i])) break;
parts.pop();
}
path = `/${parts.reverse().join('/')}`;
} else if (url.endsWith('esbuild')) {
path = '/esbuild';
} else {
path = '/index.html';
}
const options = {
hostname: host,
port,
path,
method,
headers,
};
// Forward each incoming request to esbuild
const proxyReq = http.request(options, (proxyRes) => {
// Redirect 404 to index
if (proxyRes.statusCode === 404) {
try {
const indexFile = fs.readFileSync('dist/index.html');
res.writeHead(200, {
// ...proxyRes.headers,
'Content-Location': '/index.html',
'Content-Type': 'text/html',
});
res.end(indexFile);
return;
} catch (e) {
// eslint-disable-next-line
console.error('Could not file index file', e);
}
}
res.writeHead(proxyRes.statusCode, proxyRes.headers);
proxyRes.pipe(res, { end: true });
});
// Forward the body of the request to esbuild
req.pipe(proxyReq, { end: true });
})
.listen(PORT, () => {
// eslint-disable-next-line
console.log(`Server available on http://${HOST}:${PORT}`);
});
setInterval(() => CTX.rebuild(), INTERVAL);
};
serve();