-
Notifications
You must be signed in to change notification settings - Fork 17
/
server.js
50 lines (42 loc) · 1.85 KB
/
server.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
/* eslint-env node */
// The main purpose of this express server is to simulate github's behavior as closely as possible.
const express = require('express');
const path = require('path');
const fs = require('fs');
const compression = require('compression');
const { buildBaseDir, buildDir, publicPathWithoutSlash } = require('./buildconstants');
// All RegExps that involve paths must have the path parts surrounded by regexpCompPath
const regexpCompPath = (str) => path.normalize(str).replace(/\\/g, '\\\\');
const slash = regexpCompPath('/');
const app = express();
app.use(compression());
// serve our static stuff (i.e. urls that match files that exists)
app.use(publicPathWithoutSlash, express.static(path.normalize(buildDir), {redirect: false}));
// send all requests other requests here
app.get('*', function (req, res) {
const url = req.params[0];
//console.log('url', url);
if (!url.startsWith(publicPathWithoutSlash)) {
console.log('Redirecting to', publicPathWithoutSlash);
res.redirect(publicPathWithoutSlash);
} else {
let filepath;
if (url === publicPathWithoutSlash || url === publicPathWithoutSlash + '/') {
filepath = path.join(buildDir, 'index.html');
} else {
filepath = path.join(buildBaseDir, url, url.endsWith('/') ? 'index.html' : '');
if (new RegExp(`^(.*${slash}[^.${slash}]+)$`).test(filepath)) { // if urlpath has no extension...
filepath = filepath + '.html'; // ... add .html extension
}
if (!fs.existsSync(filepath)) { // if file doesn't exist, send to 404.html
console.log('Could not find file at path', filepath);
filepath = path.join(buildDir, '404.html');
}
}
res.sendFile(filepath); // Otherwise serve file
}
});
const PORT = process.env.PORT || 8080;
app.listen(PORT, function() {
console.log('Express server running at localhost:' + PORT);
});