diff --git a/packages/cypress/plugins/cypress-preset.ts b/packages/cypress/plugins/cypress-preset.ts index b9e6ae46991d3c..2ebd726b1f0991 100644 --- a/packages/cypress/plugins/cypress-preset.ts +++ b/packages/cypress/plugins/cypress-preset.ts @@ -5,9 +5,10 @@ import { lstatSync } from 'fs'; import vitePreprocessor from '../src/plugins/preprocessor-vite'; import { NX_PLUGIN_OPTIONS } from '../src/utils/constants'; -import { exec } from 'child_process'; +import { spawn } from 'child_process'; import { request as httpRequest } from 'http'; import { request as httpsRequest } from 'https'; +import * as os from 'node:os'; // Importing the cypress type here causes the angular and next unit // tests to fail when transpiling, it seems like the cypress types are @@ -65,14 +66,19 @@ export function nxBaseCypressPreset( } function startWebServer(webServerCommand: string) { - const serverProcess = exec(webServerCommand, { + const serverProcess = spawn(webServerCommand, { cwd: workspaceRoot, + shell: true, + // Detaching the process on unix will create a process group, allowing us to kill it later + // Windows is fine so we leave it attached to this process + detached: process.platform !== 'win32', + stdio: 'inherit', }); - serverProcess.stdout.pipe(process.stdout); - serverProcess.stderr.pipe(process.stderr); return () => { - serverProcess.kill(); + // child.kill() does not work on linux + // process.kill will kill the whole process group on unix + process.kill(-serverProcess.pid, 'SIGKILL'); }; }