From 913e7d5ebac7af6924f38bb7200cd73c2e81fc48 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 31 Mar 2026 20:59:54 +0100 Subject: [PATCH] fix: correct callable plugin sdk facades --- scripts/lib/plugin-sdk-facades.mjs | 48 ++++++++++++++++++++++++++++-- src/plugin-sdk/browser-runtime.ts | 5 ++-- src/plugin-sdk/irc-surface.ts | 13 ++++---- src/plugin-sdk/signal-surface.ts | 16 +++++----- src/plugin-sdk/telegram-surface.ts | 19 ++++++------ 5 files changed, 71 insertions(+), 30 deletions(-) diff --git a/scripts/lib/plugin-sdk-facades.mjs b/scripts/lib/plugin-sdk-facades.mjs index ec3fbb5df70..fa6d8e3da73 100644 --- a/scripts/lib/plugin-sdk-facades.mjs +++ b/scripts/lib/plugin-sdk-facades.mjs @@ -1225,6 +1225,7 @@ const MODULE_RESOLUTION_OPTIONS = { target: ts.ScriptTarget.ESNext, }; const MODULE_RESOLUTION_HOST = ts.createCompilerHost(MODULE_RESOLUTION_OPTIONS, true); +const moduleResolutionContextCache = new Map(); const sourceExportKindsCache = new Map(); function listFacadeEntrySourcePaths(entry) { @@ -1324,6 +1325,48 @@ function resolveFacadeSourceTypescriptPath(repoRoot, sourcePath) { return candidates.find((candidate) => fs.existsSync(candidate)); } +function resolveFacadeModuleResolutionContext(repoRoot) { + const cacheKey = repoRoot || "__default__"; + const cached = moduleResolutionContextCache.get(cacheKey); + if (cached) { + return cached; + } + + let context = { + options: MODULE_RESOLUTION_OPTIONS, + host: MODULE_RESOLUTION_HOST, + }; + + if (repoRoot) { + const fileExists = (filePath) => ts.sys.fileExists(filePath); + const readFile = (filePath) => ts.sys.readFile(filePath); + const configPath = ts.findConfigFile(repoRoot, fileExists, "tsconfig.json"); + if (configPath) { + const configFile = ts.readConfigFile(configPath, readFile); + if (!configFile.error) { + const parsedConfig = ts.parseJsonConfigFileContent( + configFile.config, + ts.sys, + path.dirname(configPath), + MODULE_RESOLUTION_OPTIONS, + configPath, + ); + const options = { + ...MODULE_RESOLUTION_OPTIONS, + ...parsedConfig.options, + }; + context = { + options, + host: ts.createCompilerHost(options, true), + }; + } + } + } + + moduleResolutionContextCache.set(cacheKey, context); + return context; +} + function resolveFacadeSourceExportKinds(repoRoot, sourcePath) { const cacheKey = `${repoRoot}::${sourcePath}`; const cached = sourceExportKindsCache.get(cacheKey); @@ -1338,10 +1381,11 @@ function resolveFacadeSourceExportKinds(repoRoot, sourcePath) { return empty; } + const moduleResolutionContext = resolveFacadeModuleResolutionContext(repoRoot); const program = ts.createProgram( [sourceTsPath], - MODULE_RESOLUTION_OPTIONS, - MODULE_RESOLUTION_HOST, + moduleResolutionContext.options, + moduleResolutionContext.host, ); const sourceFile = program.getSourceFile(sourceTsPath); if (!sourceFile) { diff --git a/src/plugin-sdk/browser-runtime.ts b/src/plugin-sdk/browser-runtime.ts index 1c41e395def..032dac6d042 100644 --- a/src/plugin-sdk/browser-runtime.ts +++ b/src/plugin-sdk/browser-runtime.ts @@ -101,9 +101,8 @@ export const createBrowserRuntimeState: FacadeModule["createBrowserRuntimeState" )) as FacadeModule["createBrowserRuntimeState"]; export const createBrowserTool: FacadeModule["createBrowserTool"] = ((...args) => loadFacadeModule()["createBrowserTool"](...args)) as FacadeModule["createBrowserTool"]; -export const definePluginEntry: FacadeModule["definePluginEntry"] = createLazyFacadeObjectValue( - () => loadFacadeModule()["definePluginEntry"] as object, -) as FacadeModule["definePluginEntry"]; +export const definePluginEntry: FacadeModule["definePluginEntry"] = ((...args) => + loadFacadeModule()["definePluginEntry"](...args)) as FacadeModule["definePluginEntry"]; export const ensureBrowserControlAuth: FacadeModule["ensureBrowserControlAuth"] = ((...args) => loadFacadeModule()["ensureBrowserControlAuth"]( ...args, diff --git a/src/plugin-sdk/irc-surface.ts b/src/plugin-sdk/irc-surface.ts index 67fefb57f4d..b7173c32128 100644 --- a/src/plugin-sdk/irc-surface.ts +++ b/src/plugin-sdk/irc-surface.ts @@ -19,12 +19,11 @@ export const ircSetupAdapter: FacadeModule["ircSetupAdapter"] = createLazyFacade export const ircSetupWizard: FacadeModule["ircSetupWizard"] = createLazyFacadeObjectValue( () => loadFacadeModule()["ircSetupWizard"] as object, ) as FacadeModule["ircSetupWizard"]; -export const listIrcAccountIds: FacadeModule["listIrcAccountIds"] = createLazyFacadeObjectValue( - () => loadFacadeModule()["listIrcAccountIds"] as object, -) as FacadeModule["listIrcAccountIds"]; -export const resolveDefaultIrcAccountId: FacadeModule["resolveDefaultIrcAccountId"] = - createLazyFacadeObjectValue( - () => loadFacadeModule()["resolveDefaultIrcAccountId"] as object, - ) as FacadeModule["resolveDefaultIrcAccountId"]; +export const listIrcAccountIds: FacadeModule["listIrcAccountIds"] = ((...args) => + loadFacadeModule()["listIrcAccountIds"](...args)) as FacadeModule["listIrcAccountIds"]; +export const resolveDefaultIrcAccountId: FacadeModule["resolveDefaultIrcAccountId"] = ((...args) => + loadFacadeModule()["resolveDefaultIrcAccountId"]( + ...args, + )) as FacadeModule["resolveDefaultIrcAccountId"]; export const resolveIrcAccount: FacadeModule["resolveIrcAccount"] = ((...args) => loadFacadeModule()["resolveIrcAccount"](...args)) as FacadeModule["resolveIrcAccount"]; diff --git a/src/plugin-sdk/signal-surface.ts b/src/plugin-sdk/signal-surface.ts index 6e66c8bfe2e..ebe27e06299 100644 --- a/src/plugin-sdk/signal-surface.ts +++ b/src/plugin-sdk/signal-surface.ts @@ -19,20 +19,20 @@ export const listEnabledSignalAccounts: FacadeModule["listEnabledSignalAccounts" loadFacadeModule()["listEnabledSignalAccounts"]( ...args, )) as FacadeModule["listEnabledSignalAccounts"]; -export const listSignalAccountIds: FacadeModule["listSignalAccountIds"] = - createLazyFacadeObjectValue( - () => loadFacadeModule()["listSignalAccountIds"] as object, - ) as FacadeModule["listSignalAccountIds"]; +export const listSignalAccountIds: FacadeModule["listSignalAccountIds"] = ((...args) => + loadFacadeModule()["listSignalAccountIds"](...args)) as FacadeModule["listSignalAccountIds"]; export const monitorSignalProvider: FacadeModule["monitorSignalProvider"] = ((...args) => loadFacadeModule()["monitorSignalProvider"](...args)) as FacadeModule["monitorSignalProvider"]; export const probeSignal: FacadeModule["probeSignal"] = ((...args) => loadFacadeModule()["probeSignal"](...args)) as FacadeModule["probeSignal"]; export const removeReactionSignal: FacadeModule["removeReactionSignal"] = ((...args) => loadFacadeModule()["removeReactionSignal"](...args)) as FacadeModule["removeReactionSignal"]; -export const resolveDefaultSignalAccountId: FacadeModule["resolveDefaultSignalAccountId"] = - createLazyFacadeObjectValue( - () => loadFacadeModule()["resolveDefaultSignalAccountId"] as object, - ) as FacadeModule["resolveDefaultSignalAccountId"]; +export const resolveDefaultSignalAccountId: FacadeModule["resolveDefaultSignalAccountId"] = (( + ...args +) => + loadFacadeModule()["resolveDefaultSignalAccountId"]( + ...args, + )) as FacadeModule["resolveDefaultSignalAccountId"]; export const resolveSignalReactionLevel: FacadeModule["resolveSignalReactionLevel"] = ((...args) => loadFacadeModule()["resolveSignalReactionLevel"]( ...args, diff --git a/src/plugin-sdk/telegram-surface.ts b/src/plugin-sdk/telegram-surface.ts index 3d0fa9356a5..0db7850582e 100644 --- a/src/plugin-sdk/telegram-surface.ts +++ b/src/plugin-sdk/telegram-surface.ts @@ -2,10 +2,7 @@ import type { PluginSdkFacadeTypeMap } from "../generated/plugin-sdk-facade-type-map.generated.js"; type FacadeEntry = PluginSdkFacadeTypeMap["telegram-surface"]; type FacadeModule = FacadeEntry["module"]; -import { - createLazyFacadeObjectValue, - loadBundledPluginPublicSurfaceModuleSync, -} from "./facade-runtime.js"; +import { loadBundledPluginPublicSurfaceModuleSync } from "./facade-runtime.js"; function loadFacadeModule(): FacadeModule { return loadBundledPluginPublicSurfaceModuleSync({ @@ -63,13 +60,15 @@ export const isTelegramExecApprovalTargetRecipient: FacadeModule["isTelegramExec export const listTelegramAccountIds: FacadeModule["listTelegramAccountIds"] = ((...args) => loadFacadeModule()["listTelegramAccountIds"](...args)) as FacadeModule["listTelegramAccountIds"]; export const listTelegramDirectoryGroupsFromConfig: FacadeModule["listTelegramDirectoryGroupsFromConfig"] = - createLazyFacadeObjectValue( - () => loadFacadeModule()["listTelegramDirectoryGroupsFromConfig"] as object, - ) as FacadeModule["listTelegramDirectoryGroupsFromConfig"]; + ((...args) => + loadFacadeModule()["listTelegramDirectoryGroupsFromConfig"]( + ...args, + )) as FacadeModule["listTelegramDirectoryGroupsFromConfig"]; export const listTelegramDirectoryPeersFromConfig: FacadeModule["listTelegramDirectoryPeersFromConfig"] = - createLazyFacadeObjectValue( - () => loadFacadeModule()["listTelegramDirectoryPeersFromConfig"] as object, - ) as FacadeModule["listTelegramDirectoryPeersFromConfig"]; + ((...args) => + loadFacadeModule()["listTelegramDirectoryPeersFromConfig"]( + ...args, + )) as FacadeModule["listTelegramDirectoryPeersFromConfig"]; export const looksLikeTelegramTargetId: FacadeModule["looksLikeTelegramTargetId"] = ((...args) => loadFacadeModule()["looksLikeTelegramTargetId"]( ...args,