fix(build): fall back to tsx for build TypeScript scripts (#91262)

* fix(build): fall back to tsx for build TypeScript scripts

* fix(build): use tsx across TypeScript build scripts

---------

Co-authored-by: Steffen Moeller <moeller@debian.org>
Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
This commit is contained in:
Glen - I am an OpenClaw+Codex bot 2026-07-06 08:55:20 +02:00 committed by GitHub
parent 1e2e7fb936
commit 23998a148f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 70 additions and 10 deletions

View file

@ -1516,10 +1516,10 @@
"audit:seams": "node scripts/audit-seams.mjs",
"build": "node scripts/build-all.mjs",
"build:ci-artifacts": "node scripts/build-all.mjs ciArtifacts",
"build:docker": "node scripts/tsdown-build.mjs && node scripts/check-cli-bootstrap-imports.mjs && node scripts/runtime-postbuild.mjs && node scripts/build-stamp.mjs && node scripts/runtime-postbuild-stamp.mjs && pnpm plugins:assets:build && pnpm plugins:assets:copy && node --experimental-strip-types scripts/copy-hook-metadata.ts && node --experimental-strip-types scripts/copy-export-html-templates.ts && node --experimental-strip-types scripts/write-build-info.ts && node --experimental-strip-types scripts/write-cli-startup-metadata.ts && node --experimental-strip-types scripts/write-cli-compat.ts",
"build:docker": "node scripts/tsdown-build.mjs && node scripts/check-cli-bootstrap-imports.mjs && node scripts/runtime-postbuild.mjs && node scripts/build-stamp.mjs && node scripts/runtime-postbuild-stamp.mjs && pnpm plugins:assets:build && pnpm plugins:assets:copy && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/copy-export-html-templates.ts && node --import tsx scripts/write-build-info.ts && node --import tsx scripts/write-cli-startup-metadata.ts && node --import tsx scripts/write-cli-compat.ts",
"build:plugin-sdk:dts": "node scripts/run-tsgo.mjs -p tsconfig.plugin-sdk.dts.json --declaration true",
"build:plugin-sdk:strict-smoke": "node scripts/tsdown-build.mjs && node scripts/runtime-postbuild.mjs && node scripts/run-with-env.mjs OPENCLAW_PLUGIN_SDK_CANONICAL_DTS=1 -- node --experimental-strip-types scripts/write-plugin-sdk-entry-dts.ts && node scripts/check-plugin-sdk-exports.mjs",
"build:strict-smoke": "pnpm plugins:assets:build && node scripts/tsdown-build.mjs && node scripts/check-cli-bootstrap-imports.mjs && node scripts/runtime-postbuild.mjs && node scripts/build-stamp.mjs && node scripts/runtime-postbuild-stamp.mjs && node scripts/run-with-env.mjs OPENCLAW_PLUGIN_SDK_CANONICAL_DTS=1 -- node --experimental-strip-types scripts/write-plugin-sdk-entry-dts.ts && node scripts/check-plugin-sdk-exports.mjs",
"build:plugin-sdk:strict-smoke": "node scripts/tsdown-build.mjs && node scripts/runtime-postbuild.mjs && node scripts/run-with-env.mjs OPENCLAW_PLUGIN_SDK_CANONICAL_DTS=1 -- node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node scripts/check-plugin-sdk-exports.mjs",
"build:strict-smoke": "pnpm plugins:assets:build && node scripts/tsdown-build.mjs && node scripts/check-cli-bootstrap-imports.mjs && node scripts/runtime-postbuild.mjs && node scripts/build-stamp.mjs && node scripts/runtime-postbuild-stamp.mjs && node scripts/run-with-env.mjs OPENCLAW_PLUGIN_SDK_CANONICAL_DTS=1 -- node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node scripts/check-plugin-sdk-exports.mjs",
"canvas:a2ui:bundle": "node scripts/bundle-a2ui.mjs",
"canvas:a2ui:native:check": "node scripts/sync-native-a2ui.mjs --check",
"canvas:a2ui:native:sync": "node scripts/sync-native-a2ui.mjs --write",

View file

@ -53,7 +53,7 @@ export const BUILD_ALL_STEPS = [
{
label: "write-plugin-sdk-entry-dts",
kind: "node",
args: ["--experimental-strip-types", "scripts/write-plugin-sdk-entry-dts.ts"],
args: ["--import", "tsx", "scripts/write-plugin-sdk-entry-dts.ts"],
env: {
OPENCLAW_PLUGIN_SDK_CANONICAL_DTS: "1",
},
@ -77,12 +77,12 @@ export const BUILD_ALL_STEPS = [
{
label: "copy-hook-metadata",
kind: "node",
args: ["--experimental-strip-types", "scripts/copy-hook-metadata.ts"],
args: ["--import", "tsx", "scripts/copy-hook-metadata.ts"],
},
{
label: "copy-export-html-templates",
kind: "node",
args: ["--experimental-strip-types", "scripts/copy-export-html-templates.ts"],
args: ["--import", "tsx", "scripts/copy-export-html-templates.ts"],
cache: {
inputs: [
"scripts/copy-export-html-templates.ts",
@ -105,17 +105,17 @@ export const BUILD_ALL_STEPS = [
{
label: "write-build-info",
kind: "node",
args: ["--experimental-strip-types", "scripts/write-build-info.ts"],
args: ["--import", "tsx", "scripts/write-build-info.ts"],
},
{
label: "write-cli-startup-metadata",
kind: "node",
args: ["--experimental-strip-types", "scripts/write-cli-startup-metadata.ts"],
args: ["--import", "tsx", "scripts/write-cli-startup-metadata.ts"],
},
{
label: "write-cli-compat",
kind: "node",
args: ["--experimental-strip-types", "scripts/write-cli-compat.ts"],
args: ["--import", "tsx", "scripts/write-cli-compat.ts"],
},
];

View file

@ -119,6 +119,17 @@ describe("package scripts", () => {
expect(directNodeEnvScripts).toEqual([]);
});
it.each([
{ scriptName: "build:docker", expectedCount: 5 },
{ scriptName: "build:plugin-sdk:strict-smoke", expectedCount: 1 },
{ scriptName: "build:strict-smoke", expectedCount: 1 },
])("runs TypeScript steps in $scriptName through tsx", ({ scriptName, expectedCount }) => {
const script = readPackageJson().scripts[scriptName];
expect(script).not.toContain("--experimental-strip-types");
expect(script.match(/node --import tsx scripts\/[^\s]+\.ts/gu)).toHaveLength(expectedCount);
});
it("enables live cache validation in the package script", () => {
expect(readPackageJson().scripts["test:live:cache"]).toBe(
"node scripts/run-with-env.mjs OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 -- node --import tsx scripts/check-live-cache.ts",
@ -133,7 +144,7 @@ describe("package scripts", () => {
it("runs runtime postbuild before plugin SDK strict export checks", () => {
expect(readPackageJson().scripts["build:plugin-sdk:strict-smoke"]).toBe(
"node scripts/tsdown-build.mjs && node scripts/runtime-postbuild.mjs && node scripts/run-with-env.mjs OPENCLAW_PLUGIN_SDK_CANONICAL_DTS=1 -- node --experimental-strip-types scripts/write-plugin-sdk-entry-dts.ts && node scripts/check-plugin-sdk-exports.mjs",
"node scripts/tsdown-build.mjs && node scripts/runtime-postbuild.mjs && node scripts/run-with-env.mjs OPENCLAW_PLUGIN_SDK_CANONICAL_DTS=1 -- node --import tsx scripts/write-plugin-sdk-entry-dts.ts && node scripts/check-plugin-sdk-exports.mjs",
);
});

View file

@ -116,6 +116,55 @@ describe("resolveBuildAllStep", () => {
});
});
it.each([
{
label: "write-plugin-sdk-entry-dts",
scriptPath: "scripts/write-plugin-sdk-entry-dts.ts",
expectedEnv: { FOO: "bar", OPENCLAW_PLUGIN_SDK_CANONICAL_DTS: "1" },
},
{
label: "copy-hook-metadata",
scriptPath: "scripts/copy-hook-metadata.ts",
expectedEnv: { FOO: "bar" },
},
{
label: "copy-export-html-templates",
scriptPath: "scripts/copy-export-html-templates.ts",
expectedEnv: { FOO: "bar" },
},
{
label: "write-build-info",
scriptPath: "scripts/write-build-info.ts",
expectedEnv: { FOO: "bar" },
},
{
label: "write-cli-startup-metadata",
scriptPath: "scripts/write-cli-startup-metadata.ts",
expectedEnv: { FOO: "bar" },
},
{
label: "write-cli-compat",
scriptPath: "scripts/write-cli-compat.ts",
expectedEnv: { FOO: "bar" },
},
])("runs the $label TypeScript step through tsx", ({ label, scriptPath, expectedEnv }) => {
const step = getBuildAllStep(label);
const result = resolveBuildAllStep(step, {
nodeExecPath: "/custom/node",
env: { FOO: "bar" },
});
expect(result).toEqual({
command: "/custom/node",
args: ["--import", "tsx", scriptPath],
options: {
stdio: "inherit",
env: expectedEnv,
},
});
});
it("can route pnpm script steps through direct node entrypoints", () => {
const step = getBuildAllStep("plugins:assets:build");