import { AnyObject, CommonLogger } from '@naturalcycles/js-lib'; import { InspectAnyOptions } from '..'; /** * Properties that exists both in SlackApiBody (as per Slack API) and SlackMessage (our abstraction). */ export interface SlackMessageProps { /** * @default bot */ username?: string; channel?: string; icon_url?: string; /** * @default :spider_web: */ icon_emoji?: string; attachments?: SlackMessageAttachment[]; } export interface SlackApiBody extends SlackMessageProps { text: string; } export interface SlackMessage extends SlackMessageProps { /** * The only *required* field. * * You can throw anything at it, it'll handle it appropriately: * String - as is * Object - pass via util.inspect() * Array - will pass each item via util.inspect() and join with \n * Error - print the stack nicely * * If you don't want the default Array behavior - you can pre-util.inspect() it yourself to your liking. */ items: any; /** * Optional "context object", to be used by `messagePrefixHook`. */ ctx?: CTX; /** * Keys-values will be rendered as MessageAttachment with Fields */ kv?: AnyObject; /** * If specified - adds @name1, @name2 in the end of the message */ mentions?: string[]; /** * By default it ignores possible errors from slack * * @default false */ throwOnError?: boolean; } export interface SlackAttachmentField { title: string; value: string; short?: boolean; } export interface SlackMessageAttachment { fallback?: string; color?: 'good' | 'warning' | 'danger' | string; pretext?: string; author_name?: string; author_link?: string; author_icon?: string; title?: string; title_link?: string; text?: string; fields?: SlackAttachmentField[]; image_url?: string; thumb_url?: string; footer?: string; footer_icon?: string; ts?: number; callback_id?: string; mrkdwn_in?: ('pretext' | 'text' | 'fields')[]; } /** * Return `null` to skip (filter out) the message completely. */ export declare type SlackMessagePrefixHook = (msg: SlackMessage) => string[] | null | Promise; export interface SlackServiceCfg { /** * Undefined means slack is disabled. */ webhookUrl?: string; defaults?: Partial; /** * Function to return an array of "prefix tokens" (will be joined by ': '). * Allows to skip (filter out) the message by returning `null`. */ messagePrefixHook: SlackMessagePrefixHook; /** * By default SlackService logs every message to console.log * Pass another logger if needed. * Pass `noopLogger` to suppress logging completely. */ logger: CommonLogger; /** * Defaults to: * includeErrorData: true * includeErrorStack: true */ inspectOptions: InspectAnyOptions; }