{"version":3,"file":"release.mjs","names":[],"sources":["../src/release.ts"],"sourcesContent":["import { buildPrompt, generateAnnouncement } from \"./ai\"\nimport { collectReleaseContext } from \"./git\"\nimport { createDiscordPublisher } from \"./publishers/discord\"\nimport { createSlackPublisher } from \"./publishers/slack\"\nimport type { Publisher, PublisherResult, ReleaseInput, ResolvedConfig } from \"./shared/types\"\n\nfunction createPublishers(config: ResolvedConfig): Publisher[] {\n  const publishers: Publisher[] = []\n\n  if (config.discordWebhookUrl) {\n    publishers.push(createDiscordPublisher({ webhookUrl: config.discordWebhookUrl }))\n  }\n\n  if (config.slackWebhookUrl) {\n    publishers.push(createSlackPublisher({ webhookUrl: config.slackWebhookUrl }))\n  }\n\n  if (publishers.length === 0 && config.dryRun) {\n    publishers.push(createDiscordPublisher({ webhookUrl: \"dry-run\" }))\n  }\n\n  return publishers\n}\n\nfunction combinePublisherResults(results: PublisherResult[]) {\n  if (results.some((result) => result.sent)) return { sent: true as const }\n\n  return results[0] ?? { sent: false as const, reason: \"empty-output\" as const }\n}\n\nexport async function sendReleaseNotesForRange(input: ReleaseInput) {\n  if (!input.config.branches.includes(input.branchName)) {\n    input.logger.log(`Skipping release message for unsupported branch ${input.branchName}`)\n    return { sent: false as const, reason: \"unsupported-branch\" as const }\n  }\n\n  const context = await collectReleaseContext({\n    from: input.from,\n    to: input.to,\n    config: input.config,\n  })\n\n  input.logger.log(`Generating AI release notes for diff between ${input.from} and ${input.to}`)\n  input.logger.log(`Changed files: ${context.changedFiles.length}`)\n  input.logger.log(`Patch length: ${context.patch.length}`)\n\n  const prompt = buildPrompt({\n    version: input.version,\n    releaseNotes: input.releaseNotes,\n    diffStat: context.diffStat,\n    commitList: context.commitList,\n    changedFiles: context.changedFiles,\n    patch: context.patch,\n  })\n\n  const announcement = await generateAnnouncement({\n    gatewayApiKey: input.config.gatewayApiKey,\n    model: input.config.model,\n    prompt,\n    systemPrompt: input.config.prompt,\n    logger: input.logger,\n  })\n\n  const publishers = createPublishers(input.config)\n  const results = await Promise.all(\n    publishers.map((publisher) =>\n      publisher.publish({\n        announcement,\n        branchName: input.branchName,\n        version: input.version,\n        dryRun: input.config.dryRun,\n        logger: input.logger,\n      }),\n    ),\n  )\n\n  return combinePublisherResults(results)\n}\n"],"mappings":";;;;;AAMA,SAAS,iBAAiB,QAAqC;CAC7D,MAAM,aAA0B,CAAC;CAEjC,IAAI,OAAO,mBACT,WAAW,KAAK,uBAAuB,EAAE,YAAY,OAAO,kBAAkB,CAAC,CAAC;CAGlF,IAAI,OAAO,iBACT,WAAW,KAAK,qBAAqB,EAAE,YAAY,OAAO,gBAAgB,CAAC,CAAC;CAG9E,IAAI,WAAW,WAAW,KAAK,OAAO,QACpC,WAAW,KAAK,uBAAuB,EAAE,YAAY,UAAU,CAAC,CAAC;CAGnE,OAAO;AACT;AAEA,SAAS,wBAAwB,SAA4B;CAC3D,IAAI,QAAQ,MAAM,WAAW,OAAO,IAAI,GAAG,OAAO,EAAE,MAAM,KAAc;CAExE,OAAO,QAAQ,MAAM;EAAE,MAAM;EAAgB,QAAQ;CAAwB;AAC/E;AAEA,eAAsB,yBAAyB,OAAqB;CAClE,IAAI,CAAC,MAAM,OAAO,SAAS,SAAS,MAAM,UAAU,GAAG;EACrD,MAAM,OAAO,IAAI,mDAAmD,MAAM,YAAY;EACtF,OAAO;GAAE,MAAM;GAAgB,QAAQ;EAA8B;CACvE;CAEA,MAAM,UAAU,MAAM,sBAAsB;EAC1C,MAAM,MAAM;EACZ,IAAI,MAAM;EACV,QAAQ,MAAM;CAChB,CAAC;CAED,MAAM,OAAO,IAAI,gDAAgD,MAAM,KAAK,OAAO,MAAM,IAAI;CAC7F,MAAM,OAAO,IAAI,kBAAkB,QAAQ,aAAa,QAAQ;CAChE,MAAM,OAAO,IAAI,iBAAiB,QAAQ,MAAM,QAAQ;CAExD,MAAM,SAAS,YAAY;EACzB,SAAS,MAAM;EACf,cAAc,MAAM;EACpB,UAAU,QAAQ;EAClB,YAAY,QAAQ;EACpB,cAAc,QAAQ;EACtB,OAAO,QAAQ;CACjB,CAAC;CAED,MAAM,eAAe,MAAM,qBAAqB;EAC9C,eAAe,MAAM,OAAO;EAC5B,OAAO,MAAM,OAAO;EACpB;EACA,cAAc,MAAM,OAAO;EAC3B,QAAQ,MAAM;CAChB,CAAC;CAED,MAAM,aAAa,iBAAiB,MAAM,MAAM;CAahD,OAAO,wBAAwB,MAZT,QAAQ,IAC5B,WAAW,KAAK,cACd,UAAU,QAAQ;EAChB;EACA,YAAY,MAAM;EAClB,SAAS,MAAM;EACf,QAAQ,MAAM,OAAO;EACrB,QAAQ,MAAM;CAChB,CAAC,CACH,CACF,CAEsC;AACxC"}