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
|
/*
* SonarQube
* Copyright (C) 2009-2023 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/* eslint-disable no-console */
process.env.NODE_ENV = 'development';
const fs = require('fs');
const chalk = require('chalk');
const esbuild = require('esbuild');
const http = require('http');
const httpProxy = require('http-proxy');
const getConfig = require('../config/esbuild-config');
const { handleL10n } = require('./utils');
const paths = require('../config/paths');
const STATUS_OK = 200;
const STATUS_ERROR = 500;
const port = process.env.PORT || 3000;
const protocol = process.env.HTTPS === 'true' ? 'https' : 'http';
const host = process.env.HOST || 'localhost';
const proxyTarget = process.env.PROXY || 'http://localhost:9000';
const config = getConfig(false);
function handleStaticFileRequest(req, res) {
fs.readFile(paths.appBuild + req.url, (err, data) => {
if (err) {
// Any unknown path should go to the index.html
const htmlTemplate = require('../config/indexHtmlTemplate');
// Replace hash placeholders as well as all the
// tags that are usually replaced by the server
const content = htmlTemplate('', '')
.replace(/%WEB_CONTEXT%/g, '')
.replace(/%SERVER_STATUS%/g, 'UP')
.replace(/%INSTANCE%/g, 'SonarQube')
.replace(/%OFFICIAL%/g, 'true');
res.writeHead(STATUS_OK);
res.end(content);
} else {
res.writeHead(STATUS_OK);
res.end(data);
}
});
}
function run() {
console.log('starting...');
esbuild
.serve(
{
servedir: 'build/webapp'
},
config
)
.then(result => {
const { port: esbuildport } = result;
const proxy = httpProxy.createProxyServer();
const esbuildProxy = httpProxy.createProxyServer({
target: `http://localhost:${esbuildport}`
});
proxy.on('error', error => {
console.error(chalk.blue('Backend'));
console.error('\t', chalk.red(error.message));
console.error('\t', error.stack);
});
esbuildProxy.on('error', error => {
console.error(chalk.cyan('Frontend'));
console.error('\t', chalk.red(error.message));
console.error('\t', error.stack);
});
http
.createServer((req, res) => {
if (req.url.match(/js\/out/)) {
esbuildProxy.web(req, res);
} else if (req.url.match(/l10n\/index/)) {
handleL10n(res);
} else if (
(req.url.includes('api/') && !req.url.includes('/web_api')) ||
req.url.includes('images/') ||
req.url.includes('static/')
) {
proxy.web(
req,
res,
{
target: proxyTarget
},
e => console.error('req error', e)
);
} else {
handleStaticFileRequest(req, res);
}
})
.listen(port);
console.log(`server started: http://localhost:${port}`);
})
.catch(e => console.error(e));
}
run();
|