diff --git a/packages/nx/src/tasks-runner/task-orchestrator.ts b/packages/nx/src/tasks-runner/task-orchestrator.ts index 79115464ccaa5..da7daa0450ebd 100644 --- a/packages/nx/src/tasks-runner/task-orchestrator.ts +++ b/packages/nx/src/tasks-runner/task-orchestrator.ts @@ -23,6 +23,7 @@ import { getEnvVariablesForTask, getTaskSpecificEnv, } from './task-env'; +import * as os from 'os'; export class TaskOrchestrator { private cache = new Cache(this.options); @@ -401,23 +402,25 @@ export class TaskOrchestrator { streamOutput: boolean ) { try { + let usePtyFork = + process.env.NX_NATIVE_COMMAND_RUNNER !== 'false' && + supportedPtyPlatform(); // execution - const { code, terminalOutput } = - process.env.NX_NATIVE_COMMAND_RUNNER !== 'false' - ? await this.forkedProcessTaskRunner.forkProcess(task, { - temporaryOutputPath, - streamOutput, - pipeOutput, - taskGraph: this.taskGraph, - env, - }) - : await this.forkedProcessTaskRunner.forkProcessLegacy(task, { - temporaryOutputPath, - streamOutput, - pipeOutput, - taskGraph: this.taskGraph, - env, - }); + const { code, terminalOutput } = usePtyFork + ? await this.forkedProcessTaskRunner.forkProcess(task, { + temporaryOutputPath, + streamOutput, + pipeOutput, + taskGraph: this.taskGraph, + env, + }) + : await this.forkedProcessTaskRunner.forkProcessLegacy(task, { + temporaryOutputPath, + streamOutput, + pipeOutput, + taskGraph: this.taskGraph, + env, + }); return { code, @@ -617,3 +620,25 @@ export class TaskOrchestrator { // endregion utils } + +function supportedPtyPlatform() { + if (process.platform !== 'win32') { + return true; + } + + let windowsVersion = os.release().split('.'); + let windowsBuild = windowsVersion[2]; + + if (!windowsBuild) { + return false; + } + + // Mininum supported Windows version: + // https://en.wikipedia.org/wiki/Windows_10,_version_1809 + // https://learn.microsoft.com/en-us/windows/console/createpseudoconsole#requirements + if (+windowsBuild < 17763) { + return false; + } else { + return true; + } +}