|
| 1 | +import { spawnSync } from "node:child_process"; |
| 2 | +import { mkdirSync, writeFileSync } from "node:fs"; |
| 3 | +import { join } from "node:path"; |
| 4 | +import { afterEach, describe, expect, it } from "vitest"; |
| 5 | +import { cleanupTempDirs, makeTempDir } from "../helpers/temp-dir.js"; |
| 6 | + |
| 7 | +const CHECK_SCRIPT = "scripts/check-package-dist-imports.mjs"; |
| 8 | +const tempDirs: string[] = []; |
| 9 | + |
| 10 | +afterEach(() => { |
| 11 | +cleanupTempDirs(tempDirs); |
| 12 | +}); |
| 13 | + |
| 14 | +describe("check-package-dist-imports", () => { |
| 15 | +it("prints help before reading package state", () => { |
| 16 | +const result = spawnSync("node", [CHECK_SCRIPT, "--help"], { encoding: "utf8" }); |
| 17 | + |
| 18 | +expect(result.status, result.stderr).toBe(0); |
| 19 | +expect(result.stdout).toContain( |
| 20 | +"Usage: node scripts/check-package-dist-imports.mjs [package-root]", |
| 21 | +); |
| 22 | +expect(result.stderr).toBe(""); |
| 23 | +}); |
| 24 | + |
| 25 | +it("rejects option-like and extra arguments before dist scanning", () => { |
| 26 | +const unknown = spawnSync("node", [CHECK_SCRIPT, "--tag"], { encoding: "utf8" }); |
| 27 | + |
| 28 | +expect(unknown.status).not.toBe(0); |
| 29 | +expect(unknown.stderr).toContain("Unknown package dist import check option: --tag"); |
| 30 | +expect(unknown.stderr).not.toContain("missing dist directory"); |
| 31 | + |
| 32 | +const extra = spawnSync("node", [CHECK_SCRIPT, ".", "extra"], { encoding: "utf8" }); |
| 33 | + |
| 34 | +expect(extra.status).not.toBe(0); |
| 35 | +expect(extra.stderr).toContain("Unexpected package dist import check argument: extra"); |
| 36 | +expect(extra.stderr).not.toContain("missing dist directory"); |
| 37 | +}); |
| 38 | + |
| 39 | +it("accepts a minimal package dist root", () => { |
| 40 | +const root = makeTempDir(tempDirs, "openclaw-package-dist-imports-"); |
| 41 | +mkdirSync(join(root, "dist"), { recursive: true }); |
| 42 | +writeFileSync(join(root, "dist", "index.js"), "export {};\n", "utf8"); |
| 43 | + |
| 44 | +const result = spawnSync("node", [CHECK_SCRIPT, root], { encoding: "utf8" }); |
| 45 | + |
| 46 | +expect(result.status, result.stderr).toBe(0); |
| 47 | +expect(result.stdout).toContain("OpenClaw package dist import closure passed."); |
| 48 | +}); |
| 49 | +}); |