(command: string, childProcessOptions: ChildProcessOptions = {})
| 203 | }) |
| 204 | }, |
| 205 | async spawn(command: string, childProcessOptions: ChildProcessOptions = {}) { |
| 206 | let resolveDisposal: (() => void) | undefined |
| 207 | let rejectDisposal: ((error: Error) => void) | undefined |
| 208 | let disposePromise = new Promise<void>((resolve, reject) => { |
| 209 | resolveDisposal = resolve |
| 210 | rejectDisposal = reject |
| 211 | }) |
| 212 | |
| 213 | let cwd = childProcessOptions.cwd ?? root |
| 214 | if (debug && cwd !== root) { |
| 215 | let relative = path.relative(root, cwd) |
| 216 | if (relative[0] !== '.') relative = `./${relative}` |
| 217 | console.log(`> cd ${relative}`) |
| 218 | } |
| 219 | if (debug) console.log(`>& ${command}`) |
| 220 | let child = spawn(command, { |
| 221 | cwd, |
| 222 | detached: !IS_WINDOWS, |
| 223 | shell: true, |
| 224 | ...childProcessOptions, |
| 225 | env: { |
| 226 | ...process.env, |
| 227 | ...childProcessOptions.env, |
| 228 | }, |
| 229 | }) |
| 230 | |
| 231 | let disposed = false |
| 232 | |
| 233 | async function dispose() { |
| 234 | if (disposed) return disposePromise |
| 235 | disposed = true |
| 236 | |
| 237 | await killProcessTree(child) |
| 238 | |
| 239 | let timer = setTimeout(() => { |
| 240 | forceKillProcessTree(child) |
| 241 | rejectDisposal?.(new Error(`spawned process (${command}) did not exit in time`)) |
| 242 | }, ASSERTION_TIMEOUT) |
| 243 | disposePromise.then( |
| 244 | () => clearTimeout(timer), |
| 245 | () => clearTimeout(timer), |
| 246 | ) |
| 247 | return disposePromise |
| 248 | } |
| 249 | disposables.push(dispose) |
| 250 | |
| 251 | function onExit() { |
| 252 | resolveDisposal?.() |
| 253 | } |
| 254 | |
| 255 | let stdoutMessages: string[] = [] |
| 256 | let stderrMessages: string[] = [] |
| 257 | |
| 258 | let stdoutActors: SpawnActor[] = [] |
| 259 | let stderrActors: SpawnActor[] = [] |
| 260 | |
| 261 | function notifyNext(actors: SpawnActor[], messages: string[]) { |
| 262 | if (actors.length <= 0) return |
no test coverage detected