git-pr-ai
Version:
A tool to automatically extract JIRA ticket numbers from branch names and create GitHub/GitLab PRs
74 lines (72 loc) • 2.71 kB
JavaScript
import { loadConfig } from "./config-BqoKKiEi.js";
//#region src/jira.ts
function extractJiraTicket(branchName) {
const jiraPattern = /([A-Z0-9]+-\d+)/;
const match = branchName.match(jiraPattern);
if (!match) {
console.log("ℹ️ No JIRA ticket found in branch name, proceeding without it");
return null;
}
return match[1];
}
function createJiraApiUrl(baseUrl, ticketKey) {
return `${baseUrl}/rest/api/3/issue/${ticketKey}?fields=summary,description,issuetype,priority,status,assignee,labels`;
}
function createJiraAuthHeader(email, apiToken) {
return Buffer.from(`${email}:${apiToken}`).toString("base64");
}
async function fetchJiraTicketData(url, authHeader) {
const response = await fetch(url, { headers: {
Authorization: `Basic ${authHeader}`,
Accept: "application/json"
} });
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
return data;
}
async function getJiraTicketTitle(ticketKey) {
const config = await loadConfig();
if (!config.jira) {
console.log("ℹ️ No JIRA configuration found, using ticket key only");
return null;
}
try {
const { baseUrl, email, apiToken } = config.jira;
const apiUrl = createJiraApiUrl(baseUrl, ticketKey);
const authHeader = createJiraAuthHeader(email, apiToken);
const data = await fetchJiraTicketData(apiUrl, authHeader);
return data.fields.summary ?? null;
} catch (error) {
console.warn(`⚠️ Error fetching JIRA ticket ${ticketKey}:`, error instanceof Error ? error.message : String(error));
return null;
}
}
async function getJiraTicketDetails(ticketKey) {
const config = await loadConfig();
if (!config.jira) {
console.log("ℹ️ No JIRA configuration found");
return null;
}
try {
const { baseUrl, email, apiToken } = config.jira;
const apiUrl = createJiraApiUrl(baseUrl, ticketKey);
const authHeader = createJiraAuthHeader(email, apiToken);
const data = await fetchJiraTicketData(apiUrl, authHeader);
return {
key: ticketKey,
summary: data.fields.summary || "",
description: (typeof data.fields.description === "string" ? data.fields.description : data.fields.description?.content?.[0]?.content?.[0]?.text) || "",
issueType: data.fields.issuetype?.name || "",
priority: data.fields.priority?.name || "",
status: data.fields.status?.name || "",
assignee: data.fields.assignee?.displayName,
labels: data.fields.labels?.map((label) => String(label)) || []
};
} catch (error) {
console.warn(`⚠️ Error fetching JIRA ticket ${ticketKey}:`, error instanceof Error ? error.message : String(error));
return null;
}
}
//#endregion
export { extractJiraTicket, getJiraTicketDetails, getJiraTicketTitle };