From bae8ef078efe0e57bcd94fffc47697d65eb787b4 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 18 Sep 2026 04:32:35 -0700 Subject: [PATCH] fix(build): preserve the selected tsdown runtime (#151735) --- scripts/tsdown-build.mts | 33 +++++-------------------- test/scripts/tsdown-build.test.ts | 40 ++++++------------------------- 2 files changed, 13 insertions(+), 60 deletions(-) diff --git a/scripts/tsdown-build.mts b/scripts/tsdown-build.mts index 4dd4c6f8f95f..fc8d31f43748 100644 --- a/scripts/tsdown-build.mts +++ b/scripts/tsdown-build.mts @@ -40,7 +40,6 @@ import { TSDOWN_PACKAGE_OUTPUT_ROOTS, tsdownPackageOutputRoot, } from "./lib/tsdown-output-roots.mts"; -import { resolvePnpmRunner } from "./pnpm-runner.mts"; const logLevel = process.env.OPENCLAW_BUILD_VERBOSE ? "info" : "warn"; const INEFFECTIVE_DYNAMIC_IMPORT_MARKER = "[INEFFECTIVE_DYNAMIC_IMPORT]"; @@ -137,9 +136,7 @@ type ResolvedMemoryLimitParams = MemoryLimitParams & { resolvedMaxOldSpaceMb?: n type TsdownBuildParams = ResolvedMemoryLimitParams & { args?: string[]; - comSpec?: string; nodeExecPath?: string; - npmExecPath?: string; }; type TsdownBuildResult = ReturnType["finish"]> & { @@ -925,33 +922,15 @@ export function resolveTsdownBuildInvocation( "--no-clean", ...forwardedArgs, ]; - if (env.OPENCLAW_BUILD_ALL_NO_PNPM === "1") { - return { - command: params.nodeExecPath ?? process.execPath, - args: ["node_modules/tsdown/dist/run.mjs", ...tsdownArgs], - options: { - stdio: tsdownStdio(), - shell: false, - windowsVerbatimArguments: undefined, - env, - }, - }; - } - const runner = resolvePnpmRunner({ - env, - pnpmArgs: ["exec", "tsdown", ...tsdownArgs], - nodeExecPath: params.nodeExecPath ?? process.execPath, - npmExecPath: params.npmExecPath ?? env.npm_execpath, - comSpec: params.comSpec, - platform: (params.platform ?? process.platform) === "win32" ? "win32" : "linux", - }); + // A package-manager bin shim can select a different runtime from PATH. + // Keep the compiler on the runtime chosen by its build owner. return { - command: runner.command, - args: runner.args, + command: params.nodeExecPath ?? process.execPath, + args: ["node_modules/tsdown/dist/run.mjs", ...tsdownArgs], options: { stdio: tsdownStdio(), - shell: runner.shell, - windowsVerbatimArguments: runner.windowsVerbatimArguments, + shell: false, + windowsVerbatimArguments: undefined, env, }, }; diff --git a/test/scripts/tsdown-build.test.ts b/test/scripts/tsdown-build.test.ts index 3961d723e915..a1704ba3a8a7 100644 --- a/test/scripts/tsdown-build.test.ts +++ b/test/scripts/tsdown-build.test.ts @@ -95,7 +95,6 @@ type TsdownInvocationParams = NonNullable { args: ["--format", "esm"], platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env: {}, ...NO_MEMORY_LIMIT, }); - expect(result.args).toContain("tsdown"); + expect(result.args[0]).toBe("node_modules/tsdown/dist/run.mjs"); expect(result.args).toEqual(expect.arrayContaining(["--config-loader", "unrun", "--no-clean"])); expect(result.args.slice(-2)).toEqual(["--format", "esm"]); }); @@ -161,7 +159,6 @@ describe("resolveTsdownBuildInvocation", () => { args: ["--format", "esm"], platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env: {}, ...NO_MEMORY_LIMIT, }); @@ -192,7 +189,6 @@ describe("resolveTsdownBuildInvocation", () => { args, platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env, ...NO_MEMORY_LIMIT, }); @@ -207,7 +203,6 @@ describe("resolveTsdownBuildInvocation", () => { args: ["--dts"], platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env: { OPENCLAW_RUN_NODE_SKIP_DTS_BUILD: "1" }, ...NO_MEMORY_LIMIT, }); @@ -244,7 +239,6 @@ describe("resolveTsdownBuildInvocation", () => { ], platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env: {}, ...NO_MEMORY_LIMIT, }); @@ -340,7 +334,6 @@ describe("resolveTsdownBuildInvocation", () => { args, platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env: {}, ...NO_MEMORY_LIMIT, }); @@ -361,7 +354,6 @@ describe("resolveTsdownBuildInvocation", () => { args, platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env: {}, ...NO_MEMORY_LIMIT, }); @@ -434,7 +426,6 @@ describe("resolveTsdownBuildInvocation", () => { const result = resolveTsdownBuildPlan({ platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env: {}, cgroupMemoryLimitPaths: ["/test/memory.max"], fs: { @@ -465,7 +456,6 @@ describe("resolveTsdownBuildInvocation", () => { args, platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env: {}, cgroupMemoryLimitBytes: 4 * 1024 * 1024 * 1024, }); @@ -662,7 +652,6 @@ describe("resolveTsdownBuildInvocation", () => { args, platform: "linux", nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env, cgroupMemoryLimitBytes: 2 * 1024 * 1024 * 1024, }); @@ -682,15 +671,10 @@ describe("resolveTsdownBuildInvocation", () => { expect(result.heapShortfall?.fatal).toBe(true); }); - it("routes Windows tsdown builds through the pnpm runner instead of shell=true", () => { - const rootDir = createTempDir("openclaw-pnpm-runner-"); - const npmExecPath = path.join(rootDir, "pnpm.cjs"); - fs.writeFileSync(npmExecPath, "console.log('pnpm');\n"); - + it("keeps the selected Windows runtime and literal compiler arguments", () => { const result = resolveTsdownBuildInvocation({ platform: "win32", nodeExecPath: "C:\\Program Files\\nodejs\\node.exe", - npmExecPath, env: {}, ...NO_MEMORY_LIMIT, }); @@ -698,9 +682,7 @@ describe("resolveTsdownBuildInvocation", () => { expect(result).toEqual({ command: "C:\\Program Files\\nodejs\\node.exe", args: [ - npmExecPath, - "exec", - "tsdown", + "node_modules/tsdown/dist/run.mjs", "--config-loader", "unrun", "--logLevel", @@ -721,7 +703,6 @@ describe("resolveTsdownBuildInvocation", () => { title: "keeps inherited Windows tsdown heap settings at the Windows build cap", platform: "win32", execPath: "C:\\Program Files\\nodejs\\node.exe", - pnpmPath: "C:\\repo\\pnpm.cjs", nodeOptions: "--trace-warnings --max-old-space-size=8192", expectedNodeOptions: "--trace-warnings --max-old-space-size=8192", }, @@ -729,7 +710,6 @@ describe("resolveTsdownBuildInvocation", () => { title: "clamps explicit Windows tsdown heap settings to the Windows build cap", platform: "win32", execPath: "C:\\Program Files\\nodejs\\node.exe", - pnpmPath: "C:\\repo\\pnpm.cjs", nodeOptions: "--trace-warnings --max-old-space-size=12288", expectedNodeOptions: "--trace-warnings --max-old-space-size=8192", }, @@ -737,7 +717,6 @@ describe("resolveTsdownBuildInvocation", () => { title: "preserves explicit tsdown heap settings", platform: "linux", execPath: "/usr/bin/node", - pnpmPath: "/tmp/pnpm.cjs", nodeOptions: "--trace-warnings --max-old-space-size=12288", expectedNodeOptions: "--trace-warnings --max-old-space-size=12288", }, @@ -745,7 +724,6 @@ describe("resolveTsdownBuildInvocation", () => { title: "raises inherited lower tsdown heap settings to the build default", platform: "linux", execPath: "/usr/bin/node", - pnpmPath: "/tmp/pnpm.cjs", nodeOptions: "--trace-warnings --max-old-space-size=4096", expectedNodeOptions: "--trace-warnings --max-old-space-size=12288", }, @@ -753,15 +731,13 @@ describe("resolveTsdownBuildInvocation", () => { title: "raises split inherited lower tsdown heap settings to the build default", platform: "linux", execPath: "/usr/bin/node", - pnpmPath: "/tmp/pnpm.cjs", nodeOptions: "--trace-warnings --max-old-space-size 4096", expectedNodeOptions: "--trace-warnings --max-old-space-size=12288", }, - ])("$title", ({ platform, execPath, pnpmPath, nodeOptions, expectedNodeOptions }) => { + ])("$title", ({ platform, execPath, nodeOptions, expectedNodeOptions }) => { const result = resolveTsdownBuildInvocation({ platform, nodeExecPath: execPath, - npmExecPath: pnpmPath, env: { NODE_OPTIONS: nodeOptions }, ...NO_MEMORY_LIMIT, }); @@ -1700,7 +1676,6 @@ describe("resolveTsdownBuildInvocation", () => { const result = resolveTsdownBuildInvocation({ platform: "win32", nodeExecPath: "C:\\Program Files\\nodejs\\node.exe", - npmExecPath: "C:\\repo\\pnpm.cjs", env: { NODE_OPTIONS: "--trace-warnings --max-old-space-size=12288", OPENCLAW_TSDOWN_MAX_OLD_SPACE_MB: "4096", @@ -1716,7 +1691,6 @@ describe("resolveTsdownBuildInvocation", () => { expect(() => resolveTsdownBuildInvocation({ nodeExecPath: "/usr/bin/node", - npmExecPath: "/tmp/pnpm.cjs", env: { OPENCLAW_TSDOWN_MAX_OLD_SPACE_MB: value }, ...NO_MEMORY_LIMIT, }), @@ -1739,11 +1713,11 @@ describe("resolveTsdownBuildInvocation", () => { expect(nodeOptions).toBe("--max-old-space-size=6400"); }); - it("can run tsdown without invoking pnpm", () => { + it("preserves the selected compiler runtime despite inherited package-manager state", () => { const result = resolveTsdownBuildInvocation({ platform: "linux", nodeExecPath: "/usr/bin/node", - env: { OPENCLAW_BUILD_ALL_NO_PNPM: "1" }, + env: { npm_execpath: "/unrelated/pnpm.cjs" }, ...NO_MEMORY_LIMIT, }); @@ -1763,7 +1737,7 @@ describe("resolveTsdownBuildInvocation", () => { windowsVerbatimArguments: undefined, env: { NODE_OPTIONS: "--max-old-space-size=12288", - OPENCLAW_BUILD_ALL_NO_PNPM: "1", + npm_execpath: "/unrelated/pnpm.cjs", }, }, });