From 14df3c37e9acec0428472870ccc95127ea7a3685 Mon Sep 17 00:00:00 2001 From: Dotta Date: Thu, 23 Jul 2026 15:03:17 +0000 Subject: [PATCH] fix(db): preserve child process spawn overloads Co-Authored-By: Paperclip --- .../db/src/embedded-postgres-native.test.ts | 19 ++++++++++++++- packages/db/src/embedded-postgres-native.ts | 24 +++++++++++++++---- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/packages/db/src/embedded-postgres-native.test.ts b/packages/db/src/embedded-postgres-native.test.ts index 06ef70d4386..8af163b5d7a 100644 --- a/packages/db/src/embedded-postgres-native.test.ts +++ b/packages/db/src/embedded-postgres-native.test.ts @@ -1,8 +1,13 @@ +import childProcess from "node:child_process"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; -import { ensureLinuxSharedLibraryAliases, mergeEmbeddedPostgresSpawnEnv } from "./embedded-postgres-native.js"; +import { + ensureLinuxSharedLibraryAliases, + mergeEmbeddedPostgresSpawnEnv, + prepareEmbeddedPostgresNativeRuntime, +} from "./embedded-postgres-native.js"; describe("embedded Postgres native runtime", () => { const tempDirs: string[] = []; @@ -60,4 +65,16 @@ describe("embedded Postgres spawn environment", () => { const options = { env: { ONLY: "value" } }; expect(mergeEmbeddedPostgresSpawnEnv("node", options)).toBe(options); }); + + it("preserves the spawn options-only overload after installing the patch", async () => { + await prepareEmbeddedPostgresNativeRuntime(); + + const exitCode = await new Promise((resolve, reject) => { + const child = childProcess.spawn(process.execPath, { stdio: "ignore" }); + child.once("error", reject); + child.once("close", resolve); + }); + + expect(exitCode).toBe(0); + }); }); diff --git a/packages/db/src/embedded-postgres-native.ts b/packages/db/src/embedded-postgres-native.ts index ddeb3f7a75e..458605639a1 100644 --- a/packages/db/src/embedded-postgres-native.ts +++ b/packages/db/src/embedded-postgres-native.ts @@ -18,12 +18,26 @@ export function mergeEmbeddedPostgresSpawnEnv( function installEmbeddedPostgresSpawnPatch(): void { if (embeddedPostgresSpawnPatchInstalled) return; const originalSpawn = childProcess.spawn; - childProcess.spawn = ((command: string, args?: readonly string[], options?: object) => - originalSpawn( + childProcess.spawn = (( + command: string, + argsOrOptions?: readonly string[] | childProcess.SpawnOptions, + options?: childProcess.SpawnOptions, + ) => { + if (Array.isArray(argsOrOptions)) { + return originalSpawn( + command, + argsOrOptions, + mergeEmbeddedPostgresSpawnEnv(command, options) as childProcess.SpawnOptions, + ); + } + return originalSpawn( command, - args, - mergeEmbeddedPostgresSpawnEnv(command, options) as never, - )) as typeof childProcess.spawn; + mergeEmbeddedPostgresSpawnEnv( + command, + argsOrOptions as childProcess.SpawnOptions | undefined, + ) as childProcess.SpawnOptions, + ); + }) as typeof childProcess.spawn; syncBuiltinESMExports(); embeddedPostgresSpawnPatchInstalled = true; }