-
Notifications
You must be signed in to change notification settings - Fork 74
Expand file tree
/
Copy pathindex.ts
More file actions
80 lines (62 loc) · 2.58 KB
/
Copy pathindex.ts
File metadata and controls
80 lines (62 loc) · 2.58 KB
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
import _ from "lodash";
import { spawn } from "child_process";
import debug from "debug";
import { Config } from "../config";
import { findCwd, pipeLogsWithPrefix, probeServer, waitDevServerReady } from "./utils";
import * as logger from "../utils/logger";
import type { Testplane } from "../testplane";
export type DevServerOpts = {
testplane: Testplane;
devServerConfig: Config["devServer"];
configPath?: string;
};
export type InitDevServer = (opts: DevServerOpts) => Promise<void>;
export const initDevServer: InitDevServer = async ({ testplane, devServerConfig, configPath }) => {
if (!devServerConfig || !devServerConfig.command) {
return;
}
if (devServerConfig.reuseExisting) {
if (typeof devServerConfig.readinessProbe === "function" || !devServerConfig.readinessProbe.url) {
throw new Error(
"When 'reuseExisting' option is set in 'devServer' config, it is required to set 'devServer.readinessProbe.url' option",
);
}
const isReady = await probeServer(devServerConfig.readinessProbe);
if (isReady) {
logger.log("Reusing existing dev server");
return;
}
}
logger.log("Starting dev server with command", `"${devServerConfig.command}"`);
const debugLog = debug("testplane:dev-server");
if (!_.isEmpty(devServerConfig.args)) {
debugLog("Dev server args:", JSON.stringify(devServerConfig.args));
}
if (!_.isEmpty(devServerConfig.env)) {
debugLog("Dev server env:", JSON.stringify(devServerConfig.env, null, 4));
}
const devServer = spawn(devServerConfig.command, devServerConfig.args, {
env: { ...process.env, ...devServerConfig.env },
cwd: devServerConfig.cwd || (configPath ? findCwd(configPath) : process.cwd()),
shell: true,
windowsHide: true,
});
if (devServerConfig.logs) {
pipeLogsWithPrefix(devServer, "[dev server] ");
}
const killDevServerOnProcessExitCb = (): void => {
devServer.kill("SIGINT");
};
process.on("exit", killDevServerOnProcessExitCb);
devServer.once("exit", (code, signal) => {
process.removeListener("exit", killDevServerOnProcessExitCb);
if (signal !== "SIGINT") {
const errorMessage = [
"An error occured while launching dev server",
`Dev server failed with code '${code}' (signal: ${signal})`,
].join("\n");
testplane.halt(new Error(errorMessage), 5000);
}
});
await waitDevServerReady(devServer, devServerConfig.readinessProbe);
};