






















@@ -0,0 +1,111 @@
1+import { spawn } from "node:child_process";
2+import fs from "node:fs/promises";
3+import os from "node:os";
4+import path from "node:path";
5+import { afterEach, describe, expect, it } from "vitest";
6+7+type CommandResult = {
8+stdout: string;
9+stderr: string;
10+};
11+12+const COMMAND_TIMEOUT_MS = 120_000;
13+const tempDirs: string[] = [];
14+15+function runCommand(
16+command: string,
17+args: string[],
18+options: { cwd: string; timeoutMs?: number },
19+): Promise<CommandResult> {
20+return new Promise((resolve, reject) => {
21+const stdout: string[] = [];
22+const stderr: string[] = [];
23+const child = spawn(command, args, {
24+cwd: options.cwd,
25+env: { ...process.env, npm_config_audit: "false", npm_config_fund: "false" },
26+stdio: ["ignore", "pipe", "pipe"],
27+});
28+const timer = setTimeout(() => {
29+child.kill("SIGKILL");
30+reject(
31+new Error(
32+`command timed out after ${options.timeoutMs ?? COMMAND_TIMEOUT_MS}ms: ${[
33+ command,
34+ ...args,
35+ ].join(" ")}`,
36+),
37+);
38+}, options.timeoutMs ?? COMMAND_TIMEOUT_MS);
39+child.stdout?.setEncoding("utf8");
40+child.stderr?.setEncoding("utf8");
41+child.stdout?.on("data", (chunk) => stdout.push(String(chunk)));
42+child.stderr?.on("data", (chunk) => stderr.push(String(chunk)));
43+child.once("error", (error) => {
44+clearTimeout(timer);
45+reject(error);
46+});
47+child.once("exit", (code, signal) => {
48+clearTimeout(timer);
49+const result = { stdout: stdout.join(""), stderr: stderr.join("") };
50+if (code === 0) {
51+resolve(result);
52+return;
53+}
54+reject(
55+new Error(
56+`command failed (${String(code ?? signal)}): ${[command, ...args].join(" ")}\n` +
57+`--- stdout ---\n${result.stdout}\n--- stderr ---\n${result.stderr}`,
58+),
59+);
60+});
61+});
62+}
63+64+describe("OpenClaw SDK package e2e", () => {
65+afterEach(async () => {
66+await Promise.all(
67+tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })),
68+);
69+});
70+71+it("packs and imports from an external temp consumer", async () => {
72+const repoRoot = process.cwd();
73+const packageRoot = path.join(repoRoot, "packages", "sdk");
74+const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-sdk-consumer-"));
75+tempDirs.push(tempDir);
76+77+await runCommand("pnpm", ["--filter", "@openclaw/sdk", "build"], {
78+cwd: repoRoot,
79+timeoutMs: 180_000,
80+});
81+await runCommand("pnpm", ["pack", "--pack-destination", tempDir], {
82+cwd: packageRoot,
83+});
84+85+const packedFiles = (await fs.readdir(tempDir)).filter((file) => file.endsWith(".tgz"));
86+expect(packedFiles).toHaveLength(1);
87+const tarball = path.join(tempDir, packedFiles[0] ?? "");
88+89+await fs.writeFile(
90+path.join(tempDir, "package.json"),
91+JSON.stringify({ private: true, type: "module" }),
92+);
93+await runCommand("npm", ["install", "--ignore-scripts", "--no-audit", "--no-fund", tarball], {
94+cwd: tempDir,
95+});
96+97+const importScript = `
98+ import { GatewayClientTransport, OpenClaw, normalizeGatewayEvent } from "@openclaw/sdk";
99+ if (typeof GatewayClientTransport !== "function") throw new Error("missing transport export");
100+ if (typeof OpenClaw !== "function") throw new Error("missing client export");
101+ const event = normalizeGatewayEvent({
102+ event: "agent",
103+ payload: { runId: "pack-smoke", stream: "lifecycle", data: { phase: "start" } }
104+ });
105+ if (event.type !== "run.started") throw new Error("unexpected event normalization");
106+ `;
107+await runCommand(process.execPath, ["--input-type=module", "-e", importScript], {
108+cwd: tempDir,
109+});
110+});
111+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。