
























@@ -1,7 +1,10 @@
11import fs from "node:fs/promises";
22import path from "node:path";
33import { describe, expect, it, vi } from "vitest";
4-import { discoverStaticExtensionAssets } from "../../scripts/lib/static-extension-assets.mjs";
4+import {
5+copyStaticExtensionAssetsToRuntimeOverlay,
6+discoverStaticExtensionAssets,
7+} from "../../scripts/lib/static-extension-assets.mjs";
58import {
69copyStaticExtensionAssets,
710listStaticExtensionAssetOutputs,
@@ -136,6 +139,75 @@ describe("runtime postbuild static assets", () => {
136139);
137140});
138141142+it("skips runtime overlay asset copies when the runtime extension root is absent", async () => {
143+const rootDir = createTempDir("openclaw-runtime-postbuild-");
144+await fs.mkdir(path.join(rootDir, "extensions", "demo", "assets"), { recursive: true });
145+await fs.writeFile(
146+path.join(rootDir, "extensions", "demo", "assets", "viewer.js"),
147+"viewer\n",
148+"utf8",
149+);
150+151+copyStaticExtensionAssetsToRuntimeOverlay({
152+ rootDir,
153+assets: [
154+{
155+src: "extensions/demo/assets/viewer.js",
156+dest: "dist/extensions/demo/assets/viewer.js",
157+},
158+],
159+});
160+161+await expectPathMissing(path.join(rootDir, "dist-runtime", "extensions", "demo", "assets"));
162+});
163+164+it("ignores runtime overlay static assets outside dist extensions", async () => {
165+const rootDir = createTempDir("openclaw-runtime-postbuild-");
166+await fs.mkdir(path.join(rootDir, "dist-runtime", "extensions"), { recursive: true });
167+await fs.mkdir(path.join(rootDir, "extensions", "demo", "assets"), { recursive: true });
168+await fs.writeFile(
169+path.join(rootDir, "extensions", "demo", "assets", "viewer.js"),
170+"viewer\n",
171+"utf8",
172+);
173+174+copyStaticExtensionAssetsToRuntimeOverlay({
175+ rootDir,
176+assets: [
177+{
178+src: "extensions/demo/assets/viewer.js",
179+dest: "dist/other/demo/assets/viewer.js",
180+},
181+],
182+});
183+184+await expectPathMissing(path.join(rootDir, "dist-runtime", "other", "demo", "assets"));
185+});
186+187+it("warns when a runtime overlay static asset source is missing", async () => {
188+const rootDir = createTempDir("openclaw-runtime-postbuild-");
189+const warn = vi.fn();
190+await fs.mkdir(path.join(rootDir, "dist-runtime", "extensions"), { recursive: true });
191+192+copyStaticExtensionAssetsToRuntimeOverlay({
193+ rootDir,
194+assets: [
195+{
196+src: "extensions/demo/assets/missing.js",
197+dest: "dist/extensions/demo/assets/missing.js",
198+},
199+],
200+ warn,
201+});
202+203+expect(warn).toHaveBeenCalledWith(
204+"[runtime-postbuild] static asset not found, skipping: extensions/demo/assets/missing.js",
205+);
206+await expectPathMissing(
207+path.join(rootDir, "dist-runtime", "extensions", "demo", "assets", "missing.js"),
208+);
209+});
210+139211it("warns when a declared static asset is missing", async () => {
140212const rootDir = createTempDir("openclaw-runtime-postbuild-");
141213const warn = vi.fn();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。