From 621a08650bb5676281ed4d6776ed36873ea78819 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Jul 2026 18:17:30 +0000 Subject: [PATCH 1/3] Initial plan From 9ccee3ffd5077d8283d5a4fae9aaa9476cf7faba Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Jul 2026 18:20:11 +0000 Subject: [PATCH 2/3] fix: remove shell:true from spawn in system-requirements.ts to fix DEP0190 deprecation warning Co-authored-by: l0lawrence <100643745+l0lawrence@users.noreply.github.com> --- .../typespec-python/eng/scripts/setup/system-requirements.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/typespec-python/eng/scripts/setup/system-requirements.ts b/packages/typespec-python/eng/scripts/setup/system-requirements.ts index 236d14fc1b..14baa15fab 100644 --- a/packages/typespec-python/eng/scripts/setup/system-requirements.ts +++ b/packages/typespec-python/eng/scripts/setup/system-requirements.ts @@ -11,7 +11,7 @@ const execute = ( options: MoreOptions = {}, ): Promise => { return new Promise((resolve, reject) => { - const cp = spawn(command, cmdlineargs, { ...options, stdio: "pipe", shell: true }); + const cp = spawn(command, cmdlineargs, { ...options, stdio: "pipe" }); if (options.onCreate) { options.onCreate(cp); } @@ -111,7 +111,7 @@ const tryPython = async ( const result = await execute(command, [ ...additionalArgs, "-c", - `"${PRINT_PYTHON_VERSION_SCRIPT}"`, + PRINT_PYTHON_VERSION_SCRIPT, ]); return validateVersionRequirement(resolution, result.stdout.trim(), requirement); } catch (e) { From 6be0f3c836fcc8f274a11e5b94e4cf1145dd9959 Mon Sep 17 00:00:00 2001 From: Libba Lawrence Date: Fri, 24 Jul 2026 15:30:38 -0700 Subject: [PATCH 3/3] fix: use cross-spawn instead of child_process.spawn in system-requirements.ts Restores Windows support for executing .cmd/.bat wrappers (e.g. python.cmd) that was lost when shell:true was removed, while keeping the DEP0190 deprecation warning fixed. cross-spawn handles arg escaping, so manual quoting is not needed. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: a400ee01-6085-4bac-a9a0-e3ac44faadca --- .../fix-deprecated-node-api-2026-7-24-15-2-0.md | 7 +++++++ .../eng/scripts/setup/system-requirements.ts | 11 ++++++----- packages/typespec-python/package.json | 2 ++ pnpm-lock.yaml | 6 ++++++ 4 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 .chronus/changes/fix-deprecated-node-api-2026-7-24-15-2-0.md diff --git a/.chronus/changes/fix-deprecated-node-api-2026-7-24-15-2-0.md b/.chronus/changes/fix-deprecated-node-api-2026-7-24-15-2-0.md new file mode 100644 index 0000000000..52b041d014 --- /dev/null +++ b/.chronus/changes/fix-deprecated-node-api-2026-7-24-15-2-0.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@azure-tools/typespec-python" +--- + +Use `cross-spawn` instead of `child_process.spawn` in the system requirements setup script. This removes the DEP0190 deprecation warning caused by `shell: true` while keeping support for executing `.cmd`/`.bat` wrappers (e.g. `python.cmd`) on Windows. diff --git a/packages/typespec-python/eng/scripts/setup/system-requirements.ts b/packages/typespec-python/eng/scripts/setup/system-requirements.ts index 14baa15fab..a069316e71 100644 --- a/packages/typespec-python/eng/scripts/setup/system-requirements.ts +++ b/packages/typespec-python/eng/scripts/setup/system-requirements.ts @@ -1,4 +1,5 @@ -import { ChildProcess, spawn, SpawnOptions } from "child_process"; +import type { ChildProcess, SpawnOptions } from "child_process"; +import { spawn } from "cross-spawn"; import { coerce, satisfies } from "semver"; /* @@ -17,20 +18,20 @@ const execute = ( } if (options.onStdOutData) { - cp.stdout.on("data", options.onStdOutData); + cp.stdout?.on("data", options.onStdOutData); } if (options.onStdErrData) { - cp.stderr.on("data", options.onStdErrData); + cp.stderr?.on("data", options.onStdErrData); } let err = ""; let out = ""; let all = ""; - cp.stderr.on("data", (chunk) => { + cp.stderr?.on("data", (chunk) => { err += chunk; all += chunk; }); - cp.stdout.on("data", (chunk) => { + cp.stdout?.on("data", (chunk) => { out += chunk; all += chunk; }); diff --git a/packages/typespec-python/package.json b/packages/typespec-python/package.json index 59324c186b..9d1c0c40fc 100644 --- a/packages/typespec-python/package.json +++ b/packages/typespec-python/package.json @@ -66,6 +66,7 @@ }, "dependencies": { "@typespec/http-client-python": "catalog:", + "cross-spawn": "catalog:", "semver": "catalog:", "tsx": "catalog:" }, @@ -76,6 +77,7 @@ "@azure-tools/typespec-azure-resource-manager": "workspace:^", "@azure-tools/typespec-azure-rulesets": "workspace:^", "@azure-tools/typespec-client-generator-core": "workspace:^", + "@types/cross-spawn": "catalog:", "@types/node": "catalog:", "@types/semver": "catalog:", "@types/yargs": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 398d5cd29f..b5a87f4020 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3912,6 +3912,9 @@ importers: '@typespec/http-client-python': specifier: 'catalog:' version: 0.34.2(@azure-tools/typespec-autorest@packages+typespec-autorest)(@azure-tools/typespec-azure-core@packages+typespec-azure-core)(@azure-tools/typespec-azure-resource-manager@packages+typespec-azure-resource-manager)(@azure-tools/typespec-azure-rulesets@packages+typespec-azure-rulesets)(@azure-tools/typespec-client-generator-core@packages+typespec-client-generator-core)(@typespec/compiler@core+packages+compiler)(@typespec/events@core+packages+events)(@typespec/http@core+packages+http)(@typespec/openapi@core+packages+openapi)(@typespec/rest@core+packages+rest)(@typespec/sse@core+packages+sse)(@typespec/streams@core+packages+streams)(@typespec/versioning@core+packages+versioning)(@typespec/xml@core+packages+xml) + cross-spawn: + specifier: 'catalog:' + version: 7.0.6 semver: specifier: 'catalog:' version: 7.8.5 @@ -3937,6 +3940,9 @@ importers: '@azure-tools/typespec-client-generator-core': specifier: workspace:^ version: link:../typespec-client-generator-core + '@types/cross-spawn': + specifier: 'catalog:' + version: 6.0.6 '@types/node': specifier: 'catalog:' version: 26.0.0