diff --git a/src/plugin-sdk/facade-loader.ts b/src/plugin-sdk/facade-loader.ts index 1796e3c04da..e33ae5e2717 100644 --- a/src/plugin-sdk/facade-loader.ts +++ b/src/plugin-sdk/facade-loader.ts @@ -4,22 +4,22 @@ import path from "node:path"; import { fileURLToPath } from "node:url"; import { openBoundaryFileSync } from "../infra/boundary-file-read.js"; import { resolveBundledPluginsDir } from "../plugins/bundled-dir.js"; +import { + getCachedPluginJitiLoader, + type PluginJitiLoaderCache, + type PluginJitiLoaderFactory, +} from "../plugins/jiti-loader-cache.js"; import { normalizeBundledPluginArtifactSubpath, resolveBundledPluginPublicSurfacePath, } from "../plugins/public-surface-runtime.js"; -import { - buildPluginLoaderJitiOptions, - resolvePluginLoaderJitiConfig, - resolveLoaderPackageRoot, -} from "../plugins/sdk-alias.js"; +import { resolveLoaderPackageRoot } from "../plugins/sdk-alias.js"; const CURRENT_MODULE_PATH = fileURLToPath(import.meta.url); const PUBLIC_SURFACE_SOURCE_EXTENSIONS = [".ts", ".mts", ".js", ".mjs", ".cts", ".cjs"] as const; -type JitiLoader = ReturnType<(typeof import("jiti"))["createJiti"]>; const nodeRequire = createRequire(import.meta.url); -const jitiLoaders = new Map(); +const jitiLoaders: PluginJitiLoaderCache = new Map(); const loadedFacadeModules = new Map(); const loadedFacadePluginIds = new Set(); const cachedFacadeModuleLocationsByKey = new Map< @@ -29,9 +29,7 @@ const cachedFacadeModuleLocationsByKey = new Map< boundaryRoot: string; } | null >(); -let facadeLoaderJitiFactory: - | ((...args: Parameters<(typeof import("jiti"))["createJiti"]>) => JitiLoader) - | undefined; +let facadeLoaderJitiFactory: PluginJitiLoaderFactory | undefined; let cachedOpenClawPackageRoot: string | undefined; function getJitiFactory() { @@ -140,22 +138,14 @@ function resolveFacadeModuleLocation(params: { } function getJiti(modulePath: string) { - const { tryNative, aliasMap, cacheKey } = resolvePluginLoaderJitiConfig({ + return getCachedPluginJitiLoader({ + cache: jitiLoaders, modulePath, - argv1: process.argv[1], - moduleUrl: import.meta.url, + importerUrl: import.meta.url, preferBuiltDist: true, + jitiFilename: import.meta.url, + createLoader: getJitiFactory(), }); - const cached = jitiLoaders.get(cacheKey); - if (cached) { - return cached; - } - const loader = getJitiFactory()(import.meta.url, { - ...buildPluginLoaderJitiOptions(aliasMap), - tryNative, - }); - jitiLoaders.set(cacheKey, loader); - return loader; } function createLazyFacadeValueLoader(load: () => T): () => T { @@ -310,7 +300,7 @@ export function resetFacadeLoaderStateForTest(): void { } export function setFacadeLoaderJitiFactoryForTest( - factory: ((...args: Parameters<(typeof import("jiti"))["createJiti"]>) => JitiLoader) | undefined, + factory: PluginJitiLoaderFactory | undefined, ): void { facadeLoaderJitiFactory = factory; } diff --git a/src/plugins/jiti-loader-cache.ts b/src/plugins/jiti-loader-cache.ts index c6f694a50ac..fa0735fe79a 100644 --- a/src/plugins/jiti-loader-cache.ts +++ b/src/plugins/jiti-loader-cache.ts @@ -1,7 +1,9 @@ import { createJiti } from "jiti"; import { buildPluginLoaderJitiOptions, resolvePluginLoaderJitiConfig } from "./sdk-alias.js"; -export type PluginJitiLoaderCache = Map>; +export type PluginJitiLoader = ReturnType; +export type PluginJitiLoaderFactory = typeof createJiti; +export type PluginJitiLoaderCache = Map; export function getCachedPluginJitiLoader(params: { cache: PluginJitiLoaderCache; @@ -10,7 +12,8 @@ export function getCachedPluginJitiLoader(params: { argvEntry?: string; preferBuiltDist?: boolean; jitiFilename?: string; -}): ReturnType { + createLoader?: PluginJitiLoaderFactory; +}): PluginJitiLoader { const { tryNative, aliasMap, cacheKey } = resolvePluginLoaderJitiConfig({ modulePath: params.modulePath, argv1: params.argvEntry ?? process.argv[1], @@ -22,7 +25,7 @@ export function getCachedPluginJitiLoader(params: { if (cached) { return cached; } - const loader = createJiti(params.jitiFilename ?? params.modulePath, { + const loader = (params.createLoader ?? createJiti)(params.jitiFilename ?? params.modulePath, { ...buildPluginLoaderJitiOptions(aliasMap), tryNative, });