






















@@ -0,0 +1,89 @@
1+import fs from "node:fs";
2+import os from "node:os";
3+import path from "node:path";
4+import { afterEach, describe, expect, it } from "vitest";
5+import {
6+isJavaScriptModulePath,
7+tryNativeRequireJavaScriptModule,
8+} from "./native-module-require.js";
9+10+const tempDirs: string[] = [];
11+12+function makeTempDir(): string {
13+const dir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-native-require-"));
14+tempDirs.push(dir);
15+return dir;
16+}
17+18+afterEach(() => {
19+for (const dir of tempDirs.splice(0)) {
20+fs.rmSync(dir, { recursive: true, force: true });
21+}
22+});
23+24+describe("tryNativeRequireJavaScriptModule", () => {
25+it("loads native CommonJS modules", () => {
26+const dir = makeTempDir();
27+const modulePath = path.join(dir, "plugin.cjs");
28+fs.writeFileSync(modulePath, 'module.exports = { marker: "native" };\n', "utf8");
29+30+const result = tryNativeRequireJavaScriptModule(modulePath, { allowWindows: true });
31+32+expect(result).toEqual({ ok: true, moduleExport: { marker: "native" } });
33+});
34+35+it("declines modules that need source-transform fallback", () => {
36+const dir = makeTempDir();
37+const modulePath = path.join(dir, "plugin.mjs");
38+fs.writeFileSync(
39+modulePath,
40+'await Promise.resolve();\nexport const marker = "esm";\n',
41+"utf8",
42+);
43+44+expect(tryNativeRequireJavaScriptModule(modulePath, { allowWindows: true })).toEqual({
45+ok: false,
46+});
47+});
48+49+it("declines missing target modules so callers can try source fallback", () => {
50+const modulePath = path.join(makeTempDir(), "missing.cjs");
51+52+expect(tryNativeRequireJavaScriptModule(modulePath, { allowWindows: true })).toEqual({
53+ok: false,
54+});
55+});
56+57+it("propagates missing dependency errors from existing modules", () => {
58+const dir = makeTempDir();
59+const modulePath = path.join(dir, "plugin.cjs");
60+fs.writeFileSync(modulePath, 'require("./missing-dependency.cjs");\n', "utf8");
61+62+expect(() => tryNativeRequireJavaScriptModule(modulePath, { allowWindows: true })).toThrow(
63+"missing-dependency.cjs",
64+);
65+});
66+67+it("propagates real module evaluation errors instead of falling back", () => {
68+const dir = makeTempDir();
69+const modulePath = path.join(dir, "plugin.cjs");
70+fs.writeFileSync(
71+modulePath,
72+'throw new Error("plugin exploded during native load");\n',
73+"utf8",
74+);
75+76+expect(() => tryNativeRequireJavaScriptModule(modulePath, { allowWindows: true })).toThrow(
77+"plugin exploded during native load",
78+);
79+});
80+});
81+82+describe("isJavaScriptModulePath", () => {
83+it("only accepts JavaScript runtime extensions", () => {
84+expect(isJavaScriptModulePath("/plugin/index.js")).toBe(true);
85+expect(isJavaScriptModulePath("/plugin/index.mjs")).toBe(true);
86+expect(isJavaScriptModulePath("/plugin/index.cjs")).toBe(true);
87+expect(isJavaScriptModulePath("/plugin/index.ts")).toBe(false);
88+});
89+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。