-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.js
51 lines (41 loc) · 1.55 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
51
require('esbuild-register/dist/node').register();
require('./injection');
const { createServer } = require('http');
const { resolve, relative } = require('path');
const { watch } = require('chokidar');
const { gray, green, red } = require('ansi-colors');
const invalidate = require('invalidate-module');
const express = require('express');
const entryFile = process.argv[2];
const entryUri = resolve(process.cwd(), entryFile);
const mark = '「metacraft」';
const asyncWrap = (result) => new Promise((resolve) => resolve(result));
const httpServer = createServer();
const defaultHandler = express();
const configureServer = (httpServer, listen = false) => {
const { configureExpress, configure } = require(entryUri);
const configurator = configureExpress || configure || (() => undefined);
asyncWrap(configurator(express, httpServer)).then((requestHandler) => {
if (listen) {
httpServer.listen('3005');
}
httpServer.removeAllListeners('upgrade');
httpServer.removeAllListeners('request');
httpServer.on('request', requestHandler || defaultHandler);
});
};
watch(process.cwd(), {
ignoreInitial: true,
ignored: ['**/node_modules/**/*', '**/.git/**/*', '**/.idea/**/*'],
}).on('all', (event, filename) => {
const relativeUri = relative(process.cwd(), filename);
invalidate(resolve(filename));
console.log(gray(mark) + green(' • ') + gray(`hot reloaded ${relativeUri}`));
try {
configureServer(httpServer);
} catch (err) {
console.log(`${gray(mark)} failed to reload ${red(relativeUri)}:`);
console.log(err);
}
});
configureServer(httpServer, true);