-
Notifications
You must be signed in to change notification settings - Fork 0
/
esbuild.config.base.js
124 lines (112 loc) · 3.58 KB
/
esbuild.config.base.js
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
const esbuild = require('esbuild');
const http = require('node:http');
const baseConf = {
loader: { '.js': 'jsx' },
entryPoints: ['./src/index.js'],
plugins: [],
format: 'esm',
bundle: true,
minify: !process.env.SKIP_MINIFY,
sourcemap: true,
metafile: true,
legalComments: 'none',
logLevel: 'info',
target: ['chrome58', 'firefox57', 'safari11'],
outdir: 'dist',
jsx: 'automatic',
external: [
'json-logic-js',
'react'
],
define: {
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production'),
global: 'window',
},
};
const build = async ({ conf, analyze } = { conf: false, analyze: true }) => {
const result = await esbuild.build(conf || baseConf);
if (analyze) {
const analyze = await esbuild.analyzeMetafile(result.metafile);
console.log(`\nBundle:\n${analyze}`);
}
};
const prepareWithCompat = ({
conf,
analyze,
mergeConfs,
}) => {
const configuration = mergeConfs ? { ...baseConf, ...conf } : (conf || baseConf);
return {
analyze,
conf: {
...configuration,
plugins: [
...(configuration.plugins || []),
],
},
};
};
const buildWithCompat = opts => build(prepareWithCompat(opts));
const serveWithCompat = async opts => {
const ctx = await esbuild.context(prepareWithCompat(opts).conf);
await ctx.watch();
const { host, port } = await ctx.serve(opts.serve);
const proxyPort = +(process.env.DEV_SERVER_PORT || '3000');
const jsonRpcMocks = (process.env.DEV_JSONRPC_MOCK && require(process.env.DEV_JSONRPC_MOCK)) || function () {
return {
jsonrpc: '2.0',
error: {
code: -32601,
message: 'unknown method',
},
};
};
http.createServer((req, res) => {
const { method, url } = req;
if (method === 'POST' && '/jsonrpc' === url) {
let buffer = '';
req.on('data', chunk => buffer += chunk);
req.on('end', () => {
try {
const data = JSON.parse(buffer);
res.setHeader('content-type', 'application/json');
res.writeHead(200);
if (Array.isArray(data)) {
res.end(data.map(it => JSON.stringify(jsonRpcMocks(it), null, 2)));
} else {
res.end(JSON.stringify(jsonRpcMocks(data), null, 2));
}
} catch (e) {
console.error(e, `'${buffer.toString()}'`);
throw e;
}
});
return;
}
const proxyReq = http.request(
{
hostname: host,
port,
path: req.url.indexOf('.') > 1 ? req.url : '/index.html',
method: req.method,
headers: req.headers,
},
proxyRes => {
if (proxyRes.statusCode === 404) {
res.writeHead(404, { 'Content-Type': 'text/html' })
res.end('<h1>404 page</h1>')
return
}
res.writeHead(proxyRes.statusCode, proxyRes.headers)
proxyRes.pipe(res, { end: true })
});
req.pipe(proxyReq, { end: true })
}).listen(proxyPort, 'localhost', () => console.log(`Started server on http://localhost:${proxyPort}`));
};
module.exports = {
esbuild,
baseConf,
build,
buildWithCompat,
serveWithCompat,
};