{"version":3,"file":"index.mjs","sources":["../src/api/github.ts","../src/api/jira.ts","../src/api/slack.ts","../src/util/dry_run.ts","../src/services/branch.ts","../src/services/issue.ts","../src/services/jira.ts","../src/services/project.ts","../src/services/pull_request.ts","../src/services/slack.ts"],"sourcesContent":["import {GitHubComment, GitHubIssue, Label, Toolkit} from \"../types\";\n\nexport async function closeIssue(toolkit: Toolkit, issueId: string, reason: string = \"NOT_PLANNED\") {\n    const res = await toolkit.github.graphql(/* GraphQL */ `\n        mutation closeIssue($issueId: ID!, $reason: IssueClosedStateReason!) {\n            closeIssue(input: {\n                issueId: $issueId,\n                stateReason: $reason,\n            }) {\n                clientMutationId\n            }\n        }\n    `,\n        {\n            issueId: issueId,\n            reason: reason\n        }\n    );\n\n    toolkit.core.debug(`closeIssue response: ${JSON.stringify(res)}`);\n}\n\nexport async function closePullRequest(toolkit: Toolkit, pullRequestId: string) {\n    const res = await toolkit.github.graphql(/* GraphQL */ `\n        mutation closeIssue($pullRequestId: ID!) {\n            closePullRequest(input: {\n                pullRequestId: $pullRequestId\n            }) {\n                clientMutationId\n            }\n        }\n    `,\n        {\n            pullRequestId: pullRequestId\n        }\n    );\n\n    toolkit.core.debug(`closePullRequest response: ${JSON.stringify(res)}`);\n}\n\nexport async function getLabelByName(toolkit: Toolkit, repository: string, labelName: string) {\n    const res = await toolkit.github.graphql<{\n        repository: {\n            label?: Label\n        }\n    }>(/* GraphQL */ `\n        query getLabelId($repository: String!, $labelName: String!) {\n            repository(owner: \"shopware\", name: $repository) {\n                label(name: $labelName) {\n                    id\n                    name\n                    url\n                    description\n                    color\n                }\n            }\n        }\n    `,\n        {\n            repository: repository,\n            labelName: labelName\n        });\n\n    return res.repository.label;\n}\n\nexport async function addLabelToLabelable(toolkit: Toolkit, labelId: string, labelableId: string) {\n    const res = await toolkit.github.graphql<{\n        clientMutationId: string\n    }>(/* GraphQL */ `\n        mutation addLabels($labelId: ID!, $labelableId: ID!) {\n            addLabelsToLabelable(input: {\n                labelIds: [$labelId],\n                labelableId: $labelableId\n            }) {\n                clientMutationId\n            }\n        }\n    `,\n        {\n            labelId: labelId,\n            labelableId: labelableId\n        }\n    );\n\n    toolkit.core.debug(`addLabelToIssue response: ${JSON.stringify(res)}`);\n}\n\nexport async function findIssueWithProjectItems(toolkit: Toolkit, number: number) {\n    const res = await toolkit.github.graphql<{\n        repository: {\n            issue: {\n                projectItems: {\n                    nodes: [{\n                        id: string,\n                        project: { number: number },\n                        fieldValueByName: { name: string },\n                    }]\n                },\n                id: string,\n                number: number,\n            }\n        }\n    }>(/* GraphQL */ `\n        query findIssueWithProjectItems($number: Int!) {\n            repository(owner: \"shopware\", name: \"shopware\") {\n                issue(number: $number) {\n                    projectItems(first: 20) {\n                        nodes {\n                            id\n                            project {\n                                number\n                            }\n                            fieldValueByName(name: \"Status\") {\n                                ... on ProjectV2ItemFieldSingleSelectValue {\n                                    name\n                                }\n                            }\n                        }\n                    }\n                    id\n                    number\n                }\n            }\n        }\n    `,\n        {\n            number,\n        }\n    )\n\n    toolkit.core.debug(`findIssueInProject response: ${JSON.stringify(res)}`)\n\n    return {\n        node_id: res.repository.issue.id,\n        number: res.repository.issue.number,\n        projectItems: res.repository.issue.projectItems.nodes,\n    }\n}\n\nexport async function findPRWithProjectItems(toolkit: Toolkit, number: number) {\n    const res = await toolkit.github.graphql<{\n        repository: {\n            pullRequest: {\n                projectItems: {\n                    nodes: [{\n                        project: { number: number },\n                        fieldValueByName: { name: string },\n                    }]\n                },\n                id: string,\n                number: number,\n            }\n        }\n    }>(/* GraphQL */ `\n        query findPRWithProjectItems($number: Int!) {\n            repository(owner: \"shopware\", name: \"shopware\") {\n                pullRequest(number: $number) {\n                    projectItems(first: 20) {\n                        nodes {\n                            project {\n                                number\n                            }\n                            fieldValueByName(name: \"Status\") {\n                                ... on ProjectV2ItemFieldSingleSelectValue {\n                                    name\n                                }\n                            }\n                        }\n                    }\n                    id\n                    number\n                }\n            }\n        }\n    `,\n        {\n            number,\n        }\n    )\n\n    toolkit.core.debug(`findIssueInProject response: ${JSON.stringify(res)}`)\n\n    return {\n        node_id: res.repository.pullRequest.id,\n        number: res.repository.pullRequest.number,\n        projectItems: res.repository.pullRequest.projectItems.nodes,\n    }\n}\n\nexport async function setFieldValue(toolkit: Toolkit, data: {\n    projectId: string,\n    itemId: string,\n    fieldId: string,\n    valueId: string\n}) {\n    const res = await toolkit.github.graphql(/* GraphQL */ `\n        mutation setFieldValue($projectId: ID!, $itemId: ID!, $fieldId: ID!, $valueId: String!) {\n            updateProjectV2ItemFieldValue(input: {\n                projectId: $projectId,\n                itemId: $itemId,\n                fieldId: $fieldId,\n                value: {singleSelectOptionId: $valueId}\n            }) {\n                projectV2Item {\n                    id\n                }\n            }\n        }\n    `,\n        data\n    )\n\n    toolkit.core.debug(`setFieldValue response: ${JSON.stringify(res)}`)\n\n    return res\n}\n\nexport async function getProjectInfo(toolkit: Toolkit, data: {\n    number: number,\n    organization?: string\n}) {\n    type getProjectInfo = {\n        organization: {\n            projectV2: {\n                id: string,\n                title: string,\n                fields: {\n                    nodes: [{\n                        id: string,\n                        name: string,\n                        options: [{\n                            id: string,\n                            name: string\n                        }]\n                    }]\n                }\n            }\n        }\n    };\n    const res = await toolkit.github.graphql<getProjectInfo>(/* GraphQL */ `\n        query getProjectInfo($organization: String!, $projectNumber: Int!) {\n            organization(login: $organization) {\n                projectV2(number: $projectNumber) {\n                    id\n                    title\n                    fields(first: 20) {\n                        nodes {\n                            ... on ProjectV2SingleSelectField {\n                                id\n                                name\n                                options {\n                                    id\n                                    name\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    `,\n        {\n            organization: data.organization ?? \"shopware\",\n            projectNumber: data.number,\n        }\n    )\n\n    toolkit.core.debug(`getProjectInfo response: ${JSON.stringify(res)}`)\n\n    const project = res.organization.projectV2\n\n    return {\n        node_id: project.id,\n        title: project.title,\n        fields: project.fields.nodes,\n    }\n}\n\nexport async function addProjectItem(toolkit: Toolkit, data: {\n    projectId: string,\n    issueId: string\n}) {\n    const res = await toolkit.github.graphql<{\n        addProjectV2ItemById: { item: { id: string } }\n    }>(/* GraphQL */ `\n        mutation addProjectItem($projectId: ID!, $contentId: ID!) {\n            addProjectV2ItemById(input: {\n                projectId: $projectId,\n                contentId: $contentId\n            }) {\n                item {\n                    id\n                }\n            }\n        }\n    `,\n        {\n            projectId: data.projectId,\n            contentId: data.issueId\n        }\n    );\n\n    toolkit.core.debug(`addCard response: ${JSON.stringify(res)}`)\n\n    return {\n        node_id: res.addProjectV2ItemById.item.id\n    }\n}\n\n/**\n * getProjectIdByNumber fetches the project ID for a given project number.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param number - The project number to get the ID for.\n * @param organization - The organization name whose projects to consider.\n */\nexport async function getProjectIdByNumber(toolkit: Toolkit, number: number, organization: string | null = \"shopware\") {\n    const res = await toolkit.github.graphql<{\n        organization: {\n            projectV2: {\n                id: string\n            }\n        }\n    }>(/* GraphQL */ `\n        query getProjectIdByNumber($organization: String!, $number: Int!) {\n            organization(login: $organization) {\n                projectV2(number: $number) {\n                    id\n                }\n            }\n        }\n    `,\n        {\n            organization: organization,\n            number: number\n        });\n\n    return res.organization.projectV2.id;\n}\n\n/**\n * getIssuesByProject fetches all issues from a project.\n *\n * @remarks\n * This function uses pagination to fetch all issues from a project.\n * It will keep fetching until all issues are retrieved.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param projectId - The ID of the project to fetch issues from.\n * @param cursor - The cursor for pagination.\n * @param carry - The issues already fetched.\n */\nexport async function getIssuesByProject(toolkit: Toolkit, projectId: string, cursor: string | null = null, carry: GitHubIssue[] | null = null): Promise<GitHubIssue[]> {\n    const res = await toolkit.github.graphql<{\n        node: {\n            items: {\n                pageInfo: {\n                    startCursor: string,\n                    endCursor: string,\n                    hasPreviousPage: boolean,\n                    hasNextPage: boolean\n                },\n                nodes: [{\n                    fieldValueByName: {\n                        name: string\n                    },\n                    content: {\n                        id: string,\n                        title: string,\n                        number: number,\n                        url: string,\n                        issueType?: {\n                            name: string\n                        }\n                    }\n                }]\n            }\n        }\n    }>(/* GraphQL */ `\n        query getIssuesByProject($projectId: ID!, $count: Int, $cursor: String) {\n            node(id: $projectId) {\n                ... on ProjectV2 {\n                    items(first: $count, after: $cursor) {\n                        pageInfo {\n                            startCursor\n                            endCursor\n                            hasPreviousPage\n                            hasNextPage\n                        }\n                        nodes {\n                            fieldValueByName(name: \"Status\") {\n                                ... on ProjectV2ItemFieldSingleSelectValue {\n                                    name\n                                }\n                            }\n                            content {\n                                ... on Issue {\n                                    id\n                                    title\n                                    number\n                                    url\n                                    issueType {\n                                        name\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    `,\n        {\n            projectId,\n            count: 100,\n            cursor: cursor\n        });\n\n    const issues = res.node.items.nodes.map((item) => {\n        return {\n            id: item.content.id,\n            title: item.content.title,\n            number: item.content.number,\n            url: item.content.url,\n            status: item.fieldValueByName?.name,\n            labels: [],\n            type: item.content?.issueType?.name\n        }\n    });\n\n    if (res.node.items.pageInfo.hasNextPage) {\n        return await getIssuesByProject(toolkit, projectId, res.node.items.pageInfo.endCursor, [...issues, ...(carry ?? [])]);\n    } else {\n        return [...issues, ...(carry ?? [])];\n    }\n}\n\n/**\n * getCommentsForIssue fetches all comments for a given issue.\n *\n * @remarks\n * This function uses pagination to fetch all comments for an issue.\n * It will keep fetching until all comments are retrieved.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param issueId - The ID of the issue to fetch comments for.\n * @param cursor - The cursor for pagination.\n * @param carry - The comments already fetched.\n */\nexport async function getCommentsForIssue(toolkit: Toolkit, issueId: string, cursor: string | null = null, carry: GitHubComment[] | null = null) {\n    const res = await toolkit.github.graphql<{\n        node: {\n            comments: {\n                pageInfo: {\n                    startCursor: string,\n                    endCursor: string,\n                    hasPreviousPage: boolean,\n                    hasNextPage: boolean\n                },\n                nodes: GitHubComment[]\n            }\n        }\n    }>(/* GraphQL */ `\n        query getCommentsForIssue($issueId: ID!, $count: Int, $cursor: String) {\n            node(id: $issueId) {\n                ... on Issue {\n                    comments(first: $count, after: $cursor) {\n                        pageInfo {\n                            startCursor\n                            endCursor\n                            hasPreviousPage\n                            hasNextPage\n                        }\n                        nodes {\n                            id\n                            author {\n                                login\n                            }\n                            body\n                        }\n                    }\n                }\n            }\n        }\n    `,\n        {\n            issueId,\n            count: 100,\n            cursor: cursor\n        })\n\n    const comments = res.node.comments.nodes;\n\n    if (res.node.comments.pageInfo.hasNextPage) {\n        return await getCommentsForIssue(toolkit, issueId, res.node.comments.pageInfo.endCursor, [...comments, ...(carry ?? [])]);\n    } else {\n        return [...comments, ...(carry ?? [])];\n    }\n}\n\n/**\n * Gets pull requests matching the given search criteria\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param searchQuery - The GitHub search query to use\n */\nexport async function getPullRequests(toolkit: Toolkit, searchQuery: string) {\n    const pullRequests = await toolkit.github.graphql<\n        {\n            search: {\n                pageInfo: {\n                    startCursor: string,\n                    endCursor: string,\n                    hasPreviousPage: boolean,\n                    hasNextPage: boolean\n                },\n                nodes: [\n                    {\n                        id: string,\n                        title: string,\n                        number: number,\n                        url: string,\n                        repository: {\n                            owner: {\n                                login: string\n                            },\n                            name: string\n                        },\n                        assignees: {\n                            nodes: [{\n                                login: string\n                            }]\n                        },\n                        reviewRequests: {\n                            nodes: [{\n                                requestedReviewer: {\n                                    login?: string,\n                                    name?: string\n                                }\n                            }]\n                        },\n                        closingIssuesReferences: {\n                            nodes: [{\n                                id: string,\n                                title: string,\n                                number: number,\n                                url: string,\n                                repository: {\n                                    owner: {\n                                        login: string\n                                    },\n                                    name: string\n                                }\n                            }]\n                        }\n                    }\n                ]\n            }\n        }\n    >(/* GraphQL */ `\n        query findPullRequests($searchQuery: String!) {\n            search(query: $searchQuery, type: ISSUE, first: 50) {\n                pageInfo {\n                    startCursor\n                    endCursor\n                    hasPreviousPage\n                    hasNextPage\n                }\n                nodes {\n                    ... on PullRequest {\n                        id\n                        title\n                        number\n                        url\n                        repository {\n                            owner {\n                                login\n                            }\n                            name\n                        }\n                        assignees(first: 50) {\n                            nodes {\n                                login\n                            }\n                        }\n                        reviewRequests(first: 50) {\n                            nodes {\n                                requestedReviewer {\n                                    ... on User {\n                                        login\n                                    }\n                                    ... on Team {\n                                        name\n                                    }\n                                }\n                            }\n                        }\n                        closingIssuesReferences(first: 1) {\n                            nodes {\n                                id\n                                title\n                                number\n                                url\n                                repository {\n                                    owner {\n                                        login\n                                    }\n                                    name\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }`,\n        {\n            searchQuery\n        }).then(res => res.search.nodes);\n\n    return pullRequests;\n}\n\nexport async function addComment(toolkit: Toolkit, issueId: string, commentBody: string): Promise<GitHubComment> {\n    const comment = await toolkit.github.graphql<{\n        addComment: {\n            commentEdge: {\n                node: GitHubComment\n            }\n        }\n    }>(/* GraphQL */ `\n        mutation addComment($issueId: ID!, $body: String!) {\n            addComment(input: {\n                subjectId: $issueId,\n                body: $body\n            }) {\n                commentEdge {\n                    node {\n                        id\n                        author {\n                            login\n                        }\n                        body\n                        url\n                    }\n                }\n            }\n        }\n    `,\n        {\n            issueId,\n            body: commentBody\n        }).then(res => res.addComment.commentEdge.node);\n\n    if (!comment || !comment.id) {\n        throw new Error(`Failed to create comment: ${JSON.stringify(comment)}`);\n    }\n\n    return comment;\n}\n\n/**\n * getVerifiedDomainEmails fetches the verified domain emails for a user account associated with an enterprise.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param login - The login of the user.\n * @param organization - The organization name whose verified domains to consider.\n */\nexport async function getVerifiedDomainEmails(toolkit: Toolkit, login: string, organization: string) {\n    const res = await toolkit.github.graphql<{\n        user: {\n            organizationVerifiedDomainEmails: string[]\n        }\n    }>(/* GraphQL */ `\n        query getVerifiedDomainEmails($login: String!, $organization: String!) {\n            user(login: $login) {\n                organizationVerifiedDomainEmails(login: $organization)\n            }\n        }\n    `,\n        {\n            login,\n            organization\n        });\n\n    return res.user.organizationVerifiedDomainEmails;\n}\n","import {Toolkit} from \"../types\";\n\nexport const jiraHost = \"shopware.atlassian.net\";\nexport const jiraBaseUrl = `https://${jiraHost}/rest/api/3`;\n\n/**\n * Makes an API call to JIRA with the provided endpoint and request body.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param endpoint - The JIRA API endpoint to call.\n * @param requestBody - The request body to send with the API call.\n *\n * @return The response from the JIRA API.\n */\nexport async function callJiraApi(toolkit: Toolkit, endpoint: string, requestBody: object) {\n    return await toolkit.fetch(`${jiraBaseUrl}${endpoint}`, {\n        method: 'POST',\n        headers: {\n            'Authorization': `Basic ${Buffer.from(\n                `${process.env.JIRA_USERNAME}:${process.env.JIRA_API_TOKEN}`,\n            ).toString('base64')}`,\n            'Accept': 'application/json',\n            'Content-Type': 'application/json'\n        },\n        body: JSON.stringify(requestBody)\n    }).then(res => res.json());\n}\n","import {WebClient} from '@slack/web-api';\n\nexport class SlackClient {\n    private webClient: WebClient;\n\n    constructor(token: string) {\n        this.webClient = new WebClient(token);\n    }\n\n    async getUserByEmail(email: string): Promise<string | null> {\n        const response = await this.webClient.users.lookupByEmail({email});\n\n        return response.user?.id || null;\n    }\n\n    async sendIMToUser(userId: string, message: string): Promise<void> {\n        await this.webClient.chat.postMessage({\n            channel: userId,\n            text: message,\n            blocks: [\n                {\n                    type: 'markdown',\n                    text: message\n                }\n            ]\n        });\n    }\n}\n","import {Toolkit} from \"../types\";\n\nexport function dontExecuteOnDryRun(toolkit: Toolkit, callback: () => void): void {\n    if (isDryRun()) {\n        toolkit.core.info('Dry run mode is enabled. Skipping execution.');\n        return;\n    }\n\n    callback();\n}\n\nexport function throwOnDryRun(toolkit: Toolkit, msg: string | null = null): void {\n    if (isDryRun()) {\n        if (msg) {\n            toolkit.core.info(msg);\n        }\n\n        throw new Error('Dry run mode is enabled.');\n    }\n}\n\nexport function rejectOnDryRun(toolkit: Toolkit, msg: string | null = null): Promise<string | void> {\n    return new Promise((resolve, reject) => {\n        if (isDryRun()) {\n            if (msg) {\n                toolkit.core.info(msg);\n            }\n\n            reject('Dry run mode is enabled.');\n        } else {\n            resolve();\n        }\n    });\n}\n\nexport function isDryRun(): boolean {\n    return process.env.DRY_RUN === 'true' || process.env.DRY_RUN === '1';\n}\n","import { Toolkit } from \"../types\";\nimport { isDryRun } from \"../util/dry_run\";\n\nexport async function getOldBranches(toolkit: Toolkit, repo: string, excludeRegex: string = \"\", organization: string = \"shopware\"): Promise<string[] | null> {\n    const DAYS_UNTIL_STALE = 6 * 30;\n\n    const regex = new RegExp(excludeRegex);\n\n    toolkit.core.info(`Getting branches for ${organization}/${repo}`);\n\n    const branches = [];\n\n    let currentCursor = null;\n\n    type BranchResponse = {\n        repository: {\n            refs: {\n                pageInfo: {\n                    startCursor: string,\n                    endCursor: string,\n                    hasNextPage: boolean\n                },\n                nodes: Array<{\n                    name: string,\n                    target: {\n                        committedDate: string\n                    },\n                    associatedPullRequests: {\n                        nodes: Array<{\n                            number: number\n                        }>\n                    }\n                }>\n            }\n        }\n    };\n\n    while (true) {\n        const res: BranchResponse = await toolkit.github.graphql<BranchResponse>(/* GraphQL */ `\n            query getBranches(\n              $cursor: String\n              $organization: String!\n              $repository: String!\n            ) {\n              repository(owner: $organization, name: $repository) {\n                refs(first: 100, after: $cursor, refPrefix: \"refs/heads/\") {\n                  pageInfo {\n                    startCursor\n                    endCursor\n                    hasNextPage\n                  }\n                  nodes {\n                    name\n                    target {\n                      ... on Commit {\n                        committedDate\n                      }\n                    }\n                    associatedPullRequests(first: 100) {\n                      nodes {\n                        number\n                      }\n                    }\n                  }\n                }\n              }\n            }\n            `,\n            {\n                cursor: currentCursor,\n                repository: repo,\n                organization: organization\n            });\n\n        branches.push(...res.repository.refs.nodes);\n\n        if (!res.repository.refs.pageInfo.hasNextPage) {\n            break;\n        }\n        currentCursor = res.repository.refs.pageInfo.endCursor;\n    }\n\n    const today = new Date();\n    const cmpDate = new Date(new Date().setDate(today.getDate() - DAYS_UNTIL_STALE));\n\n    const oldBranches: string[] = [];\n\n    for (const branch of branches.filter(x => x.associatedPullRequests.nodes.length == 0)) {\n        if (excludeRegex != \"\" && regex.test(branch.name)) {\n            continue;\n        }\n        const lastUpdate = new Date(branch.target.committedDate);\n\n        if (lastUpdate < cmpDate) {\n\n            oldBranches.push(branch.name);\n\n            toolkit.core.debug(`${branch.name} : ${lastUpdate}`);\n        }\n    }\n\n    return oldBranches;\n}\n\nexport async function cleanupBranches(toolkit: Toolkit, repo: string, organization: string = \"shopware\") {\n    const branches = await getOldBranches(toolkit, repo, organization);\n    if (!branches) {\n        toolkit.core.error(\"No old branches found!\");\n        return;\n    }\n    for (const branch of branches) {\n        if (isDryRun()) {\n            toolkit.core.info(`Would delete ${branch}`);\n            continue;\n        }\n        toolkit.core.info(`Deleting ${branch}...`);\n        toolkit.github.rest.git.deleteRef({\n            owner: organization,\n            repo: repo,\n            ref: branch\n        });\n    }\n}\n","import {\n    GitHubComment,\n    GitHubIssue,\n    Label,\n    Labelable,\n    QueryResponse,\n    Toolkit\n} from \"../types\";\n\nimport {\n    addComment,\n    addLabelToLabelable,\n    findIssueWithProjectItems,\n    findPRWithProjectItems,\n    getCommentsForIssue,\n    getIssuesByProject,\n    getLabelByName,\n    getPullRequests,\n    jiraHost\n} from \"../api\";\n\nexport const docIssueReference = Buffer.from(\"doc-issue-created\").toString(\"base64\");\n\n/**\n * getDevelopmentIssueForPullRequest fetches the development issue linked to a pull request.\n *\n * @remarks\n * This function searches for pull requests in the Shopware organization that match the given head and assignee.\n * It retrieves the first closing issue reference from the matching pull requests.\n * If a matching development issue is found, it returns the issue details; otherwise, it returns null.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param repo - The repository to search in, formatted as \"owner/repo\".\n * @param pullRequestNumber - The number of the pull request to search for.\n * @param pullRequestHead - The head branch of the pull request.\n * @param pullRequestAssignee - The assignee of the pull request.\n */\nexport async function getDevelopmentIssueForPullRequest(toolkit: Toolkit, repo: string, pullRequestNumber: number, pullRequestHead: string, pullRequestAssignee: string): Promise<GitHubIssue | null> {\n    const pullRequests = await getPullRequests(\n        toolkit,\n        `repo:${repo} is:pr assignee:${pullRequestAssignee} head:${pullRequestHead}`\n    );\n\n    const matchingPullRequests = pullRequests.filter(pr => pr.number === pullRequestNumber);\n    const developmentIssue = matchingPullRequests.length > 0 ? matchingPullRequests[0]?.closingIssuesReferences?.nodes[0] : null;\n\n    if (developmentIssue) {\n        return {\n            id: developmentIssue.id,\n            title: developmentIssue.title,\n            number: developmentIssue.number,\n            url: developmentIssue.url,\n            labels: [],\n            owner: developmentIssue.repository.owner.login,\n            repository: developmentIssue.repository.name\n        };\n    } else {\n        toolkit.core.info(`No development issue found for PR #${pullRequestNumber}`);\n        return null;\n    }\n}\n\n/**\n * getEpicsInProgressByProject fetches all epics in progress from a project.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param projectId - The ID of the project to fetch issues from.\n */\nexport async function getEpicsInProgressByProject(toolkit: Toolkit, projectId: string): Promise<GitHubIssue[]> {\n    const res = await getIssuesByProject(toolkit, projectId);\n\n    return res.filter((item) => {\n        return item.status?.toLowerCase() === \"in progress\" && item.type?.toLowerCase() === \"epic\";\n    })\n}\n\n/**\n * createDocIssueComment creates a comment on a GitHub issue that references a documentation issue.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param issueId - The ID of the issue to comment on.\n * @param docIssueKey - The key of the documentation issue to reference.\n * @param content - The comment to add.\n */\nexport async function createDocIssueComment(toolkit: Toolkit, issueId: string, docIssueKey: string, content: string | null = null): Promise<GitHubComment> {\n    const commentBody = `${content ?? \"A documentation Task has been created for this issue:\"} [${docIssueKey}](https://${jiraHost}/browse/${docIssueKey}). <!-- ${docIssueReference} -->`;\n\n    const comment = await addComment(toolkit, issueId, commentBody);\n\n    toolkit.core.info(`Created documentation issue reference comment: ${comment.url}`);\n\n    return comment;\n}\n\n/**\n * hasDocIssueComment checks if a GitHub issue has a comment that references a documentation issue.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param issueId - The ID of the issue to check.\n */\nexport async function hasDocIssueComment(toolkit: Toolkit, issueId: string) {\n    const comments = await getCommentsForIssue(toolkit, issueId);\n\n    for (const comment of comments) {\n        if (referencesDocIssue(comment)) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\n/**\n * referencesDocIssue checks if a comment contains a link to a documentation issue.\n *\n * @param comment - The comment to check.\n */\nexport function referencesDocIssue(comment: GitHubComment) {\n    return comment.body.includes(docIssueReference)\n}\n\nasync function manageNeedsTriageLabel(toolkit: Toolkit, labelable: Labelable, needsTriageLabel: Label, dryRun: boolean) {\n    const labels = labelable.labels.nodes.map((label: {\n        name: string\n    }) => label.name);\n    const hasNeedsTriage = labels.includes(\"needs-triage\");\n    const hasDomainOrServiceLabel = labels.some((label: string) =>\n        label.startsWith(\"domain/\") || label.startsWith(\"service/\")\n    );\n\n    if (hasDomainOrServiceLabel && hasNeedsTriage) {\n        if (dryRun) {\n            toolkit.core.info(`Would remove needs-triage label from #${labelable.number}: ${labelable.title} (has domain/service label)`);\n        } else {\n            await toolkit.github.graphql(/* GraphQL */ `\n                mutation removeLabel($labelableId: ID!, $labelIds: [ID!]!) {\n                    removeLabelsFromLabelable(input: {\n                        labelableId: $labelableId,\n                        labelIds: $labelIds\n                    }) {\n                        clientMutationId\n                    }\n                }\n            `, {\n                labelableId: labelable.id,\n                labelIds: [needsTriageLabel.id]\n            });\n            toolkit.core.info(`Removed needs-triage label from #${labelable.number}: ${labelable.title} (has domain/service label)`);\n        }\n    } else if (!hasNeedsTriage && !hasDomainOrServiceLabel) {\n        if (dryRun) {\n            toolkit.core.info(`Would add needs-triage label to #${labelable.number}: ${labelable.title}`);\n        } else {\n            await addLabelToLabelable(toolkit, needsTriageLabel.id, labelable.id);\n            toolkit.core.info(`Added needs-triage label to #${labelable.number}: ${labelable.title}`);\n        }\n    }\n}\n\n/**\n * Cleans up needs-triage in issues and pull requests\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param dryRun - If true, only log what would be done without making changes.\n *\n * @remarks\n * This function finds all open issues and pull requests and ensures they have either:\n * - The needs-triage label, or\n * - A label starting with 'domain/' or 'service/'\n * - If an item has a `domain/` or `service/` label, remove the `needs-triage` label\n *\n * Closed items are ignored. The function handles pagination to process all items.\n */\nexport async function cleanupNeedsTriage(toolkit: Toolkit, dryRun: boolean = false) {\n    const needsTriageLabel = await getLabelByName(toolkit, \"shopware\", \"needs-triage\");\n    if (!needsTriageLabel) {\n        throw new Error(\"Couldn't find the needs-triage label\");\n    }\n\n    let processedItems = 0;\n\n    // Process issues\n    let hasNextPageIssues = true;\n    let cursorIssues: string | null = null;\n\n    while (hasNextPageIssues) {\n        const res: QueryResponse = await toolkit.github.graphql<QueryResponse>(/* GraphQL */ `\n            query getOpenIssues($cursor: String) {\n                repository(owner: \"shopware\", name: \"shopware\") {\n                    issues(first: 100, after: $cursor, states: OPEN) {\n                        pageInfo {\n                            hasNextPage\n                            endCursor\n                        }\n                        nodes {\n                            id\n                            number\n                            title\n                            labels(first: 20) {\n                                nodes {\n                                    name\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        `, {\n            cursor: cursorIssues\n        });\n\n        const issues = res.repository.issues?.nodes ?? [];\n        hasNextPageIssues = res.repository.issues?.pageInfo.hasNextPage ?? false;\n        cursorIssues = res.repository.issues?.pageInfo.endCursor ?? null;\n\n        for (const item of issues) {\n            await manageNeedsTriageLabel(toolkit, item, needsTriageLabel, dryRun);\n        }\n\n        processedItems += issues.length;\n        toolkit.core.info(`Processed ${processedItems} items so far...`);\n    }\n\n    // Process pull requests\n    let hasNextPagePRs = true;\n    let cursorPRs: string | null = null;\n\n    while (hasNextPagePRs) {\n        const res: QueryResponse = await toolkit.github.graphql<QueryResponse>(/* GraphQL */ `\n            query getOpenPRs($cursor: String) {\n                repository(owner: \"shopware\", name: \"shopware\") {\n                    pullRequests(first: 100, after: $cursor, states: OPEN) {\n                        pageInfo {\n                            hasNextPage\n                            endCursor\n                        }\n                        nodes {\n                            id\n                            number\n                            title\n                            labels(first: 20) {\n                                nodes {\n                                    name\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        `, {\n            cursor: cursorPRs\n        });\n\n        const pullRequests = res.repository.pullRequests?.nodes ?? [];\n        hasNextPagePRs = res.repository.pullRequests?.pageInfo.hasNextPage ?? false;\n        cursorPRs = res.repository.pullRequests?.pageInfo.endCursor ?? null;\n\n        for (const item of pullRequests) {\n            await manageNeedsTriageLabel(toolkit, item, needsTriageLabel, dryRun);\n        }\n\n        processedItems += pullRequests.length;\n        toolkit.core.info(`Processed ${processedItems} items so far...`);\n    }\n\n    toolkit.core.info(`Finished processing ${processedItems} items`);\n}\n\nexport async function findWithProjectItems(toolkit: Toolkit) {\n    if (toolkit.context.payload.issue) {\n        return await findIssueWithProjectItems(toolkit, toolkit.context.payload.issue.number);\n    } else if (toolkit.context.payload.pull_request) {\n        return await findPRWithProjectItems(toolkit, toolkit.context.payload.pull_request.number);\n    } else {\n        throw new Error('only issue and pull_request events are supported');\n    }\n}\n","import {GitHubIssue, JiraIssue, Toolkit} from \"../types\";\nimport {callJiraApi, jiraHost} from \"../api/jira\";\n\n/**\n * createDocumentationTask creates a documentation task in JIRA for a given GitHub issue.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param issue - The issue to create a documentation task for.\n * @param documentationProjectId - The ID of the documentation project.\n * @param description - The description of the documentation task.\n */\nexport async function createDocumentationTask(\n    toolkit: Toolkit,\n    issue: GitHubIssue,\n    documentationProjectId: number | null = 11806,\n    description: string | null = null\n): Promise<JiraIssue> {\n    const requestBody = buildDocumentationTaskRequest(issue, documentationProjectId, description);\n    const docTask = await callJiraApi(toolkit, '/issue', requestBody);\n\n    if (!docTask || !docTask.key) {\n        throw new Error(`Failed to create documentation task: ${JSON.stringify(docTask)}`);\n    }\n\n    toolkit.core.info(`Created documentation task in JIRA: https://${jiraHost}/browse/${docTask.key}`);\n\n    return docTask;\n}\n\n/**\n * Returns the request body for creating a documentation task in JIRA.\n */\nfunction buildDocumentationTaskRequest(issue: GitHubIssue, documentationProjectId: number | null, description: string | null): object {\n    return {\n        fields: {\n            project: {\n                id: documentationProjectId\n            },\n            summary: `${issue.title}`,\n            description: buildDocumentationDescription(issue, description),\n            issuetype: {\n                name: \"Task\",\n            },\n        }\n    };\n}\n\n/**\n * Returns the description for the documentation task using JIRA's document format.\n */\nfunction buildDocumentationDescription(issue: GitHubIssue, description: string | null): object {\n    return {\n        version: 1,\n        type: \"doc\",\n        content: [\n            {\n                type: \"paragraph\",\n                content: [\n                    {\n                        type: \"text\",\n                        text: description ?? `This issue was created automatically.`,\n                    },\n                    {\n                        type: \"text\",\n                        text: `\\n\\nPlease refer to the following links and/or related issues for more information:`,\n                    },\n                ],\n            },\n            {\n                type: \"bulletList\",\n                content: [\n                    {\n                        type: \"listItem\",\n                        content: [\n                            {\n                                type: \"paragraph\",\n                                content: [\n                                    {\n                                        type: \"text\",\n                                        text: issue.url,\n                                        marks: [\n                                            {\n                                                type: \"link\",\n                                                attrs: {\n                                                    href: issue.url,\n                                                },\n                                            },\n                                        ],\n                                    },\n                                ],\n                            },\n                        ],\n                    }\n                ],\n            }\n        ],\n    };\n}\n","import { Label, Toolkit } from \"../types\";\n\nimport {\n    addLabelToLabelable,\n    addProjectItem,\n    closeIssue,\n    findIssueWithProjectItems,\n    getLabelByName,\n    getProjectIdByNumber,\n    getProjectInfo,\n    setFieldValue\n} from \"../api\";\n\nimport {\n    createDocIssueComment, findWithProjectItems,\n    getEpicsInProgressByProject,\n    hasDocIssueComment\n} from \"./issue\";\n\nimport { createDocumentationTask } from \"../index\";\n\n/**\n * Sets the status of issues in projects using the provided toolkit.\n *\n * @param toolkit - The toolkit instance to interact with the project management system.\n * @param props - The properties for setting the status.\n * @param props.toStatus - The status to set the issues to.\n * @param props.fromStatus - (Optional) The status to filter issues by before setting the new status. Can be a string which has to match exactly or an instance of RegExp\n *\n * @remarks\n * This function finds issues in projects and updates their status based on the provided `toStatus`.\n * If `fromStatus` is provided, only issues with the matching status will be updated.\n * If the `toStatus` option is not found in the project's status options, the issue will be skipped.\n *\n * @example\n * ```typescript\n * await setStatusInProjects({ github, context, core, exec, glob, io, fetch }, { toStatus: 'In Progress', fromStatus: 'Done' });\n * ```\n */\nexport async function setStatusInProjects(toolkit: Toolkit, props: {\n    toStatus: string,\n    fromStatus?: string | RegExp\n}) {\n    const issue = await findWithProjectItems(toolkit);\n\n    for (const i in issue.projectItems) {\n        const item = issue.projectItems[i];\n        const projectInfo = await getProjectInfo(toolkit, { number: item.project.number })\n        const statusField = projectInfo.fields.find(field => field.name == \"Status\");\n        const toStatusOption = statusField?.options.find(x => x.name.toLowerCase() === props.toStatus.toLowerCase())\n\n        if (!toStatusOption) {\n            toolkit.core.debug(`Option \"${props.toStatus}\" not found in project ${item.project.number}`)\n            continue;\n        }\n\n        if (props.fromStatus instanceof RegExp) {\n            if (!item.fieldValueByName.name.match(props.fromStatus)) {\n                toolkit.core.debug(`skipping: issue/pr ${issue.number} status ${item.fieldValueByName} did not match ${props.fromStatus} in project ${item.project.number}`);\n                continue;\n            }\n        } else if (props.fromStatus && item.fieldValueByName.name.toLowerCase() !== props.fromStatus.toLowerCase()) {\n            toolkit.core.debug(`skipping: issue/pr ${issue.number} status != ${props.fromStatus} in project ${item.project.number}`)\n            continue;\n        }\n\n        toolkit.core.info(`get item in project ${item.project.number} for issue/pr ${issue.number}`)\n        const itemId = (await addProjectItem(toolkit, {\n            projectId: projectInfo.node_id,\n            issueId: issue.node_id\n        })).node_id\n\n        await setFieldValue(toolkit, {\n            projectId: projectInfo.node_id,\n            itemId,\n            fieldId: statusField!.id,\n            valueId: toStatusOption.id\n        })\n    }\n}\n\nexport async function syncPriorities(toolkit: Toolkit, excludeList: number[] = []) {\n    const issue = toolkit.context.payload.issue!;\n    toolkit.core.debug(`Issue node ID: ${issue.node_id}`);\n    const priorityLabel = issue.labels.find((label: Label) =>\n        label.name.startsWith(\"priority/\")\n    )?.name;\n\n    if (!priorityLabel) {\n        return;\n    }\n    toolkit.core.info(`Found priority label: ${priorityLabel}`);\n\n    const priority = priorityLabel.split('/')[1];\n    toolkit.core.info(`Priority: ${priority}`);\n\n    const issueWithProjectItems = await findIssueWithProjectItems(toolkit, issue.number);\n    for (const projectItem of issueWithProjectItems.projectItems) {\n        if (excludeList.includes(projectItem.project.number)) {\n            toolkit.core.info(`The project number ${projectItem.project.number} is on the excludeList. skipping...`);\n            continue;\n        }\n        const projectInfo = await getProjectInfo(toolkit, { number: projectItem.project.number });\n        const priorityField = projectInfo.fields.find(field => field.name == \"Priority\");\n        if (!priorityField) {\n            toolkit.core.info(`${projectInfo.title} doesn't have a priority field. skipping...`);\n            continue;\n        }\n        const priorityOption = priorityField?.options.find(option => option.name == priority);\n        if (!priorityOption) {\n            toolkit.core.info(`${projectInfo.title} doesn't have the priority option ${priority}. skipping...`);\n            continue;\n        }\n\n        toolkit.core.info(`Setting priority for issue ${issue.number} on ${projectInfo.title} to ${priority}`);\n\n        await setFieldValue(toolkit, {\n            projectId: projectInfo.node_id,\n            itemId: projectItem.id,\n            fieldId: priorityField!.id,\n            valueId: priorityOption.id\n        });\n    }\n}\n\n/**\n * createDocumentationTasksForProjects creates documentation tasks for all projects with the given project numbers.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param projectNumbers - The project numbers to create documentation tasks for.\n * @param organization - The organization name whose projects to consider.\n * @param documentationProjectId - The ID of the documentation project.\n * @param description - Prefix for the description of the documentation task.\n * @param comment - Prefix for the documentation task reference comment.\n */\nexport async function createDocumentationTasksForProjects(toolkit: Toolkit, projectNumbers: number[], organization: string | null = \"shopware\", documentationProjectId: number | null = 11806, description: string | null = null, comment: string | null = null) {\n    for (const projectNumber of projectNumbers) {\n        const projectId = await getProjectIdByNumber(toolkit, projectNumber, organization);\n        const epicsInProgress = await getEpicsInProgressByProject(toolkit, projectId);\n\n        for (const epic of epicsInProgress) {\n            if (await hasDocIssueComment(toolkit, epic.id)) {\n                toolkit.core.info(`Skipping issue ${epic.url} because it already has a documentation issue reference.`);\n\n                continue;\n            }\n\n            const docTask = await createDocumentationTask(toolkit, epic, documentationProjectId, description);\n            await createDocIssueComment(toolkit, epic.id, docTask.key, comment);\n        }\n    }\n}\n\nexport async function markStaleIssues(toolkit: Toolkit, projectNumber: number, dryRun: boolean) {\n    const DAYS_UNTIL_STALE = 180;\n\n    const now = new Date();\n    now.setDate(now.getDate() - DAYS_UNTIL_STALE);\n    const staleDate = now.toISOString().split('T')[0];\n\n    switch (Number(projectNumber)) {\n        case 27: {\n            const query = /* GraphQL */ `\n                query searchClosableIssues {\n                    search(\n                      type: ISSUE\n                      first: 100\n                      query: \"repo:shopware/shopware is:issue state:open project:shopware/27 label:priority/low -label:AboutToClose -label:DoNotClose created:<=$staleDate\"\n                    ) {\n                      pageInfo {\n                        hasNextPage\n                        endCursor\n                      }\n                      edges {\n                        node {\n                          ... on Issue {\n                            id\n                            title\n                            number\n                            url\n                            parent {\n                              issueType {\n                                name\n                              }\n                            }\n                            labels(first: 20) {\n                              nodes {\n                                name\n                              }\n                            }\n                            projectItems(first: 10) {\n                              nodes {\n                                project {\n                                    number\n                                }\n                                fieldValueByName(name: \"Status\") {\n                                  ... on ProjectV2ItemFieldSingleSelectValue {\n                                    name\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n              `;\n\n            type QueryReturn = {\n                search: {\n                    pageInfo: {\n                        hasNextPage: boolean,\n                        endCursor: string\n                    },\n                    edges: [\n                        {\n                            node: {\n                                id: string,\n                                title: string,\n                                number: number,\n                                url: string,\n                                parent?: {\n                                    issueType: {\n                                        name: string\n                                    }\n                                },\n                                labels: {\n                                    nodes: [\n                                        {\n                                            name: string\n                                        }\n                                    ]\n                                },\n                                projectItems: {\n                                    nodes: [\n                                        {\n                                            project: {\n                                                number: number\n                                            }\n                                            fieldValueByName: {\n                                                name: string\n                                            }\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    ]\n                }\n            };\n\n            // replace because GraphQL doesn't support variables in strings...\n            const res = await toolkit.github.graphql<QueryReturn>(query.replace(\"$staleDate\", staleDate), {\n                headers: {\n                    \"GraphQL-Features\": \"issue_types\"\n                }\n            });\n\n            const issues = res.search.edges;\n\n            for (const issueNode of issues) {\n                const issue = issueNode.node;\n                const parentIssueType = issue.parent?.issueType.name;\n                const labels = issue.labels.nodes;\n                const priorityLabel = labels.find((label) =>\n                    label.name.startsWith(\"priority/\")\n                )?.name;\n\n                const statusInProject = issue.projectItems.nodes.find((projectItem) => projectItem.project.number == 27)?.fieldValueByName.name;\n\n                if (((priorityLabel && priorityLabel.split('/')[1] === \"low\") || statusInProject == \"Backlog\") && parentIssueType != \"Epic\") {\n                    if (dryRun) {\n                        toolkit.core.info(`Would set \"${issue.title}\" (${issue.url}) to AboutToClose`);\n                        continue;\n                    }\n                    const aboutToCloseLabel = await getLabelByName(toolkit, \"shopware\", \"AboutToClose\");\n                    if (!aboutToCloseLabel) {\n                        throw Error(\"Couldn't find the AboutToClose label\");\n                    }\n                    await addLabelToLabelable(toolkit, issue.id, aboutToCloseLabel.id);\n                }\n            }\n\n            break;\n        }\n        default:\n            throw new Error(`There is no query for the project with the number ${projectNumber}`);\n    }\n}\n\nexport async function closeStaleIssues(toolkit: Toolkit, dryRun: boolean) {\n    const DAYS_UNTIL_CLOSE = 30;\n\n    const now = new Date();\n    now.setDate(now.getDate() - DAYS_UNTIL_CLOSE);\n    const closeDate = now.toISOString().split('T')[0];\n\n    const query = /* GraphQL */ `\n        query searchStaleIssues {\n            search(\n              type: ISSUE\n              first: 100\n              query: \"repo:shopware/shopware is:issue state:open label:AboutToClose updated:<=$closeDate\"\n            ) {\n              pageInfo {\n                hasNextPage\n                endCursor\n              }\n              edges {\n                node {\n                  ... on Issue {\n                    id\n                    title\n                    number\n                    url\n                    parent {\n                      issueType {\n                        name\n                      }\n                    }\n                    labels(first: 20) {\n                      nodes {\n                        name\n                      }\n                    }\n                    projectItems(first: 10) {\n                      nodes {\n                        fieldValueByName(name: \"Status\") {\n                          ... on ProjectV2ItemFieldSingleSelectValue {\n                            name\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n    `;\n\n    type QueryReturn = {\n        search: {\n            pageInfo: {\n                hasNextPage: boolean,\n                endCursor: string\n            },\n            edges: [\n                {\n                    node: {\n                        id: string,\n                        title: string,\n                        number: number,\n                        url: string,\n                        parent?: {\n                            issueType: {\n                                name: string\n                            }\n                        },\n                        labels: {\n                            nodes: [\n                                {\n                                    name: string\n                                }\n                            ]\n                        },\n                        projectItems: {\n                            nodes: [\n                                {\n                                    project: {\n                                        number: number\n                                    }\n                                    fieldValueByName: {\n                                        name: string\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            ]\n        }\n    };\n\n    // replace because GraphQL doesn't support variables in strings...\n    const res = await toolkit.github.graphql<QueryReturn>(query.replace(\"$closeDate\", closeDate), {\n        headers: {\n            \"GraphQL-Features\": \"issue_types\"\n        }\n    });\n\n    const issues = res.search.edges;\n\n    for (const issueNode of issues) {\n        const issue = issueNode.node;\n        if (dryRun) {\n            toolkit.core.info(`Would close \"${issue.title}\" (${issue.url})`);\n            continue;\n        }\n\n        await closeIssue(toolkit, issue.id);\n    }\n}\n","import {\n    addComment,\n    closePullRequest,\n    getPullRequests,\n    getVerifiedDomainEmails\n} from \"../api\";\nimport {Toolkit} from \"../types\";\nimport {isDryRun} from \"../util/dry_run\";\n\n/**\n * manageOldPullRequests checks for old pull requests and closes them if they have been inactive for a specified number of days.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param organization - The GitHub organization to check for old pull requests.\n * @param days - Consider pull requests old after this many days of inactivity.\n * @param close - If true, the pull request will be closed after sending the reminder.\n */\nexport async function manageOldPullRequests(toolkit: Toolkit, organization: string = \"shopware\", days: number = 7, close: boolean = false) {\n    const pullRequests = await getPullRequests(\n        toolkit,\n        `org:${organization} is:pr is:open draft:false updated:<${new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString()}`\n    );\n    const closeMsg = `This pull request has been closed automatically. If you would like to continue working on it, please feel free to re-open it!`;\n\n    for (const pr of pullRequests) {\n        const assignee = pr.assignees.nodes[0];\n\n        if (!assignee) {\n            toolkit.core.debug(`Pull request ${pr.repository.owner.login}/${pr.repository.name}#${pr.number} has no assignee, skipping.`);\n\n            continue;\n        }\n\n        const emails = await getVerifiedDomainEmails(toolkit, assignee.login, organization);\n\n        if (emails.length < 1) {\n            continue; // No verified domain emails found for the assignee, abort.\n        }\n\n        if (close) {\n            if (isDryRun()) {\n                toolkit.core.info(`[DRY_RUN]\\t${pr.url}`);\n            } else {\n                await closePullRequest(toolkit, pr.id);\n                await addComment(toolkit, pr.id, closeMsg);\n            }\n        }\n    }\n}\n","import {Toolkit} from \"../types\";\nimport {SlackClient} from \"../api\";\n\n/**\n * Sends a message to a Slack user identified by their email address.\n *\n * @param toolkit - Octokit instance. See: https://octokit.github.io/rest.js\n * @param emails - The email address(es) of the Slack user to send the message to.\n * @param message - The message to send.\n */\nexport async function sendSlackMessageForEMail(toolkit: Toolkit, emails: string[], message: string) {\n    if (process.env.SLACK_TOKEN === undefined) {\n        throw new Error(\"Unauthorized. SLACK_TOKEN environment variable not provided.\");\n    }\n\n    const slackClient = new SlackClient(process.env.SLACK_TOKEN);\n\n    for (const email of emails) {\n        if (!email || email.trim() === '') {\n            continue;\n        }\n\n        const userId = await slackClient.getUserByEmail(email);\n\n        if (!userId) {\n            continue;\n        }\n\n        await slackClient.sendIMToUser(userId, message);\n\n        return;\n    }\n\n    toolkit.core.warning(`No valid Slack user found for emails, can't send message.`);\n}\n"],"names":[],"mappings":"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"}