@rvoh/psychic-spec-helpers 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/src/feature/helpers/{launchViteServer.js → launchDevServer.js} +25 -20
- package/dist/esm/src/index.js +1 -1
- package/dist/types/src/feature/helpers/launchDevServer.d.ts +7 -0
- package/dist/types/src/index.d.ts +1 -1
- package/package.json +1 -1
- package/src/feature/helpers/{launchViteServer.ts → launchDevServer.ts} +35 -25
- package/src/index.ts +5 -1
- package/dist/types/src/feature/helpers/launchViteServer.d.ts +0 -6
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
2
|
import { createServer } from 'net';
|
|
3
3
|
import sleep from '../../shared/sleep.js';
|
|
4
|
-
|
|
5
|
-
export default async function
|
|
6
|
-
if (
|
|
4
|
+
const devServerProcesses = {};
|
|
5
|
+
export default async function launchDevServer(key, { port = 3000, cmd = 'yarn client', timeout = 5000, } = {}) {
|
|
6
|
+
if (devServerProcesses[key])
|
|
7
7
|
return;
|
|
8
8
|
if (process.env.DEBUG === '1')
|
|
9
9
|
console.log('Starting server...');
|
|
10
10
|
const [_cmd, ...args] = cmd.split(' ');
|
|
11
|
-
|
|
11
|
+
const proc = spawn(_cmd, args, {
|
|
12
12
|
detached: true,
|
|
13
13
|
env: {
|
|
14
14
|
...process.env,
|
|
@@ -16,41 +16,46 @@ export default async function launchViteServer({ port = 3000, cmd = 'yarn client
|
|
|
16
16
|
VITE_PSYCHIC_ENV: 'test',
|
|
17
17
|
},
|
|
18
18
|
});
|
|
19
|
-
await waitForPort(port, timeout);
|
|
20
|
-
|
|
21
|
-
if (process.env.DEBUG === '1')
|
|
22
|
-
console.log(`Server output: ${data}`);
|
|
23
|
-
});
|
|
24
|
-
serverProcess.on('error', err => {
|
|
19
|
+
await waitForPort(key, port, timeout);
|
|
20
|
+
proc.on('error', err => {
|
|
25
21
|
throw err;
|
|
26
22
|
});
|
|
27
|
-
|
|
23
|
+
proc.stdout.on('data', data => {
|
|
28
24
|
if (process.env.DEBUG === '1')
|
|
29
25
|
console.log(`Server output: ${data}`);
|
|
30
26
|
});
|
|
31
|
-
|
|
27
|
+
proc.stderr.on('data', data => {
|
|
32
28
|
if (process.env.DEBUG === '1')
|
|
33
29
|
console.error(`Server error: ${data}`);
|
|
34
30
|
});
|
|
35
|
-
|
|
31
|
+
proc.on('error', err => {
|
|
36
32
|
console.error(`Server process error: ${err}`);
|
|
37
33
|
});
|
|
38
|
-
|
|
34
|
+
proc.on('close', code => {
|
|
39
35
|
if (process.env.DEBUG === '1')
|
|
40
36
|
console.log(`Server process exited with code ${code}`);
|
|
41
37
|
});
|
|
42
38
|
}
|
|
43
|
-
export function
|
|
44
|
-
|
|
39
|
+
export function stopDevServer(key) {
|
|
40
|
+
const proc = devServerProcesses[key];
|
|
41
|
+
if (!proc) {
|
|
42
|
+
throw new Error(`Cannot find a dev server by the key: ${key}`);
|
|
43
|
+
}
|
|
44
|
+
if (proc?.pid) {
|
|
45
45
|
if (process.env.DEBUG === '1')
|
|
46
46
|
console.log('Stopping server...');
|
|
47
47
|
// serverProcess.kill('SIGINT')
|
|
48
|
-
process.kill(-
|
|
49
|
-
|
|
48
|
+
process.kill(-proc.pid, 'SIGKILL');
|
|
49
|
+
delete devServerProcesses[key];
|
|
50
50
|
if (process.env.DEBUG === '1')
|
|
51
51
|
console.log('server stopped');
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
+
export function stopDevServers() {
|
|
55
|
+
Object.keys(devServerProcesses).forEach(key => {
|
|
56
|
+
stopDevServer(key);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
54
59
|
async function isPortAvailable(port) {
|
|
55
60
|
return new Promise(resolve => {
|
|
56
61
|
const server = createServer()
|
|
@@ -69,7 +74,7 @@ async function isPortAvailable(port) {
|
|
|
69
74
|
.listen(port, '127.0.0.1');
|
|
70
75
|
});
|
|
71
76
|
}
|
|
72
|
-
async function waitForPort(port, timeout = 5000) {
|
|
77
|
+
async function waitForPort(key, port, timeout = 5000) {
|
|
73
78
|
if (await isPortAvailable(port)) {
|
|
74
79
|
return true;
|
|
75
80
|
}
|
|
@@ -79,7 +84,7 @@ async function waitForPort(port, timeout = 5000) {
|
|
|
79
84
|
return true;
|
|
80
85
|
}
|
|
81
86
|
if (Date.now() > startTime + timeout) {
|
|
82
|
-
|
|
87
|
+
stopDevServer(key);
|
|
83
88
|
throw new Error('waited too long for port: ' + port);
|
|
84
89
|
}
|
|
85
90
|
await sleep(50);
|
package/dist/esm/src/index.js
CHANGED
|
@@ -7,6 +7,6 @@ export { SpecSession } from './unit/SpecSession.js';
|
|
|
7
7
|
export { default as providePuppeteerViteMatchers } from './feature/helpers/providePuppeteerViteMatchers.js';
|
|
8
8
|
export { default as launchBrowser } from './feature/helpers/launchBrowser.js';
|
|
9
9
|
export { default as launchPage } from './feature/helpers/launchPage.js';
|
|
10
|
-
export { default as
|
|
10
|
+
export { default as launchDevServer, stopDevServers, stopDevServer, } from './feature/helpers/launchDevServer.js';
|
|
11
11
|
export { default as visit } from './feature/helpers/visit.js';
|
|
12
12
|
export default {};
|
|
@@ -9,7 +9,7 @@ export { SpecSession } from './unit/SpecSession.js';
|
|
|
9
9
|
export { default as providePuppeteerViteMatchers } from './feature/helpers/providePuppeteerViteMatchers.js';
|
|
10
10
|
export { default as launchBrowser } from './feature/helpers/launchBrowser.js';
|
|
11
11
|
export { default as launchPage } from './feature/helpers/launchPage.js';
|
|
12
|
-
export { default as
|
|
12
|
+
export { default as launchDevServer, stopDevServers, stopDevServer, } from './feature/helpers/launchDevServer.js';
|
|
13
13
|
export { default as visit } from './feature/helpers/visit.js';
|
|
14
14
|
declare global {
|
|
15
15
|
function context(description: string, callback: () => void): void;
|
package/package.json
CHANGED
|
@@ -2,19 +2,22 @@ import { ChildProcessWithoutNullStreams, spawn } from 'child_process'
|
|
|
2
2
|
import { createServer } from 'net'
|
|
3
3
|
import sleep from '../../shared/sleep.js'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export default async function
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
const devServerProcesses: Record<string, ChildProcessWithoutNullStreams | undefined> = {}
|
|
6
|
+
|
|
7
|
+
export default async function launchDevServer(
|
|
8
|
+
key: string,
|
|
9
|
+
{
|
|
10
|
+
port = 3000,
|
|
11
|
+
cmd = 'yarn client',
|
|
12
|
+
timeout = 5000,
|
|
13
|
+
}: { port?: number; cmd?: string; timeout?: number } = {}
|
|
14
|
+
) {
|
|
15
|
+
if (devServerProcesses[key]) return
|
|
13
16
|
|
|
14
17
|
if (process.env.DEBUG === '1') console.log('Starting server...')
|
|
15
18
|
const [_cmd, ...args] = cmd.split(' ')
|
|
16
19
|
|
|
17
|
-
|
|
20
|
+
const proc = spawn(_cmd, args, {
|
|
18
21
|
detached: true,
|
|
19
22
|
env: {
|
|
20
23
|
...process.env,
|
|
@@ -23,44 +26,51 @@ export default async function launchViteServer({
|
|
|
23
26
|
},
|
|
24
27
|
})
|
|
25
28
|
|
|
26
|
-
await waitForPort(port, timeout)
|
|
29
|
+
await waitForPort(key, port, timeout)
|
|
27
30
|
|
|
28
|
-
|
|
29
|
-
if (process.env.DEBUG === '1') console.log(`Server output: ${data}`)
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
serverProcess.on('error', err => {
|
|
31
|
+
proc.on('error', err => {
|
|
33
32
|
throw err
|
|
34
33
|
})
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
proc.stdout.on('data', data => {
|
|
37
36
|
if (process.env.DEBUG === '1') console.log(`Server output: ${data}`)
|
|
38
37
|
})
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
proc.stderr.on('data', data => {
|
|
41
40
|
if (process.env.DEBUG === '1') console.error(`Server error: ${data}`)
|
|
42
41
|
})
|
|
43
42
|
|
|
44
|
-
|
|
43
|
+
proc.on('error', err => {
|
|
45
44
|
console.error(`Server process error: ${err as unknown as string}`)
|
|
46
45
|
})
|
|
47
46
|
|
|
48
|
-
|
|
47
|
+
proc.on('close', code => {
|
|
49
48
|
if (process.env.DEBUG === '1') console.log(`Server process exited with code ${code}`)
|
|
50
49
|
})
|
|
51
50
|
}
|
|
52
51
|
|
|
53
|
-
export function
|
|
54
|
-
|
|
52
|
+
export function stopDevServer(key: string) {
|
|
53
|
+
const proc = devServerProcesses[key]
|
|
54
|
+
if (!proc) {
|
|
55
|
+
throw new Error(`Cannot find a dev server by the key: ${key}`)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (proc?.pid) {
|
|
55
59
|
if (process.env.DEBUG === '1') console.log('Stopping server...')
|
|
56
60
|
// serverProcess.kill('SIGINT')
|
|
57
|
-
process.kill(-
|
|
58
|
-
|
|
61
|
+
process.kill(-proc.pid, 'SIGKILL')
|
|
62
|
+
delete devServerProcesses[key]
|
|
59
63
|
|
|
60
64
|
if (process.env.DEBUG === '1') console.log('server stopped')
|
|
61
65
|
}
|
|
62
66
|
}
|
|
63
67
|
|
|
68
|
+
export function stopDevServers() {
|
|
69
|
+
Object.keys(devServerProcesses).forEach(key => {
|
|
70
|
+
stopDevServer(key)
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
|
|
64
74
|
async function isPortAvailable(port: number): Promise<boolean> {
|
|
65
75
|
return new Promise(resolve => {
|
|
66
76
|
const server = createServer()
|
|
@@ -79,7 +89,7 @@ async function isPortAvailable(port: number): Promise<boolean> {
|
|
|
79
89
|
})
|
|
80
90
|
}
|
|
81
91
|
|
|
82
|
-
async function waitForPort(port: number, timeout: number = 5000) {
|
|
92
|
+
async function waitForPort(key: string, port: number, timeout: number = 5000) {
|
|
83
93
|
if (await isPortAvailable(port)) {
|
|
84
94
|
return true
|
|
85
95
|
}
|
|
@@ -92,7 +102,7 @@ async function waitForPort(port: number, timeout: number = 5000) {
|
|
|
92
102
|
}
|
|
93
103
|
|
|
94
104
|
if (Date.now() > startTime + timeout) {
|
|
95
|
-
|
|
105
|
+
stopDevServer(key)
|
|
96
106
|
throw new Error('waited too long for port: ' + port)
|
|
97
107
|
}
|
|
98
108
|
|
package/src/index.ts
CHANGED
|
@@ -13,7 +13,11 @@ export { SpecSession } from './unit/SpecSession.js'
|
|
|
13
13
|
export { default as providePuppeteerViteMatchers } from './feature/helpers/providePuppeteerViteMatchers.js'
|
|
14
14
|
export { default as launchBrowser } from './feature/helpers/launchBrowser.js'
|
|
15
15
|
export { default as launchPage } from './feature/helpers/launchPage.js'
|
|
16
|
-
export {
|
|
16
|
+
export {
|
|
17
|
+
default as launchDevServer,
|
|
18
|
+
stopDevServers,
|
|
19
|
+
stopDevServer,
|
|
20
|
+
} from './feature/helpers/launchDevServer.js'
|
|
17
21
|
export { default as visit } from './feature/helpers/visit.js'
|
|
18
22
|
|
|
19
23
|
declare global {
|