@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.
@@ -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
- let serverProcess = undefined;
5
- export default async function launchViteServer({ port = 3000, cmd = 'yarn client', timeout = 5000, } = {}) {
6
- if (serverProcess)
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
- serverProcess = spawn(_cmd, args, {
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
- serverProcess.stdout.on('data', data => {
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
- serverProcess.stdout.on('data', data => {
23
+ proc.stdout.on('data', data => {
28
24
  if (process.env.DEBUG === '1')
29
25
  console.log(`Server output: ${data}`);
30
26
  });
31
- serverProcess.stderr.on('data', data => {
27
+ proc.stderr.on('data', data => {
32
28
  if (process.env.DEBUG === '1')
33
29
  console.error(`Server error: ${data}`);
34
30
  });
35
- serverProcess.on('error', err => {
31
+ proc.on('error', err => {
36
32
  console.error(`Server process error: ${err}`);
37
33
  });
38
- serverProcess.on('close', code => {
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 stopViteServer() {
44
- if (serverProcess?.pid) {
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(-serverProcess.pid, 'SIGKILL');
49
- serverProcess = undefined;
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
- stopViteServer();
87
+ stopDevServer(key);
83
88
  throw new Error('waited too long for port: ' + port);
84
89
  }
85
90
  await sleep(50);
@@ -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 launchViteServer, stopViteServer } from './feature/helpers/launchViteServer.js';
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 {};
@@ -0,0 +1,7 @@
1
+ export default function launchDevServer(key: string, { port, cmd, timeout, }?: {
2
+ port?: number;
3
+ cmd?: string;
4
+ timeout?: number;
5
+ }): Promise<void>;
6
+ export declare function stopDevServer(key: string): void;
7
+ export declare function stopDevServers(): void;
@@ -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 launchViteServer, stopViteServer } from './feature/helpers/launchViteServer.js';
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@rvoh/psychic-spec-helpers",
4
- "version": "0.3.1",
4
+ "version": "0.4.0",
5
5
  "description": "psychic framework spec helpers",
6
6
  "main": "./dist/cjs/src/index.js",
7
7
  "module": "./dist/esm/src/index.js",
@@ -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
- let serverProcess: ChildProcessWithoutNullStreams | undefined = undefined
6
-
7
- export default async function launchViteServer({
8
- port = 3000,
9
- cmd = 'yarn client',
10
- timeout = 5000,
11
- }: { port?: number; cmd?: string; timeout?: number } = {}) {
12
- if (serverProcess) return
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
- serverProcess = spawn(_cmd, args, {
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
- serverProcess.stdout.on('data', data => {
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
- serverProcess.stdout.on('data', data => {
35
+ proc.stdout.on('data', data => {
37
36
  if (process.env.DEBUG === '1') console.log(`Server output: ${data}`)
38
37
  })
39
38
 
40
- serverProcess.stderr.on('data', data => {
39
+ proc.stderr.on('data', data => {
41
40
  if (process.env.DEBUG === '1') console.error(`Server error: ${data}`)
42
41
  })
43
42
 
44
- serverProcess.on('error', err => {
43
+ proc.on('error', err => {
45
44
  console.error(`Server process error: ${err as unknown as string}`)
46
45
  })
47
46
 
48
- serverProcess.on('close', code => {
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 stopViteServer() {
54
- if (serverProcess?.pid) {
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(-serverProcess.pid, 'SIGKILL')
58
- serverProcess = undefined
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
- stopViteServer()
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 { default as launchViteServer, stopViteServer } from './feature/helpers/launchViteServer.js'
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 {
@@ -1,6 +0,0 @@
1
- export default function launchViteServer({ port, cmd, timeout, }?: {
2
- port?: number;
3
- cmd?: string;
4
- timeout?: number;
5
- }): Promise<void>;
6
- export declare function stopViteServer(): void;