-
Notifications
You must be signed in to change notification settings - Fork 0
/
build_watch.js
128 lines (106 loc) · 2.56 KB
/
build_watch.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
125
126
127
128
import { config } from "./build_config.js";
import * as Debounce from "debounce";
const debounce = Debounce.default;
import {
verifyTweegoInstall,
watchDirectory,
runWebpackDev,
runLocalServer,
runTweego,
moveFiles,
} from "./build_commands.js";
class Builder {
constructor() {
this.running = false;
this.pendingBuild = false;
this.shuttingDown = false;
this.process = false;
this.server = false;
this.start();
}
async start() {
try {
await verifyTweegoInstall();
await this.runBuild("init");
await this.startWatching();
await this.startLocalServer();
} catch (e) {
console.error(e);
process.exit(1);
}
}
async stop() {
console.log(`[builder] Shutting down.`);
this.shuttingDown = true;
this.pendingBuild = false;
await this.stopWatching();
await this.stopLocalServer();
}
async startLocalServer() {
console.log(`[builder] Starting local server.`);
this.server = runLocalServer();
}
async stopLocalServer() {
console.log(`[builder] Stopped local server.`);
this.server.shutdown();
}
async startWatching() {
console.log(`[builder] Starting watcher.`);
this.process = watchDirectory(
config["webpack"]["watch_dir"],
debounce((e, p) => this.runBuild(e, p), 500)
);
}
async stopWatching() {
console.log(`[builder] Stopped watching.`);
return this.process.close();
}
async runBuild(event, path) {
if (this.shuttingDown) {
return;
}
if (event === "error") {
return console.error(path);
}
if (this.running) {
this.pendingBuild = event;
return;
}
// Start build
console.log(`[builder] [${event}] Running build.`);
this.running = true;
this.pendingBuild = false;
// Run webpack
let [err, res] = await runWebpackDev();
if (err) return console.error(`[builder] [${event}] ${err}`);
// Move files
await moveFiles();
// Run tweego
runTweego();
// Complete build
console.log(`[builder] Build finished.`);
this.running = false;
// First build the server does not exist yet.
if (this.server) {
this.server.reload();
}
if (this.pendingBuild) {
try {
await this.runBuild(this.pendingBuild);
} catch (e) {
console.log(e);
}
}
}
}
// Initialize builder
let builder = new Builder();
// Handle close signals
process.on("SIGTERM", async () => {
await builder.stop();
process.exit();
});
process.on("SIGINT", async () => {
await builder.stop();
process.exit();
});