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 236d14fc1b..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"; /* @@ -11,26 +12,26 @@ 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); } 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; }); @@ -111,7 +112,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) { 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