fix(plugin-sdk): share facade loader jiti cache plumbing

This commit is contained in:
Vincent Koc
2026-04-14 17:03:44 +01:00
parent 0d2a4b4fec
commit 3bb9e5f580
2 changed files with 20 additions and 27 deletions

View File

@@ -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<string, JitiLoader>();
const jitiLoaders: PluginJitiLoaderCache = new Map();
const loadedFacadeModules = new Map<string, unknown>();
const loadedFacadePluginIds = new Set<string>();
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<T>(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;
}

View File

@@ -1,7 +1,9 @@
import { createJiti } from "jiti";
import { buildPluginLoaderJitiOptions, resolvePluginLoaderJitiConfig } from "./sdk-alias.js";
export type PluginJitiLoaderCache = Map<string, ReturnType<typeof createJiti>>;
export type PluginJitiLoader = ReturnType<typeof createJiti>;
export type PluginJitiLoaderFactory = typeof createJiti;
export type PluginJitiLoaderCache = Map<string, PluginJitiLoader>;
export function getCachedPluginJitiLoader(params: {
cache: PluginJitiLoaderCache;
@@ -10,7 +12,8 @@ export function getCachedPluginJitiLoader(params: {
argvEntry?: string;
preferBuiltDist?: boolean;
jitiFilename?: string;
}): ReturnType<typeof createJiti> {
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,
});