{"version":3,"file":"discord.mjs","names":[],"sources":["../../src/publishers/discord.ts"],"sourcesContent":["import type { Announcement, Publisher, ReleaseNotesLogger } from \"../shared/types\"\n\nconst DISCORD_DESCRIPTION_LIMIT = 4096\nconst TRUNCATION_SUFFIX = \"\\n\\n[...truncated...]\"\n\nfunction clampDescription(description: string) {\n  if (description.length <= DISCORD_DESCRIPTION_LIMIT) return description\n  return `${description.slice(0, DISCORD_DESCRIPTION_LIMIT - TRUNCATION_SUFFIX.length)}${TRUNCATION_SUFFIX}`\n}\n\nexport async function publishDiscordAnnouncement({\n  webhookUrl,\n  announcement,\n  branchName,\n  dryRun,\n  logger,\n  fetchImpl = fetch,\n}: {\n  webhookUrl: string\n  announcement: Announcement\n  branchName: string\n  dryRun: boolean\n  logger: ReleaseNotesLogger\n  fetchImpl?: typeof fetch\n}) {\n  if (!(announcement.title.trim() && announcement.description.trim())) {\n    logger.log(\"Skipping Discord release message because the AI output was empty\")\n    return { sent: false as const, reason: \"empty-output\" as const }\n  }\n\n  const payload = {\n    embeds: [\n      {\n        title: announcement.title,\n        description: clampDescription(announcement.description),\n        color: branchName === \"main\" ? 0x0099ff : 0x808080,\n      },\n    ],\n  }\n\n  if (dryRun) {\n    logger.log(`Dry run enabled; would send Discord release message: ${JSON.stringify(payload)}`)\n    return { sent: false as const, reason: \"dry-run\" as const }\n  }\n\n  const response = await fetchImpl(webhookUrl, {\n    method: \"POST\",\n    headers: {\n      \"content-type\": \"application/json\",\n    },\n    body: JSON.stringify(payload),\n  })\n\n  if (!response.ok) {\n    const body = await response.text()\n    throw new Error(`Discord webhook failed: ${response.status} ${body}`)\n  }\n\n  logger.log(\"Sent Discord release message\")\n  return { sent: true as const }\n}\n\nexport function createDiscordPublisher({\n  webhookUrl,\n  fetchImpl,\n}: {\n  webhookUrl: string\n  fetchImpl?: typeof fetch\n}): Publisher {\n  return {\n    name: \"discord\",\n    publish(input) {\n      return publishDiscordAnnouncement({\n        webhookUrl,\n        announcement: input.announcement,\n        branchName: input.branchName,\n        dryRun: input.dryRun,\n        logger: input.logger,\n        fetchImpl,\n      })\n    },\n  }\n}\n"],"mappings":";AAEA,MAAM,4BAA4B;AAClC,MAAM,oBAAoB;AAE1B,SAAS,iBAAiB,aAAqB;CAC7C,IAAI,YAAY,UAAU,2BAA2B,OAAO;CAC5D,OAAO,GAAG,YAAY,MAAM,GAAG,IAAoD,IAAI;AACzF;AAEA,eAAsB,2BAA2B,EAC/C,YACA,cACA,YACA,QACA,QACA,YAAY,SAQX;CACD,IAAI,EAAE,aAAa,MAAM,KAAK,KAAK,aAAa,YAAY,KAAK,IAAI;EACnE,OAAO,IAAI,kEAAkE;EAC7E,OAAO;GAAE,MAAM;GAAgB,QAAQ;EAAwB;CACjE;CAEA,MAAM,UAAU,EACd,QAAQ,CACN;EACE,OAAO,aAAa;EACpB,aAAa,iBAAiB,aAAa,WAAW;EACtD,OAAO,eAAe,SAAS,QAAW;CAC5C,CACF,EACF;CAEA,IAAI,QAAQ;EACV,OAAO,IAAI,wDAAwD,KAAK,UAAU,OAAO,GAAG;EAC5F,OAAO;GAAE,MAAM;GAAgB,QAAQ;EAAmB;CAC5D;CAEA,MAAM,WAAW,MAAM,UAAU,YAAY;EAC3C,QAAQ;EACR,SAAS,EACP,gBAAgB,mBAClB;EACA,MAAM,KAAK,UAAU,OAAO;CAC9B,CAAC;CAED,IAAI,CAAC,SAAS,IAAI;EAChB,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,MAAM,IAAI,MAAM,2BAA2B,SAAS,OAAO,GAAG,MAAM;CACtE;CAEA,OAAO,IAAI,8BAA8B;CACzC,OAAO,EAAE,MAAM,KAAc;AAC/B;AAEA,SAAgB,uBAAuB,EACrC,YACA,aAIY;CACZ,OAAO;EACL,MAAM;EACN,QAAQ,OAAO;GACb,OAAO,2BAA2B;IAChC;IACA,cAAc,MAAM;IACpB,YAAY,MAAM;IAClB,QAAQ,MAAM;IACd,QAAQ,MAAM;IACd;GACF,CAAC;EACH;CACF;AACF"}