From 5b8007784bb6623b2c1aa047e2c7781684af88ad Mon Sep 17 00:00:00 2001 From: SocialNerd42069 <118244303+SocialNerd42069@users.noreply.github.com> Date: Tue, 20 Jan 2026 19:44:12 -0600 Subject: [PATCH] fix(slack): handle Bolt ESM/CJS import for Node 25.x The slackBoltModule.default points to App class directly on Node 25.x, not the module object. Check for App property first before using default. --- src/slack/monitor/provider.ts | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/src/slack/monitor/provider.ts b/src/slack/monitor/provider.ts index 3cdb0f2de..2583eb7ba 100644 --- a/src/slack/monitor/provider.ts +++ b/src/slack/monitor/provider.ts @@ -1,6 +1,6 @@ import type { IncomingMessage, ServerResponse } from "node:http"; -import SlackBoltDefault, * as SlackBoltModule from "@slack/bolt"; +import SlackBolt from "@slack/bolt"; import { resolveTextChunkLimit } from "../../auto-reply/chunk.js"; import { DEFAULT_GROUP_HISTORY_LIMIT } from "../../auto-reply/reply/history.js"; @@ -26,24 +26,14 @@ import { normalizeAllowList } from "./allow-list.js"; import type { MonitorSlackOpts } from "./types.js"; -type SlackBoltNamespace = typeof import("@slack/bolt"); -type SlackBoltDefault = SlackBoltNamespace | SlackBoltNamespace["App"]; - -const slackBoltDefaultImport = SlackBoltDefault as SlackBoltDefault | undefined; -const slackBoltModuleDefault = (SlackBoltModule as { default?: SlackBoltDefault }).default; -const slackBoltDefault = slackBoltDefaultImport ?? slackBoltModuleDefault; -const slackBoltNamespace = - typeof slackBoltDefault === "object" && slackBoltDefault - ? (slackBoltDefault as SlackBoltNamespace) - : typeof slackBoltModuleDefault === "object" && slackBoltModuleDefault - ? (slackBoltModuleDefault as SlackBoltNamespace) - : undefined; -// Bun allows named imports from CJS; Node ESM doesn't. Resolve default/module shapes for compatibility. -const App = ((typeof slackBoltDefault === "function" ? slackBoltDefault : undefined) ?? - slackBoltNamespace?.App ?? - SlackBoltModule.App) as SlackBoltNamespace["App"]; -const HTTPReceiver = (slackBoltNamespace?.HTTPReceiver ?? - SlackBoltModule.HTTPReceiver) as SlackBoltNamespace["HTTPReceiver"]; +const slackBoltModule = SlackBolt as typeof import("@slack/bolt") & { + default?: typeof import("@slack/bolt"); +}; +// Bun allows named imports from CJS; Node ESM doesn't. Use default+fallback for compatibility. +// Fix: Check if module has App property directly (Node 25.x ESM/CJS compat issue) +const slackBolt = + (slackBoltModule.App ? slackBoltModule : slackBoltModule.default) ?? slackBoltModule; +const { App, HTTPReceiver } = slackBolt; function parseApiAppIdFromAppToken(raw?: string) { const token = raw?.trim(); if (!token) return undefined; @@ -133,13 +123,6 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) { const mediaMaxBytes = (opts.mediaMaxMb ?? slackCfg.mediaMaxMb ?? 20) * 1024 * 1024; const removeAckAfterReply = cfg.messages?.removeAckAfterReply ?? false; - if (!App) { - throw new Error("Slack Bolt App export missing; check @slack/bolt installation."); - } - if (slackMode === "http" && !HTTPReceiver) { - throw new Error("Slack Bolt HTTPReceiver export missing; check @slack/bolt installation."); - } - const receiver = slackMode === "http" ? new HTTPReceiver({