import { buildMessagingTarget, ensureTargetId, parseTargetMention, parseTargetPrefixes, requireTargetKind, type MessagingTarget, type MessagingTargetKind, type MessagingTargetParseOptions, } from "../channels/targets.js"; export type SlackTargetKind = MessagingTargetKind; export type SlackTarget = MessagingTarget; type SlackTargetParseOptions = MessagingTargetParseOptions; export function parseSlackTarget( raw: string, options: SlackTargetParseOptions = {}, ): SlackTarget | undefined { const trimmed = raw.trim(); if (!trimmed) { return undefined; } const mentionTarget = parseTargetMention({ raw: trimmed, mentionPattern: /^<@([A-Z0-9]+)>$/i, kind: "user", }); if (mentionTarget) { return mentionTarget; } const prefixedTarget = parseTargetPrefixes({ raw: trimmed, prefixes: [ { prefix: "user:", kind: "user" }, { prefix: "channel:", kind: "channel" }, { prefix: "slack:", kind: "user" }, ], }); if (prefixedTarget) { return prefixedTarget; } if (trimmed.startsWith("@")) { const candidate = trimmed.slice(1).trim(); const id = ensureTargetId({ candidate, pattern: /^[A-Z0-9]+$/i, errorMessage: "Slack DMs require a user id (use user: or <@id>)", }); return buildMessagingTarget("user", id, trimmed); } if (trimmed.startsWith("#")) { const candidate = trimmed.slice(1).trim(); const id = ensureTargetId({ candidate, pattern: /^[A-Z0-9]+$/i, errorMessage: "Slack channels require a channel id (use channel:)", }); return buildMessagingTarget("channel", id, trimmed); } if (options.defaultKind) { return buildMessagingTarget(options.defaultKind, trimmed, trimmed); } return buildMessagingTarget("channel", trimmed, trimmed); } export function resolveSlackChannelId(raw: string): string { const target = parseSlackTarget(raw, { defaultKind: "channel" }); return requireTargetKind({ platform: "Slack", target, kind: "channel" }); }