From 80d3b132a57813af6bd293983f99cbdff221ef57 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 20 Jun 2026 22:16:26 +0200 Subject: [PATCH] fix(release): validate package dist check args --- scripts/check-package-dist-imports.mjs | 32 ++++++++++-- scripts/test-projects.test-support.mjs | 1 + .../check-package-dist-imports.test.ts | 49 +++++++++++++++++++ 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 test/scripts/check-package-dist-imports.test.ts diff --git a/scripts/check-package-dist-imports.mjs b/scripts/check-package-dist-imports.mjs index 7a89d096a2a..acb1fdc4541 100644 --- a/scripts/check-package-dist-imports.mjs +++ b/scripts/check-package-dist-imports.mjs @@ -13,11 +13,37 @@ function fail(message) { process.exit(1); } -const packageRoot = path.resolve(process.argv[2] ?? process.cwd()); -if (process.argv.length > 3) { - fail(usage()); +function parseArgs(argv) { + const args = argv[0] === "--" ? argv.slice(1) : argv; + const packageRootArg = args[0]?.trim() ?? ""; + if (packageRootArg === "--help" || packageRootArg === "-h") { + return { help: true, packageRoot: "" }; + } + if (packageRootArg.startsWith("-")) { + throw new Error(`Unknown package dist import check option: ${packageRootArg}`); + } + const extraArg = args[1]?.trim(); + if (extraArg) { + throw new Error(`Unexpected package dist import check argument: ${extraArg}`); + } + return { + help: false, + packageRoot: path.resolve(packageRootArg || process.cwd()), + }; } +let cliArgs; +try { + cliArgs = parseArgs(process.argv.slice(2)); +} catch (error) { + fail(error instanceof Error ? error.message : String(error)); +} +if (cliArgs.help) { + console.log(usage()); + process.exit(0); +} + +const { packageRoot } = cliArgs; const distRoot = path.join(packageRoot, "dist"); if (!fs.existsSync(distRoot)) { fail(`missing dist directory: ${distRoot}`); diff --git a/scripts/test-projects.test-support.mjs b/scripts/test-projects.test-support.mjs index 34b3c964a2c..6175501bcd1 100644 --- a/scripts/test-projects.test-support.mjs +++ b/scripts/test-projects.test-support.mjs @@ -746,6 +746,7 @@ const TOOLING_SOURCE_TEST_TARGETS = new Map([ "scripts/check-openclaw-package-tarball.mjs", ["test/scripts/check-openclaw-package-tarball.test.ts"], ], + ["scripts/check-package-dist-imports.mjs", ["test/scripts/check-package-dist-imports.test.ts"]], ["scripts/package-changelog.mjs", ["test/scripts/package-changelog.test.ts"]], ["scripts/package-mac-app.sh", ["test/scripts/package-mac-app.test.ts"]], ["scripts/package-mac-dist.sh", ["test/scripts/package-mac-dist.test.ts"]], diff --git a/test/scripts/check-package-dist-imports.test.ts b/test/scripts/check-package-dist-imports.test.ts new file mode 100644 index 00000000000..1e27ba4cac0 --- /dev/null +++ b/test/scripts/check-package-dist-imports.test.ts @@ -0,0 +1,49 @@ +import { spawnSync } from "node:child_process"; +import { mkdirSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { afterEach, describe, expect, it } from "vitest"; +import { cleanupTempDirs, makeTempDir } from "../helpers/temp-dir.js"; + +const CHECK_SCRIPT = "scripts/check-package-dist-imports.mjs"; +const tempDirs: string[] = []; + +afterEach(() => { + cleanupTempDirs(tempDirs); +}); + +describe("check-package-dist-imports", () => { + it("prints help before reading package state", () => { + const result = spawnSync("node", [CHECK_SCRIPT, "--help"], { encoding: "utf8" }); + + expect(result.status, result.stderr).toBe(0); + expect(result.stdout).toContain( + "Usage: node scripts/check-package-dist-imports.mjs [package-root]", + ); + expect(result.stderr).toBe(""); + }); + + it("rejects option-like and extra arguments before dist scanning", () => { + const unknown = spawnSync("node", [CHECK_SCRIPT, "--tag"], { encoding: "utf8" }); + + expect(unknown.status).not.toBe(0); + expect(unknown.stderr).toContain("Unknown package dist import check option: --tag"); + expect(unknown.stderr).not.toContain("missing dist directory"); + + const extra = spawnSync("node", [CHECK_SCRIPT, ".", "extra"], { encoding: "utf8" }); + + expect(extra.status).not.toBe(0); + expect(extra.stderr).toContain("Unexpected package dist import check argument: extra"); + expect(extra.stderr).not.toContain("missing dist directory"); + }); + + it("accepts a minimal package dist root", () => { + const root = makeTempDir(tempDirs, "openclaw-package-dist-imports-"); + mkdirSync(join(root, "dist"), { recursive: true }); + writeFileSync(join(root, "dist", "index.js"), "export {};\n", "utf8"); + + const result = spawnSync("node", [CHECK_SCRIPT, root], { encoding: "utf8" }); + + expect(result.status, result.stderr).toBe(0); + expect(result.stdout).toContain("OpenClaw package dist import closure passed."); + }); +});