






















@@ -1,21 +1,14 @@
11import assert from "node:assert/strict";
2+import { spawnSync } from "node:child_process";
23import fs from "node:fs";
34import path from "node:path";
45import { pathToFileURL } from "node:url";
56import { parsePackageRootArg } from "./lib/package-root-args.mjs";
6778const STATUS_MESSAGE_RUNTIME_RE = /^status-message\.runtime(?:-[A-Za-z0-9_-]+)?\.js$/u;
899-const { packageRoot } = parsePackageRootArg(
10-process.argv.slice(2),
11-"OPENCLAW_STATUS_MESSAGE_RUNTIME_ROOT",
12-);
13-14-function findBuiltStatusMessageRuntimePath(distDir) {
15-const candidates = fs
16-.readdirSync(distDir, { withFileTypes: true })
17-.filter((entry) => entry.isFile() && STATUS_MESSAGE_RUNTIME_RE.test(entry.name))
18-.map((entry) => entry.name)
10+export function findBuiltStatusMessageRuntimePath(distDir) {
11+const candidates = listBuiltStatusMessageRuntimeFiles(distDir)
1912.toSorted((left, right) => {
2013const leftHasHash = left !== "status-message.runtime.js";
2114const rightHasHash = right !== "status-message.runtime.js";
@@ -30,18 +23,60 @@ function findBuiltStatusMessageRuntimePath(distDir) {
3023return path.join(distDir, candidates[0]);
3124}
322533-const runtimePath = findBuiltStatusMessageRuntimePath(path.join(packageRoot, "dist"));
34-const runtimeModule = await import(pathToFileURL(runtimePath).href);
35-36-assert.equal(
37-typeof runtimeModule.loadStatusMessageRuntimeModule,
38-"function",
39-`built status-message runtime did not export loadStatusMessageRuntimeModule: ${runtimePath}`,
40-);
41-42-const statusModule = await runtimeModule.loadStatusMessageRuntimeModule();
43-assert.equal(
44-typeof statusModule.buildStatusMessage,
45-"function",
46-"status-message runtime did not load buildStatusMessage",
47-);
26+function listBuiltStatusMessageRuntimeFiles(distDir) {
27+const externalFiles = listFindBuiltStatusMessageRuntimeFiles(distDir);
28+if (externalFiles) {
29+return externalFiles;
30+}
31+return fs
32+.readdirSync(distDir, { withFileTypes: true })
33+.filter((entry) => entry.isFile() && STATUS_MESSAGE_RUNTIME_RE.test(entry.name))
34+.map((entry) => entry.name);
35+}
36+37+function listFindBuiltStatusMessageRuntimeFiles(distDir) {
38+const result = spawnSync(
39+"find",
40+[distDir, "-maxdepth", "1", "-type", "f", "-name", "status-message.runtime*.js"],
41+{
42+encoding: "utf8",
43+maxBuffer: 1024 * 1024,
44+stdio: ["ignore", "pipe", "ignore"],
45+},
46+);
47+if (result.status !== 0) {
48+return null;
49+}
50+return result.stdout
51+.split("\n")
52+.map((line) => line.trim())
53+.filter((line) => line.length > 0)
54+.map((file) => path.basename(file))
55+.filter((file) => STATUS_MESSAGE_RUNTIME_RE.test(file));
56+}
57+58+async function main() {
59+const { packageRoot } = parsePackageRootArg(
60+process.argv.slice(2),
61+"OPENCLAW_STATUS_MESSAGE_RUNTIME_ROOT",
62+);
63+const runtimePath = findBuiltStatusMessageRuntimePath(path.join(packageRoot, "dist"));
64+const runtimeModule = await import(pathToFileURL(runtimePath).href);
65+66+assert.equal(
67+typeof runtimeModule.loadStatusMessageRuntimeModule,
68+"function",
69+`built status-message runtime did not export loadStatusMessageRuntimeModule: ${runtimePath}`,
70+);
71+72+const statusModule = await runtimeModule.loadStatusMessageRuntimeModule();
73+assert.equal(
74+typeof statusModule.buildStatusMessage,
75+"function",
76+"status-message runtime did not load buildStatusMessage",
77+);
78+}
79+80+if (process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
81+await main();
82+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。