Skip to content

Commit cbfadef

Browse files
committed
fix(build): use tsx across TypeScript build scripts
1 parent a8a2d23 commit cbfadef

4 files changed

Lines changed: 48 additions & 73 deletions

File tree

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,10 +1516,10 @@
15161516
"audit:seams": "node scripts/audit-seams.mjs",
15171517
"build": "node scripts/build-all.mjs",
15181518
"build:ci-artifacts": "node scripts/build-all.mjs ciArtifacts",
1519-
"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",
1519+
"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",
15201520
"build:plugin-sdk:dts": "node scripts/run-tsgo.mjs -p tsconfig.plugin-sdk.dts.json --declaration true",
1521-
"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",
1522-
"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",
1521+
"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",
1522+
"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",
15231523
"canvas:a2ui:bundle": "node scripts/bundle-a2ui.mjs",
15241524
"canvas:a2ui:native:check": "node scripts/sync-native-a2ui.mjs --check",
15251525
"canvas:a2ui:native:sync": "node scripts/sync-native-a2ui.mjs --write",

scripts/build-all.mjs

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export const BUILD_ALL_STEPS = [
5353
{
5454
label: "write-plugin-sdk-entry-dts",
5555
kind: "node",
56-
args: ["--experimental-strip-types", "scripts/write-plugin-sdk-entry-dts.ts"],
56+
args: ["--import", "tsx", "scripts/write-plugin-sdk-entry-dts.ts"],
5757
env: {
5858
OPENCLAW_PLUGIN_SDK_CANONICAL_DTS: "1",
5959
},
@@ -77,12 +77,12 @@ export const BUILD_ALL_STEPS = [
7777
{
7878
label: "copy-hook-metadata",
7979
kind: "node",
80-
args: ["--experimental-strip-types", "scripts/copy-hook-metadata.ts"],
80+
args: ["--import", "tsx", "scripts/copy-hook-metadata.ts"],
8181
},
8282
{
8383
label: "copy-export-html-templates",
8484
kind: "node",
85-
args: ["--experimental-strip-types", "scripts/copy-export-html-templates.ts"],
85+
args: ["--import", "tsx", "scripts/copy-export-html-templates.ts"],
8686
cache: {
8787
inputs: [
8888
"scripts/copy-export-html-templates.ts",
@@ -105,17 +105,17 @@ export const BUILD_ALL_STEPS = [
105105
{
106106
label: "write-build-info",
107107
kind: "node",
108-
args: ["--experimental-strip-types", "scripts/write-build-info.ts"],
108+
args: ["--import", "tsx", "scripts/write-build-info.ts"],
109109
},
110110
{
111111
label: "write-cli-startup-metadata",
112112
kind: "node",
113-
args: ["--experimental-strip-types", "scripts/write-cli-startup-metadata.ts"],
113+
args: ["--import", "tsx", "scripts/write-cli-startup-metadata.ts"],
114114
},
115115
{
116116
label: "write-cli-compat",
117117
kind: "node",
118-
args: ["--experimental-strip-types", "scripts/write-cli-compat.ts"],
118+
args: ["--import", "tsx", "scripts/write-cli-compat.ts"],
119119
},
120120
];
121121

@@ -276,22 +276,6 @@ function resolveStepEnv(step, env, platform) {
276276
};
277277
}
278278

279-
// Some CI runners use Node builds where process.features.typescript is absent or false.
280-
// Keep --experimental-strip-types build steps working there by preserving the script contract
281-
// through tsx; removing this makes affected runners fail late in build-all.
282-
function resolveNodeStepArgs(args, params = {}) {
283-
const nodeSupportsTypeScript =
284-
params.nodeSupportsTypeScript ?? Boolean(process.features?.typescript);
285-
if (nodeSupportsTypeScript || args[0] !== "--experimental-strip-types") {
286-
return args;
287-
}
288-
const scriptPath = args[1];
289-
if (typeof scriptPath !== "string" || !scriptPath.endsWith(".ts")) {
290-
return args;
291-
}
292-
return ["--import", "tsx", scriptPath, ...args.slice(2)];
293-
}
294-
295279
export function resolveBuildAllStep(step, params = {}) {
296280
const platform = params.platform ?? process.platform;
297281
const env = resolveStepEnv(step, params.env ?? process.env, platform);
@@ -329,7 +313,7 @@ export function resolveBuildAllStep(step, params = {}) {
329313
}
330314
return {
331315
command: params.nodeExecPath ?? nodeBin,
332-
args: resolveNodeStepArgs(step.args, params),
316+
args: step.args,
333317
options: {
334318
stdio: "inherit",
335319
env,

test/package-scripts.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,17 @@ describe("package scripts", () => {
119119
expect(directNodeEnvScripts).toEqual([]);
120120
});
121121

122+
it.each([
123+
{ scriptName: "build:docker", expectedCount: 5 },
124+
{ scriptName: "build:plugin-sdk:strict-smoke", expectedCount: 1 },
125+
{ scriptName: "build:strict-smoke", expectedCount: 1 },
126+
])("runs TypeScript steps in $scriptName through tsx", ({ scriptName, expectedCount }) => {
127+
const script = readPackageJson().scripts[scriptName];
128+
129+
expect(script).not.toContain("--experimental-strip-types");
130+
expect(script.match(/node --import tsx scripts\/[^\s]+\.ts/gu)).toHaveLength(expectedCount);
131+
});
132+
122133
it("enables live cache validation in the package script", () => {
123134
expect(readPackageJson().scripts["test:live:cache"]).toBe(
124135
"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", () => {
133144

134145
it("runs runtime postbuild before plugin SDK strict export checks", () => {
135146
expect(readPackageJson().scripts["build:plugin-sdk:strict-smoke"]).toBe(
136-
"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",
147+
"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",
137148
);
138149
});
139150

test/scripts/build-all.test.ts

Lines changed: 26 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -118,69 +118,49 @@ describe("resolveBuildAllStep", () => {
118118

119119
it.each([
120120
{
121-
name: "routes TypeScript stripping through tsx when native stripping is unavailable",
122-
step: getBuildAllStep("write-plugin-sdk-entry-dts"),
123-
expectedArgs: ["--import", "tsx", "scripts/write-plugin-sdk-entry-dts.ts"],
121+
label: "write-plugin-sdk-entry-dts",
122+
scriptPath: "scripts/write-plugin-sdk-entry-dts.ts",
123+
expectedEnv: { FOO: "bar", OPENCLAW_PLUGIN_SDK_CANONICAL_DTS: "1" },
124124
},
125125
{
126-
name: "forwards extra TypeScript script args through the tsx fallback",
127-
step: {
128-
label: "custom-typescript-step",
129-
kind: "node",
130-
args: ["--experimental-strip-types", "scripts/custom.ts", "--check"],
131-
},
132-
expectedArgs: ["--import", "tsx", "scripts/custom.ts", "--check"],
126+
label: "copy-hook-metadata",
127+
scriptPath: "scripts/copy-hook-metadata.ts",
128+
expectedEnv: { FOO: "bar" },
133129
},
134130
{
135-
name: "passes through non-TypeScript-strip node args",
136-
step: {
137-
label: "custom-node-step",
138-
kind: "node",
139-
args: ["scripts/custom.mjs"],
140-
},
141-
expectedArgs: ["scripts/custom.mjs"],
131+
label: "copy-export-html-templates",
132+
scriptPath: "scripts/copy-export-html-templates.ts",
133+
expectedEnv: { FOO: "bar" },
142134
},
143135
{
144-
name: "passes through non-TypeScript files using strip-types",
145-
step: {
146-
label: "custom-js-step",
147-
kind: "node",
148-
args: ["--experimental-strip-types", "scripts/custom.mjs"],
149-
},
150-
expectedArgs: ["--experimental-strip-types", "scripts/custom.mjs"],
136+
label: "write-build-info",
137+
scriptPath: "scripts/write-build-info.ts",
138+
expectedEnv: { FOO: "bar" },
151139
},
152-
])("$name", ({ step, expectedArgs }) => {
153-
const result = resolveBuildAllStep(step, {
154-
nodeExecPath: "/custom/node",
155-
env: { FOO: "bar" },
156-
nodeSupportsTypeScript: false,
157-
});
158-
159-
expect(result).toEqual({
160-
command: "/custom/node",
161-
args: expectedArgs,
162-
options: {
163-
stdio: "inherit",
164-
env: { FOO: "bar" },
165-
},
166-
});
167-
});
168-
169-
it("keeps native TypeScript stripping when the node binary supports it", () => {
170-
const step = getBuildAllStep("write-plugin-sdk-entry-dts");
140+
{
141+
label: "write-cli-startup-metadata",
142+
scriptPath: "scripts/write-cli-startup-metadata.ts",
143+
expectedEnv: { FOO: "bar" },
144+
},
145+
{
146+
label: "write-cli-compat",
147+
scriptPath: "scripts/write-cli-compat.ts",
148+
expectedEnv: { FOO: "bar" },
149+
},
150+
])("runs the $label TypeScript step through tsx", ({ label, scriptPath, expectedEnv }) => {
151+
const step = getBuildAllStep(label);
171152

172153
const result = resolveBuildAllStep(step, {
173154
nodeExecPath: "/custom/node",
174155
env: { FOO: "bar" },
175-
nodeSupportsTypeScript: true,
176156
});
177157

178158
expect(result).toEqual({
179159
command: "/custom/node",
180-
args: ["--experimental-strip-types", "scripts/write-plugin-sdk-entry-dts.ts"],
160+
args: ["--import", "tsx", scriptPath],
181161
options: {
182162
stdio: "inherit",
183-
env: { FOO: "bar" },
163+
env: expectedEnv,
184164
},
185165
});
186166
});

0 commit comments

Comments
 (0)