
























@@ -1,12 +1,17 @@
11import fs from "node:fs";
2+import { createRequire } from "node:module";
23import os from "node:os";
34import path from "node:path";
45import { importFreshModule } from "openclaw/plugin-sdk/test-fixtures";
56import { afterEach, describe, expect, it, vi } from "vitest";
67import { isJavaScriptModulePath } from "../../plugins/native-module-require.js";
8+import type { PluginModuleLoaderFactory } from "../../plugins/plugin-module-loader-cache.js";
79import { resolveExistingPluginModulePath } from "./module-loader.js";
810911const tempDirs: string[] = [];
12+const pluginModuleLoaderJitiFactoryOverrideKey = Symbol.for(
13+"openclaw.pluginModuleLoaderJitiFactoryOverride",
14+);
10151116afterEach(() => {
1217for (const tempDir of tempDirs.splice(0)) {
@@ -15,8 +20,21 @@ afterEach(() => {
1520vi.restoreAllMocks();
1621vi.resetModules();
1722vi.doUnmock("jiti");
23+delete (
24+globalThis as typeof globalThis & {
25+[pluginModuleLoaderJitiFactoryOverrideKey]?: PluginModuleLoaderFactory;
26+}
27+)[pluginModuleLoaderJitiFactoryOverrideKey];
1828});
192930+function stubPluginModuleLoaderJitiFactory(createJiti: PluginModuleLoaderFactory): void {
31+(
32+globalThis as typeof globalThis & {
33+[pluginModuleLoaderJitiFactoryOverrideKey]?: PluginModuleLoaderFactory;
34+}
35+)[pluginModuleLoaderJitiFactoryOverrideKey] = createJiti;
36+}
37+2038function createTempDir(): string {
2139const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-channel-module-loader-"));
2240tempDirs.push(tempDir);
@@ -70,9 +88,7 @@ describe("channel plugin module loader helpers", () => {
7088}));
7189const createJiti = vi.fn(() => loadWithJiti);
7290vi.resetModules();
73-vi.doMock("jiti", () => ({
74- createJiti,
75-}));
91+stubPluginModuleLoaderJitiFactory(createJiti as unknown as PluginModuleLoaderFactory);
7692const loaderModule = await importFreshModule<typeof import("./module-loader.js")>(
7793import.meta.url,
7894"./module-loader.js?scope=source-ts-jiti-fallback",
@@ -82,15 +98,24 @@ describe("channel plugin module loader helpers", () => {
8298fs.mkdirSync(path.dirname(modulePath), { recursive: true });
8399fs.writeFileSync(modulePath, "export const ok = true;\n", "utf8");
8410085-expect(
86-loaderModule.loadChannelPluginModule({
87- modulePath,
88- rootDir,
89-}),
90-).toEqual({
91-loadedBy: "jiti",
92-target: fs.realpathSync.native(modulePath),
93-});
101+const testRequire = createRequire(import.meta.url);
102+const originalTsHook = testRequire.extensions[".ts"];
103+delete testRequire.extensions[".ts"];
104+try {
105+expect(
106+loaderModule.loadChannelPluginModule({
107+ modulePath,
108+ rootDir,
109+}),
110+).toEqual({
111+loadedBy: "jiti",
112+target: fs.realpathSync.native(modulePath),
113+});
114+} finally {
115+if (originalTsHook) {
116+testRequire.extensions[".ts"] = originalTsHook;
117+}
118+}
94119expect(createJiti).toHaveBeenCalledOnce();
95120expect(createJiti).toHaveBeenCalledWith(
96121expect.stringContaining("module-loader.ts"),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。