From 68b91dfedb1728a61105f6ecac6c6805a6d0af39 Mon Sep 17 00:00:00 2001 From: Christophe Hurpeau Date: Sun, 14 Apr 2019 16:54:35 +0200 Subject: [PATCH] fix: release lock when pr is already merged --- dist/index-node10-dev.cjs.js | 8 ++++++-- dist/index-node10-dev.cjs.js.map | 2 +- dist/index-node10.cjs.js | 8 ++++++-- dist/index-node10.cjs.js.map | 2 +- dist/pr-handlers/actions/autoMergeIfPossible.d.ts.map | 2 +- src/pr-handlers/actions/autoMergeIfPossible.ts | 9 ++++++++- 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/dist/index-node10-dev.cjs.js b/dist/index-node10-dev.cjs.js index e625da8f7..6b97bcfde 100644 --- a/dist/index-node10-dev.cjs.js +++ b/dist/index-node10-dev.cjs.js @@ -256,13 +256,17 @@ const autoMergeIfPossible = async (context, repoContext, pr = context.payload.pu } if (pr.merged) { + repoContext.removeMergeLocked(context, pr.number); context.log.info(`automerge not possible: already merged pr ${pr.id}`); return false; } + context.log.info(`automerge?: ${pr.id}, mergeable=${pr.mergeable} state=${pr.mergeable_state}`); + if (!pr.mergeable) { - if (pr.mergeable_state === undefined) { - // GitHub is determining whether the pull request is mergeable + if (!pr.mergeable_state) { + context.log.info(`automerge not possible: rescheduling ${pr.id}`); // GitHub is determining whether the pull request is mergeable + repoContext.reschedule(context, String(pr.id), pr.number); return false; } diff --git a/dist/index-node10-dev.cjs.js.map b/dist/index-node10-dev.cjs.js.map index 46aab13b6..c4af22a00 100644 --- a/dist/index-node10-dev.cjs.js.map +++ b/dist/index-node10-dev.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"index-node10-dev.cjs.js","sources":["../src/teamconfigs/ornikar.ts","../src/teamconfigs/christophehurpeau.ts","../src/teamconfigs/index.ts","../src/pr-handlers/actions/autoMergeIfPossible.ts","../src/context/initRepoLabels.ts","../src/context/utils.ts","../src/context/initTeamSlack.ts","../src/context/teamContext.ts","../src/context/repoContext.ts","../src/pr-handlers/utils.ts","../src/pr-handlers/actions/autoAssignPRToCreator.ts","../src/pr-handlers/actions/utils/cleanTitle.ts","../src/pr-handlers/actions/editOpenedPR.ts","../src/pr-handlers/actions/lintPR.ts","../src/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/pr-handlers/actions/updateReviewStatus.ts","../src/pr-handlers/opened.ts","../src/pr-handlers/closed.ts","../src/pr-handlers/reviewRequested.ts","../src/pr-handlers/reviewRequestRemoved.ts","../src/pr-handlers/reviewSubmitted.ts","../src/pr-handlers/reviewDismissed.ts","../src/pr-handlers/synchronize.ts","../src/pr-handlers/edited.ts","../src/pr-handlers/labelsChanged.ts","../src/pr-handlers/checkrunCompleted.ts","../src/pr-handlers/checksuiteCompleted.ts","../src/index.ts"],"sourcesContent":["import { Config } from './types';\n\nconst config: Config<'dev' | 'design'> = {\n slackToken: process.env.ORNIKAR_SLACK_TOKEN,\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: true,\n prLint: {\n title: [\n {\n regExp:\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\\(([a-z\\-/]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://github.com/marionebl/commitlint/tree/master/%40commitlint/config-conventional',\n },\n },\n {\n bot: false,\n regExp: /\\s(ONK-(\\d+)|\\[no issue])$/,\n error: {\n title: 'Title does not have JIRA issue',\n summary: 'The PR title should end with ONK-0000, or [no issue]',\n },\n status: 'jira-issue',\n statusInfoFromMatch: (match) => {\n const issue = match[1];\n if (issue === '[no issue]') {\n return {\n title: 'No issue',\n summary: '',\n };\n }\n return {\n url: `https://ornikar.atlassian.net/browse/${issue}`,\n title: `JIRA issue: ${issue}`,\n summary: `[${issue}](https://ornikar.atlassian.net/browse/${issue})`,\n };\n },\n },\n ],\n },\n\n groups: {\n dev: {\n abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n skyline42sh: `alexandre.charbonnier${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n design: {\n jperriere: `julien${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CoralineColasse: `coraline${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n },\n waitForGroups: {\n dev: [],\n design: ['dev'],\n },\n labels: {\n list: {\n // /* ci */\n // 'ci/in-progress': { name: ':green_heart: ci/in-progress', color: '#0052cc' },\n // 'ci/fail': { name: ':green_heart: ci/fail', color: '#e11d21' },\n // 'ci/passed': { name: ':green_heart: ci/passed', color: '#86f9b4' },\n\n /* code */\n 'code/needs-review': {\n name: ':ok_hand: code/needs-review',\n color: '#FFD57F',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#B2E1FF',\n },\n 'code/changes-requested': {\n name: ':ok_hand: code/changes-requested',\n color: '#e11d21',\n },\n 'code/approved': {\n name: ':ok_hand: code/approved',\n color: '#64DD17',\n },\n\n /* design */\n 'design/needs-review': {\n name: ':art: design/needs-review',\n color: '#FFD57F',\n },\n 'design/review-requested': {\n name: ':art: design/review-requested',\n color: '#B2E1FF',\n },\n 'design/changes-requested': {\n name: ':art: design/changes-requested',\n color: '#e11d21',\n },\n 'design/approved': {\n name: ':art: design/approved',\n color: '#64DD17',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n design: {\n needsReview: 'design/needs-review',\n requested: 'design/review-requested',\n changesRequested: 'design/changes-requested',\n approved: 'design/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config } from './types';\n\nconst config: Config<'dev'> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prLint: {\n title: [\n {\n regExp:\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\\(([a-z\\-/]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://github.com/marionebl/commitlint/tree/master/%40commitlint/config-conventional',\n },\n },\n ],\n },\n groups: {\n dev: {\n christophehurpeau: 'christophe@hurpeau.com',\n 'chris-reviewflow': 'christophe.hurpeau+reviewflow@gmail.com',\n },\n },\n waitForGroups: {\n dev: [],\n },\n labels: {\n list: {\n // /* ci */\n // 'ci/in-progress': { name: ':green_heart: ci/in-progress', color: '#0052cc' },\n // 'ci/fail': { name: ':green_heart: ci/fail', color: '#e11d21' },\n // 'ci/passed': { name: ':green_heart: ci/passed', color: '#86f9b4' },\n\n /* code */\n 'code/needs-review': {\n name: ':ok_hand: code/needs-review',\n color: '#FFD57F',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#B2E1FF',\n },\n 'code/changes-requested': {\n name: ':ok_hand: code/changes-requested',\n color: '#e11d21',\n },\n 'code/approved': {\n name: ':ok_hand: code/approved',\n color: '#64DD17',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n 'merge/delete-branch': {\n name: ':recycle: delete branch after merge',\n color: '#64DD17',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config as ConfigType } from './types';\nimport ornikar from './ornikar';\nimport christophehurpeau from './christophehurpeau';\n\nexport type Config = ConfigType;\n\nexport const teamConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n};\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","import { Context } from 'probot';\n// eslint-disable-next-line import/no-cycle\nimport { RepoContext } from '../../context/repoContext';\nimport { LabelResponse } from '../../context/initRepoLabels';\n\nexport const autoMergeIfPossible = async (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n prLabels: LabelResponse[] = pr.labels,\n): Promise => {\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return false;\n\n if (!prLabels.find((l: LabelResponse) => l.id === autoMergeLabel.id)) {\n context.log.debug('automerge not possible: no label');\n return false;\n }\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n context.log.debug('automerge not possible: blocking labels');\n return false;\n }\n\n const lockedPrNumber = repoContext.getMergeLocked();\n if (lockedPrNumber && lockedPrNumber !== pr.number) {\n context.log.info(`automerge not possible: locked pr ${pr.id}`);\n repoContext.pushAutomergeQueue(pr.id, pr.number);\n return false;\n }\n\n repoContext.addMergeLock(pr.number);\n\n if (pr.mergeable === undefined) {\n const prResult = await context.github.pulls.get(\n context.repo({\n number: pr.number,\n }),\n );\n pr = prResult.data;\n }\n\n if (pr.merged) {\n context.log.info(`automerge not possible: already merged pr ${pr.id}`);\n return false;\n }\n\n if (!pr.mergeable) {\n if (pr.mergeable_state === undefined) {\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, String(pr.id), pr.number);\n return false;\n }\n\n if (pr.head.ref.startsWith('renovate/')) {\n if (pr.mergeable_state === 'behind' || pr.mergeable_state === 'dirty') {\n context.log.info(\n `automerge not possible: rebase renovate branch pr ${pr.id}`,\n );\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n\n await context.github.issues.update(\n context.repo({\n number: pr.number,\n body: pr.body.replace(\n '[ ] ',\n '[x] ',\n ),\n }),\n );\n return false;\n } else {\n const checks = await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const hasFailedChecks = checks.data.check_runs.some(\n (check) => check.conclusion === 'failure',\n );\n if (hasFailedChecks) {\n context.log.info(`automerge not possible: failed check pr ${pr.id}`);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n\n const statuses = await context.github.repos.listStatusesForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const hasFailedStatuses = statuses.data.some(\n (status) => status.state === 'failure',\n );\n if (hasFailedStatuses) {\n context.log.info(`automerge not possible: failed status pr ${pr.id}`);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n }\n\n context.log.info(\n `automerge not possible: renovate with mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n if (pr.mergeable_state === 'behind') {\n context.log.info('automerge not possible: update branch');\n\n await context.github.repos.merge({\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n base: pr.head.name,\n head: pr.head.name,\n });\n\n return false;\n }\n\n repoContext.removeMergeLocked(context, pr.number);\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pr.number}`);\n const mergeResult = await context.github.pulls.merge({\n merge_method: 'squash',\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n number: pr.number,\n commit_title: `${pr.title} (#${pr.number})`,\n commit_message: '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removeMergeLocked(context, pr.number);\n return Boolean(mergeResult.data.merged);\n } catch (err) {\n context.log.info('could not merge:', err);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\n\nexport interface LabelResponse {\n id: number;\n node_id: string;\n url: string;\n name: string;\n description: string;\n color: string;\n default: boolean;\n}\n\nexport interface Labels {\n [key: string]: LabelResponse;\n}\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const { data: labels } = await context.github.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n const finalLabels: Record = {};\n\n for (const [labelKey, labelConfig] of Object.entries(config.labels.list)) {\n const labelColor = labelConfig.color.slice(1);\n const description = `Generated by review-flow for ${labelKey}`;\n\n let existingLabel = labels.find((label) => label.name === labelConfig.name);\n if (!existingLabel) {\n existingLabel = labels.find((label) => label.description === description);\n }\n if (!existingLabel) {\n if (labelKey === 'design/needs-review') {\n existingLabel = labels.find(\n (label) => label.name === 'needs-design-review',\n );\n }\n if (labelKey === 'design/approved') {\n existingLabel = labels.find(\n (label) => label.name === 'design-reviewed',\n );\n }\n }\n\n if (!existingLabel) {\n const result = await context.github.issues.createLabel(\n context.repo({\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else if (\n existingLabel.name !== labelConfig.name ||\n existingLabel.color !== labelColor // ||\n // TODO: description is never updated\n // existingLabel.description !== description\n ) {\n context.log.info('Needs to update label', {\n current_name: existingLabel.name,\n name: existingLabel.name !== labelConfig.name && labelConfig.name,\n color: existingLabel.color !== labelColor && labelColor,\n description: existingLabel.description !== description && description,\n });\n\n const result = await context.github.issues.updateLabel(\n context.repo({\n current_name: existingLabel.name,\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else {\n finalLabels[labelKey] = existingLabel;\n }\n }\n\n return finalLabels;\n};\n","export const getKeys = (o: T): (keyof T)[] =>\n Object.keys(o) as (keyof T)[];\n","import { WebClient } from '@slack/web-api';\nimport { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { getKeys } from './utils';\n\nexport interface TeamSlack {\n mention: (githubLogin: string) => string;\n postMessage: (githubLogin: string, text: string) => Promise;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const initTeamSlack = async (\n context: Context,\n config: Config,\n): Promise => {\n if (!config.slackToken) {\n return {\n mention: (githubLogin: string) => '',\n postMessage: (githubLogin: string, text: string) => Promise.resolve(),\n };\n }\n\n const githubLoginToSlackEmail = getKeys(config.groups).reduce<{\n [login: string]: string;\n }>((acc, groupName) => {\n Object.assign(acc, config.groups[groupName]);\n return acc;\n }, {});\n\n const slackClient = new WebClient(config.slackToken);\n const allUsers: any = await slackClient.users.list({ limit: 200 });\n const members: [string, { member: any; im: any }][] = Object.values(\n githubLoginToSlackEmail,\n )\n .map((email) => {\n const member = allUsers.members.find(\n (user: any) => user.profile.email === email,\n );\n if (!member) {\n console.warn(`Could not find user ${email}`);\n return;\n }\n return [email, { member, im: undefined }] as [\n string,\n { member: any; im: any }\n ];\n })\n .filter(ExcludesFalsy);\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.im.open({ user: user.member.id });\n user.im = im.channel;\n } catch (err) {\n console.error(err);\n }\n }\n\n const membersMap = new Map(members);\n\n const getUserFromGithubLogin = (githubLogin: string) => {\n const email = githubLoginToSlackEmail[githubLogin];\n if (!email) return null;\n return membersMap.get(email);\n };\n\n return {\n mention: (githubLogin: string) => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (githubLogin: string, text: string) => {\n context.log.info('send slack', { githubLogin, text });\n if (process.env.DRY_RUN) return;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return;\n await slackClient.chat.postMessage({\n channel: user.im.id,\n text,\n });\n },\n };\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { initTeamSlack, TeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface TeamContext {\n config: Config;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => string | undefined;\n getReviewerGroups: (githubLogins: string[]) => string[];\n reviewShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n}\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nconst initTeamContext = async (\n context: Context,\n config: Config,\n): Promise => {\n const slackPromise = initTeamSlack(context, config);\n\n const githubLoginToGroup = getKeys(config.groups).reduce>(\n (acc, groupName) => {\n Object.keys(config.groups[groupName]).forEach((login) => {\n acc.set(login, groupName);\n });\n return acc;\n },\n new Map(),\n );\n\n const getReviewerGroups = (githubLogins: string[]) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(Boolean),\n ),\n ];\n\n return {\n config,\n getReviewerGroup: (githubLogin) => githubLoginToGroup.get(githubLogin),\n getReviewerGroups: (githubLogins) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ],\n\n reviewShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ) => {\n if (!reviewerGroup) return false;\n\n const requestedReviewerGroups = getReviewerGroups(\n requestedReviewers.map((request) => request.login),\n );\n\n // contains another request of a reviewer in the same group\n if (\n includesReviewerGroup &&\n requestedReviewerGroups.includes(reviewerGroup)\n ) {\n return true;\n }\n\n // contains a request from a dependent group\n if (config.waitForGroups && includesWaitForGroups) {\n const waitForGroups = config.waitForGroups;\n return requestedReviewerGroups.some((group) =>\n waitForGroups[reviewerGroup].includes(group),\n );\n }\n\n return false;\n },\n\n slack: await slackPromise,\n };\n};\n\nconst teamContextsPromise = new Map();\nconst teamContexts = new Map();\n\nexport const obtainTeamContext = (\n context: Context,\n config: Config,\n): Promise => {\n const owner = context.payload.repository.owner;\n\n const existingTeamContext = teamContexts.get(owner.login);\n if (existingTeamContext) return existingTeamContext;\n\n const existingPromise = teamContextsPromise.get(owner.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initTeamContext(context, config);\n teamContextsPromise.set(owner.login, promise);\n\n return promise.then((teamContext) => {\n teamContextsPromise.delete(owner.login);\n teamContexts.set(owner.login, teamContext);\n return teamContext;\n });\n};\n","/* eslint-disable max-lines */\n\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../pr-handlers/actions/autoMergeIfPossible';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n protectedLabelIds: LabelResponse['id'][];\n\n hasNeedsReview: (labels: LabelResponse[]) => boolean;\n hasRequestedReview: (labels: LabelResponse[]) => boolean;\n hasChangesRequestedReview: (labels: LabelResponse[]) => boolean;\n hasApprovesReview: (labels: LabelResponse[]) => boolean;\n getNeedsReviewGroupNames: (labels: LabelResponse[]) => GroupNames[];\n\n lockPROrPRS(\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise;\n\n getMergeLocked(): number | undefined;\n addMergeLock(prNumber: number): void;\n removeMergeLocked(context: Context, prNumber: number): void;\n reschedule(context: Context, prId: string, prNumber: number): void;\n pushAutomergeQueue(prId: string, prNumber: number): void;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nasync function initRepoContext(\n context: Context,\n config: Config,\n): Promise> {\n const teamContext = await obtainTeamContext(context, config);\n const repoContext = Object.create(teamContext);\n\n const [labels] = await Promise.all([initRepoLabels(context, config)]);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewGroupNames\n .map((key: GroupNames) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const changesRequestedLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].changesRequested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const labelIdToGroupName = new Map();\n reviewGroupNames.forEach((key) => {\n const reviewGroupLabels = config.labels.review[key] as any;\n Object.keys(reviewGroupLabels).forEach((labelKey: string) => {\n labelIdToGroupName.set(labels[reviewGroupLabels[labelKey]].id, key);\n });\n });\n\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: LabelResponse[]) =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: LabelResponse[]): GroupNames[] =>\n labels\n .filter((label) => needsReviewLabelIds.includes(label.id))\n .map((label) => labelIdToGroupName.get(label.id))\n .filter(ExcludesFalsy);\n\n const lock = Lock();\n let lockMergePrNumber: number | undefined;\n const automergeQueue: { id: string; number: number }[] = [];\n\n const lockPROrPRS = (\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n console.log('lock: try to lock pr', { prIdOrIds });\n lock(prIdOrIds, async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n console.log('lock: lock acquired', { prIdOrIds });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { prIdOrIds });\n release();\n reject(err);\n return;\n }\n console.log('lock: release pr', { prIdOrIds });\n release();\n resolve();\n });\n });\n\n const reschedule = (\n context: Context,\n prId: string,\n prNumber: number,\n ) => {\n context.log.info('reschedule', { prNumber });\n setTimeout(() => {\n lockPROrPRS('reschedule', () => {\n return lockPROrPRS(prId, async () => {\n const prResult = await context.github.pulls.get(\n context.repo({\n number: prNumber,\n }),\n );\n await autoMergeIfPossible(context, repoContext, prResult.data);\n });\n });\n }, 1000);\n };\n\n return Object.assign(repoContext, {\n labels,\n protectedLabelIds: [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ],\n hasNeedsReview,\n hasRequestedReview,\n hasChangesRequestedReview,\n hasApprovesReview,\n getNeedsReviewGroupNames,\n\n getMergeLocked: () => lockMergePrNumber,\n addMergeLock: (prNumber): void => {\n console.log('merge lock: lock', { prNumber });\n if (lockMergePrNumber === prNumber) return;\n if (lockMergePrNumber) throw new Error('Already have lock id');\n lockMergePrNumber = prNumber;\n },\n removeMergeLocked: (context, prNumber): void => {\n console.log('merge lock: remove', { prNumber });\n if (lockMergePrNumber !== prNumber) return;\n const next = automergeQueue.shift();\n if (!next) {\n lockMergePrNumber = undefined;\n return;\n }\n\n console.log('merge lock: next', next);\n reschedule(context, next.id, next.number);\n },\n pushAutomergeQueue: (prId, prNumber): void => {\n console.log('merge lock: push queue', {\n prNumber,\n lockMergePrNumber,\n automergeQueue,\n });\n automergeQueue.push({ id: prId, number: prNumber });\n },\n reschedule,\n\n lockPROrPRS,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n context: Context,\n): Promise | RepoContext | null => {\n const owner = context.payload.repository.owner;\n if (!teamConfigs[owner.login]) {\n console.warn(owner.login, Object.keys(teamConfigs));\n return null;\n }\n const key = context.payload.repository.id;\n\n const existingRepoContext = repoContexts.get(key);\n if (existingRepoContext) return existingRepoContext;\n\n const existingPromise = repoContextsPromise.get(key);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initRepoContext(context, teamConfigs[owner.login]);\n repoContextsPromise.set(key, promise);\n\n return promise.then((repoContext) => {\n repoContextsPromise.delete(key);\n repoContexts.set(key, repoContext);\n return repoContext;\n });\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { obtainRepoContext, RepoContext } from '../context/repoContext';\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n) => Promise;\n\nexport type CallbackWithRepoContext = (\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const handlerPullRequestChange = async <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n callback: CallbackWithRepoContext,\n): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n repoContext.lockPROrPRS(String(context.payload.pull_request.id), async () => {\n await callback(repoContext);\n });\n};\n\ntype CallbackContextAndRepoContext = (\n context: Context,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: CallbackContextAndRepoContext,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport const createHandlerPullRequestsChange = (\n getPullRequests: (context: Context) => any[],\n callback: CallbackContextAndRepoContext,\n) => async (context: Context) => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n return repoContext.lockPROrPRS(\n getPullRequests(context).map((pr) => String(pr.id)),\n () => callback(context, repoContext),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoAssignPRToCreator: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext) => {\n if (!repoContext.config.autoAssignToCreator) return;\n\n const pr = context.payload.pull_request;\n if (pr.assignees.length !== 0) return;\n if (pr.user.type === 'Bot') return;\n\n await context.github.issues.addAssignees(\n context.issue({\n assignees: [pr.user.login],\n }),\n );\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(/[\\s-]+\\[?\\s*(ONK-\\d+)\\s*]?\\s*$/, ' $1')\n .replace(/^([A-Za-z]+)[/:]\\s*/, (s, arg1) => `${arg1.toLowerCase()}: `)\n .replace(/^Revert \"([^\"]+)\"$/, 'revert: $1')\n // eslint-disable-next-line unicorn/no-unsafe-regex\n .replace(/^(revert:.*)(\\s+\\(#\\d+\\))$/, '$1');\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { cleanTitle } from './utils/cleanTitle';\n\nexport const editOpenedPR = (\n context: Context,\n repoContext: RepoContext,\n) => {\n if (!repoContext.config.trimTitle) return;\n\n const pr = context.payload.pull_request;\n const title = cleanTitle(pr.title);\n\n if (pr.title !== title) {\n pr.title = title;\n context.github.issues.update(\n context.issue({\n title,\n }),\n );\n }\n};\n","import { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { StatusError, StatusInfo } from '../../teamconfigs/types';\n\ninterface StatusWithInfo {\n name: string;\n info: StatusInfo;\n error?: undefined;\n}\n\ninterface StatusWithError {\n name: string;\n error: StatusError;\n info?: undefined;\n}\n\ntype Status = StatusWithInfo | StatusWithError;\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const lintPR = async (\n context: Context,\n repoContext: RepoContext,\n) => {\n if (!repoContext.config.prLint) return;\n\n const repo = context.payload.repository;\n const pr = context.payload.pull_request;\n\n // do not lint pr from forks\n if (pr.head.repo.id !== repo.id) return;\n\n const isPrFromBot = pr.user.type === 'Bot';\n\n const statuses: Status[] = [];\n\n const errorRule = repoContext.config.prLint.title.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(pr.title);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n return true;\n }\n\n if (rule.status && rule.statusInfoFromMatch) {\n statuses.push({\n name: rule.status,\n info: rule.statusInfoFromMatch(match),\n });\n return false;\n }\n\n return false;\n });\n\n const date = new Date().toISOString();\n\n const hasLintPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find(\n (check) => check.name === `${process.env.NAME}/lint-pr`,\n );\n\n await Promise.all(\n [\n ...statuses.map(({ name, error, info }) =>\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/${name}`,\n sha: pr.head.sha,\n state: (error ? 'failure' : 'success') as 'failure' | 'success',\n target_url: error ? undefined : (info as StatusInfo).url,\n description: error ? error.title : (info as StatusInfo).title,\n }),\n ),\n ),\n hasLintPrCheck &&\n context.github.checks.create(\n context.repo({\n name: `${process.env.NAME}/lint-pr`,\n head_sha: pr.head.sha,\n status: 'completed' as 'completed',\n conclusion: (errorRule ? 'failure' : 'success') as\n | 'failure'\n | 'success',\n started_at: date,\n completed_at: date,\n output: errorRule\n ? errorRule.error\n : {\n title: '✓ Your PR is valid',\n summary: '',\n },\n }),\n ),\n !hasLintPrCheck &&\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/lint-pr`,\n sha: pr.head.sha,\n state: (errorRule ? 'failure' : 'success') as 'failure' | 'success',\n target_url: undefined,\n description: errorRule\n ? errorRule.error.title\n : '✓ Your PR is valid',\n }),\n ),\n ].filter(ExcludesFalsy),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { RepoContext } from '../../context/repoContext';\n\nconst addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n pr: any,\n { state, description }: { state: 'failure' | 'success'; description: string },\n): Promise {\n const hasPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find((check) => check.name === process.env.NAME);\n\n context.log.info('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME as string,\n head_sha: pr.head.sha,\n started_at: pr.created_at,\n status: 'completed',\n conclusion: state,\n completed_at: new Date().toISOString(),\n output: {\n title: description,\n summary: '',\n },\n }),\n );\n } else {\n await context.github.repos.createStatus(\n context.repo({\n context: process.env.NAME,\n sha: pr.head.sha,\n state,\n target_url: undefined,\n description,\n }),\n );\n }\n};\n\nconst createFailedStatusCheck = (\n context: Context,\n pr: any,\n description: string,\n): Promise =>\n addStatusCheck(context, pr, {\n state: 'failure',\n description,\n });\n\nexport const updateStatusCheckFromLabels = (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n labels: LabelResponse[] = pr.labels || [],\n): Promise => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n if (pr.requested_reviewers.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${pr.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Changes requested ! Push commits or discuss changes then re-request a review.',\n );\n }\n\n const needsReviewGroupNames = repoContext.getNeedsReviewGroupNames(labels);\n\n if (needsReviewGroupNames.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${needsReviewGroupNames.join(\n ', ',\n )}. Perhaps request someone ?`,\n );\n }\n\n if (!repoContext.hasApprovesReview(labels)) {\n if (repoContext.config.requiresReviewRequest) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Awaiting review... Perhaps request someone ?',\n );\n }\n }\n\n // if (\n // repoContext.config.requiresReviewRequest &&\n // !repoContext.hasRequestedReview(labels)\n // ) {\n // return createFailedStatusCheck(\n // context,\n // pr,\n // 'You need to request someone to review the PR',\n // );\n // return;\n // }\n // return createInProgressStatusCheck(context);\n // } else if (repoContext.hasApprovesReview(labels)) {\n return addStatusCheck(context, pr, {\n state: 'success',\n description: '✓ PR ready to merge !',\n });\n // }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { GroupLabels } from '../../teamconfigs/types';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends Webhooks.WebhookPayloadPullRequest,\n GroupNames extends string = any\n>(\n context: Context,\n repoContext: RepoContext,\n reviewGroup: GroupNames,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n): Promise => {\n context.log.info('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n const pr = context.payload.pull_request;\n let prLabels = pr.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n\n const toAdd = new Set();\n const toDelete = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = repoContext.config.labels.review[reviewGroup];\n if (!reviewConfig) return undefined;\n\n return reviewConfig[key] && labels[reviewConfig[key]]\n ? labels[reviewConfig[key]]\n : undefined;\n };\n\n if (labelsToAdd) {\n labelsToAdd.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (\n !label ||\n prLabels.some((prLabel: LabelResponse) => prLabel.id === label.id)\n ) {\n return;\n }\n newLabelNames.add(label.name);\n toAdd.add(key);\n });\n }\n\n if (labelsToRemove) {\n labelsToRemove.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label) return;\n const existing = prLabels.find(\n (prLabel: LabelResponse) => prLabel.id === label.id,\n );\n if (existing) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n const result = await context.github.issues.replaceLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(context, repoContext, pr, prLabels);\n // }\n\n return prLabels;\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.opened',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n autoAssignPRToCreator(context, repoContext),\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n context.payload.pull_request.head.ref.startsWith('renovate/')\n ? Promise.resolve(undefined)\n : updateReviewStatus(context, repoContext, 'dev', {\n add: ['needsReview'],\n }),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.closed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const pr = context.payload.pull_request;\n if (pr.merged) {\n await Promise.all([\n repoContext.removeMergeLocked(context, pr.number),\n // TODO delete branch\n ]);\n } else {\n await Promise.all([\n updateReviewStatus(context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.review_requested',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n\n // ignore if sender is self (dismissed review rerequest review)\n if (sender.type === 'Bot') return;\n\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n const shouldWait = false;\n // repoContext.reviewShouldWait(reviewerGroup, pr.requested_reviewers, { includesWaitForGroups: true });\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES' &&\n // In case this is a rerequest for review\n review.user.login !== reviewer.login,\n );\n\n if (!hasChangesRequestedInReviews) {\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved', 'changesRequested'],\n });\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${pr.html_url} !\\n> ${pr.title}`,\n );\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.review_request_removed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n const hasApprovedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'APPROVED',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: [\n // if changes requested by the one which requests was removed\n hasChangesRequestedInReviews && 'changesRequested',\n // if was already approved by another member in the group and has no other requests waiting\n approved && 'approved',\n ],\n // remove labels if has no other requests waiting\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n ],\n });\n }\n\n if (sender.login === reviewer.login) return;\n\n if (repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${pr.html_url}`,\n );\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request_review.submitted',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const pr = context.payload.pull_request;\n const { user: reviewer, state } = (context.payload as any).review;\n if (pr.user.login === reviewer.login) return;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged;\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n // TODO reenable this when accepted can notify request review to slack (dev accepted => design requested) and flag to disable for label (approved design ; still waiting for dev ?)\n // includesWaitForGroups: true,\n },\n );\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const newLabels = await updateReviewStatus(\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !(hasRequestedReviewsForGroup || state === 'changes_requested') &&\n 'requested',\n state === 'approved' &&\n !hasChangesRequestedInReviews &&\n 'changesRequested',\n state === 'changes_requested' && 'approved',\n ],\n },\n );\n\n if (approved && !hasChangesRequestedInReviews) {\n merged = await autoMergeIfPossible(\n context,\n repoContext,\n pr,\n newLabels,\n );\n }\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = pr.html_url;\n\n const message = (() => {\n if (state === 'changes_requested') {\n return `:x: ${mention} requests changes on ${prUrl}`;\n }\n if (state === 'approved') {\n return `:clap: :white_check_mark: ${mention} approves ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n return `:speech_balloon: ${mention} commented on ${prUrl}`;\n })();\n\n repoContext.slack.postMessage(pr.user.login, message);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request_review.dismissed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).review.user;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', 'requested'],\n remove: [\n !hasChangesRequestedInReviews && 'changesRequested',\n 'approved',\n ],\n });\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n repoContext.slack.postMessage(\n pr.user.login,\n `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${pr.html_url}`,\n );\n } else {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${pr.html_url}`,\n );\n }\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(async (context, repoContext) => {\n // old and new sha\n // const { before, after } = context.payload;\n\n await Promise.all([\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(context, repoContext),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { lintPR } from './actions/lintPR';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.edited',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n ]);\n\n await autoMergeIfPossible(context, repoContext);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\n\nexport default (app: Application) => {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n async (context) => {\n const sender = context.payload.sender;\n if (sender.type === 'Bot') return;\n\n await handlerPullRequestChange(context, async (repoContext) => {\n const label = context.payload.label;\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.github.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.github.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(context, repoContext);\n\n if (\n context.payload.action === 'labeled' &&\n label.id ===\n (repoContext.labels['merge/automerge'] &&\n repoContext.labels['merge/automerge'].id)\n ) {\n await autoMergeIfPossible(context, repoContext);\n }\n });\n },\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'check_run.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_run.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_run.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'check_suite.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_suite.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_suite.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n};\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\nimport closedHandler from './pr-handlers/closed';\nimport reviewRequestedHandler from './pr-handlers/reviewRequested';\nimport reviewRequestRemovedHandler from './pr-handlers/reviewRequestRemoved';\nimport reviewSubmittedHandler from './pr-handlers/reviewSubmitted';\nimport reviewDismissedHandler from './pr-handlers/reviewDismissed';\nimport synchromizeHandler from './pr-handlers/synchronize';\nimport editedHandler from './pr-handlers/edited';\nimport labelsChanged from './pr-handlers/labelsChanged';\nimport checkrunCompleted from './pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './pr-handlers/checksuiteCompleted';\n\nif (!process.env.NAME) process.env.NAME = 'reviewflow';\n\n// const getConfig = require('probot-config')\n// const { MongoClient } = require('mongodb');\n\n// const connect = MongoClient.connect(process.env.MONGO_URL);\n// const db = connect.then(client => client.db(process.env.MONGO_DB));\n\n// let config = await getConfig(context, 'reviewflow.yml');\n\n// eslint-disable-next-line import/no-commonjs\nProbot.run((app: Application) => {\n openedHandler(app);\n closedHandler(app);\n reviewRequestedHandler(app);\n reviewRequestRemovedHandler(app);\n\n // app.on('pull_request.closed', async context => {\n\n // });\n\n // app.on('pull_request.reopened', async context => {\n\n // });\n\n reviewSubmittedHandler(app);\n reviewDismissedHandler(app);\n labelsChanged(app);\n synchromizeHandler(app);\n editedHandler(app);\n\n checkrunCompleted(app);\n checksuiteCompleted(app);\n});\n"],"names":["config","slackToken","process","env","ORNIKAR_SLACK_TOKEN","autoAssignToCreator","trimTitle","requiresReviewRequest","prLint","title","regExp","error","summary","bot","status","statusInfoFromMatch","match","issue","url","groups","dev","abarreir","ORNIKAR_EMAIL_DOMAIN","christophehurpeau","arthurflachs","skyline42sh","LentnerStefan","HugoGarrido","CorentinAndre","rigma","Mxime","damienorny","tilap","design","jperriere","CoralineColasse","waitForGroups","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","teamConfigs","ornikar","autoMergeIfPossible","context","repoContext","pr","payload","pull_request","prLabels","autoMergeLabel","find","l","id","log","debug","hasNeedsReview","hasRequestedReview","lockedPrNumber","getMergeLocked","number","info","pushAutomergeQueue","addMergeLock","mergeable","undefined","prResult","github","pulls","get","repo","data","merged","mergeable_state","reschedule","String","head","ref","startsWith","issues","update","body","replace","checks","listForRef","sha","per_page","hasFailedChecks","check_runs","some","check","conclusion","removeMergeLocked","statuses","repos","listStatusesForRef","hasFailedStatuses","state","merge","owner","login","base","mergeResult","merge_method","commit_title","commit_message","Boolean","err","initRepoLabels","listLabelsForRepo","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","description","existingLabel","label","result","createLabel","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","initTeamSlack","mention","postMessage","Promise","resolve","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackClient","WebClient","allUsers","users","limit","members","values","map","email","member","user","profile","console","warn","im","filter","open","channel","membersMap","Map","getUserFromGithubLogin","githubLogin","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","create","all","reviewGroupNames","needsReviewLabelIds","key","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","labelIdToGroupName","reviewGroupLabels","lock","Lock","lockMergePrNumber","automergeQueue","lockPROrPRS","prIdOrIds","callback","reject","createReleaseCallback","release","prId","prNumber","setTimeout","protectedLabelIds","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","Error","next","shift","push","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","createHandlerPullRequestsChange","getPullRequests","autoAssignPRToCreator","assignees","length","type","addAssignees","cleanTitle","trim","s","arg1","toLowerCase","editOpenedPR","lintPR","isPrFromBot","errorRule","rule","exec","date","Date","toISOString","hasLintPrCheck","NAME","createStatus","target_url","head_sha","started_at","completed_at","output","addStatusCheck","hasPrCheck","created_at","createFailedStatusCheck","updateStatusCheckFromLabels","requested_reviewers","rr","join","needsReviewGroupNames","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","newLabelNamesArray","oldLabels","size","replaceLabels","app","on","sender","reviewer","requested_reviewer","reviews","listReviews","hasChangesRequestedInReviews","html_url","hasRequestedReviewsForGroup","hasApprovedInReviews","newLabels","prUrl","message","action","removeLabel","addLabels","check_run","pull_requests","check_suite","Probot","run","openedHandler","closedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","labelsChanged","synchromizeHandler","editedHandler","checkrunCompleted","checksuiteCompleted"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index-node10-dev.cjs.js","sources":["../src/teamconfigs/ornikar.ts","../src/teamconfigs/christophehurpeau.ts","../src/teamconfigs/index.ts","../src/pr-handlers/actions/autoMergeIfPossible.ts","../src/context/initRepoLabels.ts","../src/context/utils.ts","../src/context/initTeamSlack.ts","../src/context/teamContext.ts","../src/context/repoContext.ts","../src/pr-handlers/utils.ts","../src/pr-handlers/actions/autoAssignPRToCreator.ts","../src/pr-handlers/actions/utils/cleanTitle.ts","../src/pr-handlers/actions/editOpenedPR.ts","../src/pr-handlers/actions/lintPR.ts","../src/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/pr-handlers/actions/updateReviewStatus.ts","../src/pr-handlers/opened.ts","../src/pr-handlers/closed.ts","../src/pr-handlers/reviewRequested.ts","../src/pr-handlers/reviewRequestRemoved.ts","../src/pr-handlers/reviewSubmitted.ts","../src/pr-handlers/reviewDismissed.ts","../src/pr-handlers/synchronize.ts","../src/pr-handlers/edited.ts","../src/pr-handlers/labelsChanged.ts","../src/pr-handlers/checkrunCompleted.ts","../src/pr-handlers/checksuiteCompleted.ts","../src/index.ts"],"sourcesContent":["import { Config } from './types';\n\nconst config: Config<'dev' | 'design'> = {\n slackToken: process.env.ORNIKAR_SLACK_TOKEN,\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: true,\n prLint: {\n title: [\n {\n regExp:\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\\(([a-z\\-/]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://github.com/marionebl/commitlint/tree/master/%40commitlint/config-conventional',\n },\n },\n {\n bot: false,\n regExp: /\\s(ONK-(\\d+)|\\[no issue])$/,\n error: {\n title: 'Title does not have JIRA issue',\n summary: 'The PR title should end with ONK-0000, or [no issue]',\n },\n status: 'jira-issue',\n statusInfoFromMatch: (match) => {\n const issue = match[1];\n if (issue === '[no issue]') {\n return {\n title: 'No issue',\n summary: '',\n };\n }\n return {\n url: `https://ornikar.atlassian.net/browse/${issue}`,\n title: `JIRA issue: ${issue}`,\n summary: `[${issue}](https://ornikar.atlassian.net/browse/${issue})`,\n };\n },\n },\n ],\n },\n\n groups: {\n dev: {\n abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n skyline42sh: `alexandre.charbonnier${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n design: {\n jperriere: `julien${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CoralineColasse: `coraline${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n },\n waitForGroups: {\n dev: [],\n design: ['dev'],\n },\n labels: {\n list: {\n // /* ci */\n // 'ci/in-progress': { name: ':green_heart: ci/in-progress', color: '#0052cc' },\n // 'ci/fail': { name: ':green_heart: ci/fail', color: '#e11d21' },\n // 'ci/passed': { name: ':green_heart: ci/passed', color: '#86f9b4' },\n\n /* code */\n 'code/needs-review': {\n name: ':ok_hand: code/needs-review',\n color: '#FFD57F',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#B2E1FF',\n },\n 'code/changes-requested': {\n name: ':ok_hand: code/changes-requested',\n color: '#e11d21',\n },\n 'code/approved': {\n name: ':ok_hand: code/approved',\n color: '#64DD17',\n },\n\n /* design */\n 'design/needs-review': {\n name: ':art: design/needs-review',\n color: '#FFD57F',\n },\n 'design/review-requested': {\n name: ':art: design/review-requested',\n color: '#B2E1FF',\n },\n 'design/changes-requested': {\n name: ':art: design/changes-requested',\n color: '#e11d21',\n },\n 'design/approved': {\n name: ':art: design/approved',\n color: '#64DD17',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n design: {\n needsReview: 'design/needs-review',\n requested: 'design/review-requested',\n changesRequested: 'design/changes-requested',\n approved: 'design/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config } from './types';\n\nconst config: Config<'dev'> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prLint: {\n title: [\n {\n regExp:\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\\(([a-z\\-/]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://github.com/marionebl/commitlint/tree/master/%40commitlint/config-conventional',\n },\n },\n ],\n },\n groups: {\n dev: {\n christophehurpeau: 'christophe@hurpeau.com',\n 'chris-reviewflow': 'christophe.hurpeau+reviewflow@gmail.com',\n },\n },\n waitForGroups: {\n dev: [],\n },\n labels: {\n list: {\n // /* ci */\n // 'ci/in-progress': { name: ':green_heart: ci/in-progress', color: '#0052cc' },\n // 'ci/fail': { name: ':green_heart: ci/fail', color: '#e11d21' },\n // 'ci/passed': { name: ':green_heart: ci/passed', color: '#86f9b4' },\n\n /* code */\n 'code/needs-review': {\n name: ':ok_hand: code/needs-review',\n color: '#FFD57F',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#B2E1FF',\n },\n 'code/changes-requested': {\n name: ':ok_hand: code/changes-requested',\n color: '#e11d21',\n },\n 'code/approved': {\n name: ':ok_hand: code/approved',\n color: '#64DD17',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n 'merge/delete-branch': {\n name: ':recycle: delete branch after merge',\n color: '#64DD17',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config as ConfigType } from './types';\nimport ornikar from './ornikar';\nimport christophehurpeau from './christophehurpeau';\n\nexport type Config = ConfigType;\n\nexport const teamConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n};\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","import { Context } from 'probot';\n// eslint-disable-next-line import/no-cycle\nimport { RepoContext } from '../../context/repoContext';\nimport { LabelResponse } from '../../context/initRepoLabels';\n\nexport const autoMergeIfPossible = async (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n prLabels: LabelResponse[] = pr.labels,\n): Promise => {\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return false;\n\n if (!prLabels.find((l: LabelResponse) => l.id === autoMergeLabel.id)) {\n context.log.debug('automerge not possible: no label');\n return false;\n }\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n context.log.debug('automerge not possible: blocking labels');\n return false;\n }\n\n const lockedPrNumber = repoContext.getMergeLocked();\n if (lockedPrNumber && lockedPrNumber !== pr.number) {\n context.log.info(`automerge not possible: locked pr ${pr.id}`);\n repoContext.pushAutomergeQueue(pr.id, pr.number);\n return false;\n }\n\n repoContext.addMergeLock(pr.number);\n\n if (pr.mergeable === undefined) {\n const prResult = await context.github.pulls.get(\n context.repo({\n number: pr.number,\n }),\n );\n pr = prResult.data;\n }\n\n if (pr.merged) {\n repoContext.removeMergeLocked(context, pr.number);\n context.log.info(`automerge not possible: already merged pr ${pr.id}`);\n return false;\n }\n\n context.log.info(\n `automerge?: ${pr.id}, mergeable=${pr.mergeable} state=${\n pr.mergeable_state\n }`,\n );\n if (!pr.mergeable) {\n if (!pr.mergeable_state) {\n context.log.info(`automerge not possible: rescheduling ${pr.id}`);\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, String(pr.id), pr.number);\n return false;\n }\n\n if (pr.head.ref.startsWith('renovate/')) {\n if (pr.mergeable_state === 'behind' || pr.mergeable_state === 'dirty') {\n context.log.info(\n `automerge not possible: rebase renovate branch pr ${pr.id}`,\n );\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n\n await context.github.issues.update(\n context.repo({\n number: pr.number,\n body: pr.body.replace(\n '[ ] ',\n '[x] ',\n ),\n }),\n );\n return false;\n } else {\n const checks = await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const hasFailedChecks = checks.data.check_runs.some(\n (check) => check.conclusion === 'failure',\n );\n if (hasFailedChecks) {\n context.log.info(`automerge not possible: failed check pr ${pr.id}`);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n\n const statuses = await context.github.repos.listStatusesForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const hasFailedStatuses = statuses.data.some(\n (status) => status.state === 'failure',\n );\n if (hasFailedStatuses) {\n context.log.info(`automerge not possible: failed status pr ${pr.id}`);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n }\n\n context.log.info(\n `automerge not possible: renovate with mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n if (pr.mergeable_state === 'behind') {\n context.log.info('automerge not possible: update branch');\n\n await context.github.repos.merge({\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n base: pr.head.name,\n head: pr.head.name,\n });\n\n return false;\n }\n\n repoContext.removeMergeLocked(context, pr.number);\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pr.number}`);\n const mergeResult = await context.github.pulls.merge({\n merge_method: 'squash',\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n number: pr.number,\n commit_title: `${pr.title} (#${pr.number})`,\n commit_message: '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removeMergeLocked(context, pr.number);\n return Boolean(mergeResult.data.merged);\n } catch (err) {\n context.log.info('could not merge:', err);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\n\nexport interface LabelResponse {\n id: number;\n node_id: string;\n url: string;\n name: string;\n description: string;\n color: string;\n default: boolean;\n}\n\nexport interface Labels {\n [key: string]: LabelResponse;\n}\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const { data: labels } = await context.github.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n const finalLabels: Record = {};\n\n for (const [labelKey, labelConfig] of Object.entries(config.labels.list)) {\n const labelColor = labelConfig.color.slice(1);\n const description = `Generated by review-flow for ${labelKey}`;\n\n let existingLabel = labels.find((label) => label.name === labelConfig.name);\n if (!existingLabel) {\n existingLabel = labels.find((label) => label.description === description);\n }\n if (!existingLabel) {\n if (labelKey === 'design/needs-review') {\n existingLabel = labels.find(\n (label) => label.name === 'needs-design-review',\n );\n }\n if (labelKey === 'design/approved') {\n existingLabel = labels.find(\n (label) => label.name === 'design-reviewed',\n );\n }\n }\n\n if (!existingLabel) {\n const result = await context.github.issues.createLabel(\n context.repo({\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else if (\n existingLabel.name !== labelConfig.name ||\n existingLabel.color !== labelColor // ||\n // TODO: description is never updated\n // existingLabel.description !== description\n ) {\n context.log.info('Needs to update label', {\n current_name: existingLabel.name,\n name: existingLabel.name !== labelConfig.name && labelConfig.name,\n color: existingLabel.color !== labelColor && labelColor,\n description: existingLabel.description !== description && description,\n });\n\n const result = await context.github.issues.updateLabel(\n context.repo({\n current_name: existingLabel.name,\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else {\n finalLabels[labelKey] = existingLabel;\n }\n }\n\n return finalLabels;\n};\n","export const getKeys = (o: T): (keyof T)[] =>\n Object.keys(o) as (keyof T)[];\n","import { WebClient } from '@slack/web-api';\nimport { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { getKeys } from './utils';\n\nexport interface TeamSlack {\n mention: (githubLogin: string) => string;\n postMessage: (githubLogin: string, text: string) => Promise;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const initTeamSlack = async (\n context: Context,\n config: Config,\n): Promise => {\n if (!config.slackToken) {\n return {\n mention: (githubLogin: string) => '',\n postMessage: (githubLogin: string, text: string) => Promise.resolve(),\n };\n }\n\n const githubLoginToSlackEmail = getKeys(config.groups).reduce<{\n [login: string]: string;\n }>((acc, groupName) => {\n Object.assign(acc, config.groups[groupName]);\n return acc;\n }, {});\n\n const slackClient = new WebClient(config.slackToken);\n const allUsers: any = await slackClient.users.list({ limit: 200 });\n const members: [string, { member: any; im: any }][] = Object.values(\n githubLoginToSlackEmail,\n )\n .map((email) => {\n const member = allUsers.members.find(\n (user: any) => user.profile.email === email,\n );\n if (!member) {\n console.warn(`Could not find user ${email}`);\n return;\n }\n return [email, { member, im: undefined }] as [\n string,\n { member: any; im: any }\n ];\n })\n .filter(ExcludesFalsy);\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.im.open({ user: user.member.id });\n user.im = im.channel;\n } catch (err) {\n console.error(err);\n }\n }\n\n const membersMap = new Map(members);\n\n const getUserFromGithubLogin = (githubLogin: string) => {\n const email = githubLoginToSlackEmail[githubLogin];\n if (!email) return null;\n return membersMap.get(email);\n };\n\n return {\n mention: (githubLogin: string) => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (githubLogin: string, text: string) => {\n context.log.info('send slack', { githubLogin, text });\n if (process.env.DRY_RUN) return;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return;\n await slackClient.chat.postMessage({\n channel: user.im.id,\n text,\n });\n },\n };\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { initTeamSlack, TeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface TeamContext {\n config: Config;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => string | undefined;\n getReviewerGroups: (githubLogins: string[]) => string[];\n reviewShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n}\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nconst initTeamContext = async (\n context: Context,\n config: Config,\n): Promise => {\n const slackPromise = initTeamSlack(context, config);\n\n const githubLoginToGroup = getKeys(config.groups).reduce>(\n (acc, groupName) => {\n Object.keys(config.groups[groupName]).forEach((login) => {\n acc.set(login, groupName);\n });\n return acc;\n },\n new Map(),\n );\n\n const getReviewerGroups = (githubLogins: string[]) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(Boolean),\n ),\n ];\n\n return {\n config,\n getReviewerGroup: (githubLogin) => githubLoginToGroup.get(githubLogin),\n getReviewerGroups: (githubLogins) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ],\n\n reviewShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ) => {\n if (!reviewerGroup) return false;\n\n const requestedReviewerGroups = getReviewerGroups(\n requestedReviewers.map((request) => request.login),\n );\n\n // contains another request of a reviewer in the same group\n if (\n includesReviewerGroup &&\n requestedReviewerGroups.includes(reviewerGroup)\n ) {\n return true;\n }\n\n // contains a request from a dependent group\n if (config.waitForGroups && includesWaitForGroups) {\n const waitForGroups = config.waitForGroups;\n return requestedReviewerGroups.some((group) =>\n waitForGroups[reviewerGroup].includes(group),\n );\n }\n\n return false;\n },\n\n slack: await slackPromise,\n };\n};\n\nconst teamContextsPromise = new Map();\nconst teamContexts = new Map();\n\nexport const obtainTeamContext = (\n context: Context,\n config: Config,\n): Promise => {\n const owner = context.payload.repository.owner;\n\n const existingTeamContext = teamContexts.get(owner.login);\n if (existingTeamContext) return existingTeamContext;\n\n const existingPromise = teamContextsPromise.get(owner.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initTeamContext(context, config);\n teamContextsPromise.set(owner.login, promise);\n\n return promise.then((teamContext) => {\n teamContextsPromise.delete(owner.login);\n teamContexts.set(owner.login, teamContext);\n return teamContext;\n });\n};\n","/* eslint-disable max-lines */\n\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../pr-handlers/actions/autoMergeIfPossible';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n protectedLabelIds: LabelResponse['id'][];\n\n hasNeedsReview: (labels: LabelResponse[]) => boolean;\n hasRequestedReview: (labels: LabelResponse[]) => boolean;\n hasChangesRequestedReview: (labels: LabelResponse[]) => boolean;\n hasApprovesReview: (labels: LabelResponse[]) => boolean;\n getNeedsReviewGroupNames: (labels: LabelResponse[]) => GroupNames[];\n\n lockPROrPRS(\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise;\n\n getMergeLocked(): number | undefined;\n addMergeLock(prNumber: number): void;\n removeMergeLocked(context: Context, prNumber: number): void;\n reschedule(context: Context, prId: string, prNumber: number): void;\n pushAutomergeQueue(prId: string, prNumber: number): void;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nasync function initRepoContext(\n context: Context,\n config: Config,\n): Promise> {\n const teamContext = await obtainTeamContext(context, config);\n const repoContext = Object.create(teamContext);\n\n const [labels] = await Promise.all([initRepoLabels(context, config)]);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewGroupNames\n .map((key: GroupNames) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const changesRequestedLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].changesRequested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const labelIdToGroupName = new Map();\n reviewGroupNames.forEach((key) => {\n const reviewGroupLabels = config.labels.review[key] as any;\n Object.keys(reviewGroupLabels).forEach((labelKey: string) => {\n labelIdToGroupName.set(labels[reviewGroupLabels[labelKey]].id, key);\n });\n });\n\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: LabelResponse[]) =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: LabelResponse[]): GroupNames[] =>\n labels\n .filter((label) => needsReviewLabelIds.includes(label.id))\n .map((label) => labelIdToGroupName.get(label.id))\n .filter(ExcludesFalsy);\n\n const lock = Lock();\n let lockMergePrNumber: number | undefined;\n const automergeQueue: { id: string; number: number }[] = [];\n\n const lockPROrPRS = (\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n console.log('lock: try to lock pr', { prIdOrIds });\n lock(prIdOrIds, async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n console.log('lock: lock acquired', { prIdOrIds });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { prIdOrIds });\n release();\n reject(err);\n return;\n }\n console.log('lock: release pr', { prIdOrIds });\n release();\n resolve();\n });\n });\n\n const reschedule = (\n context: Context,\n prId: string,\n prNumber: number,\n ) => {\n context.log.info('reschedule', { prNumber });\n setTimeout(() => {\n lockPROrPRS('reschedule', () => {\n return lockPROrPRS(prId, async () => {\n const prResult = await context.github.pulls.get(\n context.repo({\n number: prNumber,\n }),\n );\n await autoMergeIfPossible(context, repoContext, prResult.data);\n });\n });\n }, 1000);\n };\n\n return Object.assign(repoContext, {\n labels,\n protectedLabelIds: [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ],\n hasNeedsReview,\n hasRequestedReview,\n hasChangesRequestedReview,\n hasApprovesReview,\n getNeedsReviewGroupNames,\n\n getMergeLocked: () => lockMergePrNumber,\n addMergeLock: (prNumber): void => {\n console.log('merge lock: lock', { prNumber });\n if (lockMergePrNumber === prNumber) return;\n if (lockMergePrNumber) throw new Error('Already have lock id');\n lockMergePrNumber = prNumber;\n },\n removeMergeLocked: (context, prNumber): void => {\n console.log('merge lock: remove', { prNumber });\n if (lockMergePrNumber !== prNumber) return;\n const next = automergeQueue.shift();\n if (!next) {\n lockMergePrNumber = undefined;\n return;\n }\n\n console.log('merge lock: next', next);\n reschedule(context, next.id, next.number);\n },\n pushAutomergeQueue: (prId, prNumber): void => {\n console.log('merge lock: push queue', {\n prNumber,\n lockMergePrNumber,\n automergeQueue,\n });\n automergeQueue.push({ id: prId, number: prNumber });\n },\n reschedule,\n\n lockPROrPRS,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n context: Context,\n): Promise | RepoContext | null => {\n const owner = context.payload.repository.owner;\n if (!teamConfigs[owner.login]) {\n console.warn(owner.login, Object.keys(teamConfigs));\n return null;\n }\n const key = context.payload.repository.id;\n\n const existingRepoContext = repoContexts.get(key);\n if (existingRepoContext) return existingRepoContext;\n\n const existingPromise = repoContextsPromise.get(key);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initRepoContext(context, teamConfigs[owner.login]);\n repoContextsPromise.set(key, promise);\n\n return promise.then((repoContext) => {\n repoContextsPromise.delete(key);\n repoContexts.set(key, repoContext);\n return repoContext;\n });\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { obtainRepoContext, RepoContext } from '../context/repoContext';\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n) => Promise;\n\nexport type CallbackWithRepoContext = (\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const handlerPullRequestChange = async <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n callback: CallbackWithRepoContext,\n): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n repoContext.lockPROrPRS(String(context.payload.pull_request.id), async () => {\n await callback(repoContext);\n });\n};\n\ntype CallbackContextAndRepoContext = (\n context: Context,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: CallbackContextAndRepoContext,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport const createHandlerPullRequestsChange = (\n getPullRequests: (context: Context) => any[],\n callback: CallbackContextAndRepoContext,\n) => async (context: Context) => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n return repoContext.lockPROrPRS(\n getPullRequests(context).map((pr) => String(pr.id)),\n () => callback(context, repoContext),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoAssignPRToCreator: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext) => {\n if (!repoContext.config.autoAssignToCreator) return;\n\n const pr = context.payload.pull_request;\n if (pr.assignees.length !== 0) return;\n if (pr.user.type === 'Bot') return;\n\n await context.github.issues.addAssignees(\n context.issue({\n assignees: [pr.user.login],\n }),\n );\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(/[\\s-]+\\[?\\s*(ONK-\\d+)\\s*]?\\s*$/, ' $1')\n .replace(/^([A-Za-z]+)[/:]\\s*/, (s, arg1) => `${arg1.toLowerCase()}: `)\n .replace(/^Revert \"([^\"]+)\"$/, 'revert: $1')\n // eslint-disable-next-line unicorn/no-unsafe-regex\n .replace(/^(revert:.*)(\\s+\\(#\\d+\\))$/, '$1');\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { cleanTitle } from './utils/cleanTitle';\n\nexport const editOpenedPR = (\n context: Context,\n repoContext: RepoContext,\n) => {\n if (!repoContext.config.trimTitle) return;\n\n const pr = context.payload.pull_request;\n const title = cleanTitle(pr.title);\n\n if (pr.title !== title) {\n pr.title = title;\n context.github.issues.update(\n context.issue({\n title,\n }),\n );\n }\n};\n","import { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { StatusError, StatusInfo } from '../../teamconfigs/types';\n\ninterface StatusWithInfo {\n name: string;\n info: StatusInfo;\n error?: undefined;\n}\n\ninterface StatusWithError {\n name: string;\n error: StatusError;\n info?: undefined;\n}\n\ntype Status = StatusWithInfo | StatusWithError;\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const lintPR = async (\n context: Context,\n repoContext: RepoContext,\n) => {\n if (!repoContext.config.prLint) return;\n\n const repo = context.payload.repository;\n const pr = context.payload.pull_request;\n\n // do not lint pr from forks\n if (pr.head.repo.id !== repo.id) return;\n\n const isPrFromBot = pr.user.type === 'Bot';\n\n const statuses: Status[] = [];\n\n const errorRule = repoContext.config.prLint.title.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(pr.title);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n return true;\n }\n\n if (rule.status && rule.statusInfoFromMatch) {\n statuses.push({\n name: rule.status,\n info: rule.statusInfoFromMatch(match),\n });\n return false;\n }\n\n return false;\n });\n\n const date = new Date().toISOString();\n\n const hasLintPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find(\n (check) => check.name === `${process.env.NAME}/lint-pr`,\n );\n\n await Promise.all(\n [\n ...statuses.map(({ name, error, info }) =>\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/${name}`,\n sha: pr.head.sha,\n state: (error ? 'failure' : 'success') as 'failure' | 'success',\n target_url: error ? undefined : (info as StatusInfo).url,\n description: error ? error.title : (info as StatusInfo).title,\n }),\n ),\n ),\n hasLintPrCheck &&\n context.github.checks.create(\n context.repo({\n name: `${process.env.NAME}/lint-pr`,\n head_sha: pr.head.sha,\n status: 'completed' as 'completed',\n conclusion: (errorRule ? 'failure' : 'success') as\n | 'failure'\n | 'success',\n started_at: date,\n completed_at: date,\n output: errorRule\n ? errorRule.error\n : {\n title: '✓ Your PR is valid',\n summary: '',\n },\n }),\n ),\n !hasLintPrCheck &&\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/lint-pr`,\n sha: pr.head.sha,\n state: (errorRule ? 'failure' : 'success') as 'failure' | 'success',\n target_url: undefined,\n description: errorRule\n ? errorRule.error.title\n : '✓ Your PR is valid',\n }),\n ),\n ].filter(ExcludesFalsy),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { RepoContext } from '../../context/repoContext';\n\nconst addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n pr: any,\n { state, description }: { state: 'failure' | 'success'; description: string },\n): Promise {\n const hasPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find((check) => check.name === process.env.NAME);\n\n context.log.info('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME as string,\n head_sha: pr.head.sha,\n started_at: pr.created_at,\n status: 'completed',\n conclusion: state,\n completed_at: new Date().toISOString(),\n output: {\n title: description,\n summary: '',\n },\n }),\n );\n } else {\n await context.github.repos.createStatus(\n context.repo({\n context: process.env.NAME,\n sha: pr.head.sha,\n state,\n target_url: undefined,\n description,\n }),\n );\n }\n};\n\nconst createFailedStatusCheck = (\n context: Context,\n pr: any,\n description: string,\n): Promise =>\n addStatusCheck(context, pr, {\n state: 'failure',\n description,\n });\n\nexport const updateStatusCheckFromLabels = (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n labels: LabelResponse[] = pr.labels || [],\n): Promise => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n if (pr.requested_reviewers.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${pr.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Changes requested ! Push commits or discuss changes then re-request a review.',\n );\n }\n\n const needsReviewGroupNames = repoContext.getNeedsReviewGroupNames(labels);\n\n if (needsReviewGroupNames.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${needsReviewGroupNames.join(\n ', ',\n )}. Perhaps request someone ?`,\n );\n }\n\n if (!repoContext.hasApprovesReview(labels)) {\n if (repoContext.config.requiresReviewRequest) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Awaiting review... Perhaps request someone ?',\n );\n }\n }\n\n // if (\n // repoContext.config.requiresReviewRequest &&\n // !repoContext.hasRequestedReview(labels)\n // ) {\n // return createFailedStatusCheck(\n // context,\n // pr,\n // 'You need to request someone to review the PR',\n // );\n // return;\n // }\n // return createInProgressStatusCheck(context);\n // } else if (repoContext.hasApprovesReview(labels)) {\n return addStatusCheck(context, pr, {\n state: 'success',\n description: '✓ PR ready to merge !',\n });\n // }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { GroupLabels } from '../../teamconfigs/types';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends Webhooks.WebhookPayloadPullRequest,\n GroupNames extends string = any\n>(\n context: Context,\n repoContext: RepoContext,\n reviewGroup: GroupNames,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n): Promise => {\n context.log.info('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n const pr = context.payload.pull_request;\n let prLabels = pr.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n\n const toAdd = new Set();\n const toDelete = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = repoContext.config.labels.review[reviewGroup];\n if (!reviewConfig) return undefined;\n\n return reviewConfig[key] && labels[reviewConfig[key]]\n ? labels[reviewConfig[key]]\n : undefined;\n };\n\n if (labelsToAdd) {\n labelsToAdd.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (\n !label ||\n prLabels.some((prLabel: LabelResponse) => prLabel.id === label.id)\n ) {\n return;\n }\n newLabelNames.add(label.name);\n toAdd.add(key);\n });\n }\n\n if (labelsToRemove) {\n labelsToRemove.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label) return;\n const existing = prLabels.find(\n (prLabel: LabelResponse) => prLabel.id === label.id,\n );\n if (existing) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n const result = await context.github.issues.replaceLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(context, repoContext, pr, prLabels);\n // }\n\n return prLabels;\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.opened',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n autoAssignPRToCreator(context, repoContext),\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n context.payload.pull_request.head.ref.startsWith('renovate/')\n ? Promise.resolve(undefined)\n : updateReviewStatus(context, repoContext, 'dev', {\n add: ['needsReview'],\n }),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.closed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const pr = context.payload.pull_request;\n if (pr.merged) {\n await Promise.all([\n repoContext.removeMergeLocked(context, pr.number),\n // TODO delete branch\n ]);\n } else {\n await Promise.all([\n updateReviewStatus(context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.review_requested',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n\n // ignore if sender is self (dismissed review rerequest review)\n if (sender.type === 'Bot') return;\n\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n const shouldWait = false;\n // repoContext.reviewShouldWait(reviewerGroup, pr.requested_reviewers, { includesWaitForGroups: true });\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES' &&\n // In case this is a rerequest for review\n review.user.login !== reviewer.login,\n );\n\n if (!hasChangesRequestedInReviews) {\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved', 'changesRequested'],\n });\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${pr.html_url} !\\n> ${pr.title}`,\n );\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.review_request_removed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n const hasApprovedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'APPROVED',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: [\n // if changes requested by the one which requests was removed\n hasChangesRequestedInReviews && 'changesRequested',\n // if was already approved by another member in the group and has no other requests waiting\n approved && 'approved',\n ],\n // remove labels if has no other requests waiting\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n ],\n });\n }\n\n if (sender.login === reviewer.login) return;\n\n if (repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${pr.html_url}`,\n );\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request_review.submitted',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const pr = context.payload.pull_request;\n const { user: reviewer, state } = (context.payload as any).review;\n if (pr.user.login === reviewer.login) return;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged;\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n // TODO reenable this when accepted can notify request review to slack (dev accepted => design requested) and flag to disable for label (approved design ; still waiting for dev ?)\n // includesWaitForGroups: true,\n },\n );\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const newLabels = await updateReviewStatus(\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !(hasRequestedReviewsForGroup || state === 'changes_requested') &&\n 'requested',\n state === 'approved' &&\n !hasChangesRequestedInReviews &&\n 'changesRequested',\n state === 'changes_requested' && 'approved',\n ],\n },\n );\n\n if (approved && !hasChangesRequestedInReviews) {\n merged = await autoMergeIfPossible(\n context,\n repoContext,\n pr,\n newLabels,\n );\n }\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = pr.html_url;\n\n const message = (() => {\n if (state === 'changes_requested') {\n return `:x: ${mention} requests changes on ${prUrl}`;\n }\n if (state === 'approved') {\n return `:clap: :white_check_mark: ${mention} approves ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n return `:speech_balloon: ${mention} commented on ${prUrl}`;\n })();\n\n repoContext.slack.postMessage(pr.user.login, message);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request_review.dismissed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).review.user;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', 'requested'],\n remove: [\n !hasChangesRequestedInReviews && 'changesRequested',\n 'approved',\n ],\n });\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n repoContext.slack.postMessage(\n pr.user.login,\n `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${pr.html_url}`,\n );\n } else {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${pr.html_url}`,\n );\n }\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(async (context, repoContext) => {\n // old and new sha\n // const { before, after } = context.payload;\n\n await Promise.all([\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(context, repoContext),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { lintPR } from './actions/lintPR';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.edited',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n ]);\n\n await autoMergeIfPossible(context, repoContext);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\n\nexport default (app: Application) => {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n async (context) => {\n const sender = context.payload.sender;\n if (sender.type === 'Bot') return;\n\n await handlerPullRequestChange(context, async (repoContext) => {\n const label = context.payload.label;\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.github.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.github.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(context, repoContext);\n\n if (\n context.payload.action === 'labeled' &&\n label.id ===\n (repoContext.labels['merge/automerge'] &&\n repoContext.labels['merge/automerge'].id)\n ) {\n await autoMergeIfPossible(context, repoContext);\n }\n });\n },\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'check_run.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_run.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_run.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'check_suite.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_suite.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_suite.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n};\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\nimport closedHandler from './pr-handlers/closed';\nimport reviewRequestedHandler from './pr-handlers/reviewRequested';\nimport reviewRequestRemovedHandler from './pr-handlers/reviewRequestRemoved';\nimport reviewSubmittedHandler from './pr-handlers/reviewSubmitted';\nimport reviewDismissedHandler from './pr-handlers/reviewDismissed';\nimport synchromizeHandler from './pr-handlers/synchronize';\nimport editedHandler from './pr-handlers/edited';\nimport labelsChanged from './pr-handlers/labelsChanged';\nimport checkrunCompleted from './pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './pr-handlers/checksuiteCompleted';\n\nif (!process.env.NAME) process.env.NAME = 'reviewflow';\n\n// const getConfig = require('probot-config')\n// const { MongoClient } = require('mongodb');\n\n// const connect = MongoClient.connect(process.env.MONGO_URL);\n// const db = connect.then(client => client.db(process.env.MONGO_DB));\n\n// let config = await getConfig(context, 'reviewflow.yml');\n\n// eslint-disable-next-line import/no-commonjs\nProbot.run((app: Application) => {\n openedHandler(app);\n closedHandler(app);\n reviewRequestedHandler(app);\n reviewRequestRemovedHandler(app);\n\n // app.on('pull_request.closed', async context => {\n\n // });\n\n // app.on('pull_request.reopened', async context => {\n\n // });\n\n reviewSubmittedHandler(app);\n reviewDismissedHandler(app);\n labelsChanged(app);\n synchromizeHandler(app);\n editedHandler(app);\n\n checkrunCompleted(app);\n checksuiteCompleted(app);\n});\n"],"names":["config","slackToken","process","env","ORNIKAR_SLACK_TOKEN","autoAssignToCreator","trimTitle","requiresReviewRequest","prLint","title","regExp","error","summary","bot","status","statusInfoFromMatch","match","issue","url","groups","dev","abarreir","ORNIKAR_EMAIL_DOMAIN","christophehurpeau","arthurflachs","skyline42sh","LentnerStefan","HugoGarrido","CorentinAndre","rigma","Mxime","damienorny","tilap","design","jperriere","CoralineColasse","waitForGroups","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","teamConfigs","ornikar","autoMergeIfPossible","context","repoContext","pr","payload","pull_request","prLabels","autoMergeLabel","find","l","id","log","debug","hasNeedsReview","hasRequestedReview","lockedPrNumber","getMergeLocked","number","info","pushAutomergeQueue","addMergeLock","mergeable","undefined","prResult","github","pulls","get","repo","data","merged","removeMergeLocked","mergeable_state","reschedule","String","head","ref","startsWith","issues","update","body","replace","checks","listForRef","sha","per_page","hasFailedChecks","check_runs","some","check","conclusion","statuses","repos","listStatusesForRef","hasFailedStatuses","state","merge","owner","login","base","mergeResult","merge_method","commit_title","commit_message","Boolean","err","initRepoLabels","listLabelsForRepo","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","description","existingLabel","label","result","createLabel","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","initTeamSlack","mention","postMessage","Promise","resolve","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackClient","WebClient","allUsers","users","limit","members","values","map","email","member","user","profile","console","warn","im","filter","open","channel","membersMap","Map","getUserFromGithubLogin","githubLogin","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","create","all","reviewGroupNames","needsReviewLabelIds","key","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","labelIdToGroupName","reviewGroupLabels","lock","Lock","lockMergePrNumber","automergeQueue","lockPROrPRS","prIdOrIds","callback","reject","createReleaseCallback","release","prId","prNumber","setTimeout","protectedLabelIds","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","Error","next","shift","push","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","createHandlerPullRequestsChange","getPullRequests","autoAssignPRToCreator","assignees","length","type","addAssignees","cleanTitle","trim","s","arg1","toLowerCase","editOpenedPR","lintPR","isPrFromBot","errorRule","rule","exec","date","Date","toISOString","hasLintPrCheck","NAME","createStatus","target_url","head_sha","started_at","completed_at","output","addStatusCheck","hasPrCheck","created_at","createFailedStatusCheck","updateStatusCheckFromLabels","requested_reviewers","rr","join","needsReviewGroupNames","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","newLabelNamesArray","oldLabels","size","replaceLabels","app","on","sender","reviewer","requested_reviewer","reviews","listReviews","hasChangesRequestedInReviews","html_url","hasRequestedReviewsForGroup","hasApprovedInReviews","newLabels","prUrl","message","action","removeLabel","addLabels","check_run","pull_requests","check_suite","Probot","run","openedHandler","closedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","labelsChanged","synchromizeHandler","editedHandler","checkrunCompleted","checksuiteCompleted"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index-node10.cjs.js b/dist/index-node10.cjs.js index b34c24944..c3c13ef3a 100644 --- a/dist/index-node10.cjs.js +++ b/dist/index-node10.cjs.js @@ -256,13 +256,17 @@ const autoMergeIfPossible = async (context, repoContext, pr = context.payload.pu } if (pr.merged) { + repoContext.removeMergeLocked(context, pr.number); context.log.info(`automerge not possible: already merged pr ${pr.id}`); return false; } + context.log.info(`automerge?: ${pr.id}, mergeable=${pr.mergeable} state=${pr.mergeable_state}`); + if (!pr.mergeable) { - if (pr.mergeable_state === undefined) { - // GitHub is determining whether the pull request is mergeable + if (!pr.mergeable_state) { + context.log.info(`automerge not possible: rescheduling ${pr.id}`); // GitHub is determining whether the pull request is mergeable + repoContext.reschedule(context, String(pr.id), pr.number); return false; } diff --git a/dist/index-node10.cjs.js.map b/dist/index-node10.cjs.js.map index a8e442553..0b0c5bec4 100644 --- a/dist/index-node10.cjs.js.map +++ b/dist/index-node10.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"index-node10.cjs.js","sources":["../src/teamconfigs/ornikar.ts","../src/teamconfigs/christophehurpeau.ts","../src/teamconfigs/index.ts","../src/pr-handlers/actions/autoMergeIfPossible.ts","../src/context/initRepoLabels.ts","../src/context/utils.ts","../src/context/initTeamSlack.ts","../src/context/teamContext.ts","../src/context/repoContext.ts","../src/pr-handlers/utils.ts","../src/pr-handlers/actions/autoAssignPRToCreator.ts","../src/pr-handlers/actions/utils/cleanTitle.ts","../src/pr-handlers/actions/editOpenedPR.ts","../src/pr-handlers/actions/lintPR.ts","../src/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/pr-handlers/actions/updateReviewStatus.ts","../src/pr-handlers/opened.ts","../src/pr-handlers/closed.ts","../src/pr-handlers/reviewRequested.ts","../src/pr-handlers/reviewRequestRemoved.ts","../src/pr-handlers/reviewSubmitted.ts","../src/pr-handlers/reviewDismissed.ts","../src/pr-handlers/synchronize.ts","../src/pr-handlers/edited.ts","../src/pr-handlers/labelsChanged.ts","../src/pr-handlers/checkrunCompleted.ts","../src/pr-handlers/checksuiteCompleted.ts","../src/index.ts"],"sourcesContent":["import { Config } from './types';\n\nconst config: Config<'dev' | 'design'> = {\n slackToken: process.env.ORNIKAR_SLACK_TOKEN,\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: true,\n prLint: {\n title: [\n {\n regExp:\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\\(([a-z\\-/]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://github.com/marionebl/commitlint/tree/master/%40commitlint/config-conventional',\n },\n },\n {\n bot: false,\n regExp: /\\s(ONK-(\\d+)|\\[no issue])$/,\n error: {\n title: 'Title does not have JIRA issue',\n summary: 'The PR title should end with ONK-0000, or [no issue]',\n },\n status: 'jira-issue',\n statusInfoFromMatch: (match) => {\n const issue = match[1];\n if (issue === '[no issue]') {\n return {\n title: 'No issue',\n summary: '',\n };\n }\n return {\n url: `https://ornikar.atlassian.net/browse/${issue}`,\n title: `JIRA issue: ${issue}`,\n summary: `[${issue}](https://ornikar.atlassian.net/browse/${issue})`,\n };\n },\n },\n ],\n },\n\n groups: {\n dev: {\n abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n skyline42sh: `alexandre.charbonnier${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n design: {\n jperriere: `julien${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CoralineColasse: `coraline${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n },\n waitForGroups: {\n dev: [],\n design: ['dev'],\n },\n labels: {\n list: {\n // /* ci */\n // 'ci/in-progress': { name: ':green_heart: ci/in-progress', color: '#0052cc' },\n // 'ci/fail': { name: ':green_heart: ci/fail', color: '#e11d21' },\n // 'ci/passed': { name: ':green_heart: ci/passed', color: '#86f9b4' },\n\n /* code */\n 'code/needs-review': {\n name: ':ok_hand: code/needs-review',\n color: '#FFD57F',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#B2E1FF',\n },\n 'code/changes-requested': {\n name: ':ok_hand: code/changes-requested',\n color: '#e11d21',\n },\n 'code/approved': {\n name: ':ok_hand: code/approved',\n color: '#64DD17',\n },\n\n /* design */\n 'design/needs-review': {\n name: ':art: design/needs-review',\n color: '#FFD57F',\n },\n 'design/review-requested': {\n name: ':art: design/review-requested',\n color: '#B2E1FF',\n },\n 'design/changes-requested': {\n name: ':art: design/changes-requested',\n color: '#e11d21',\n },\n 'design/approved': {\n name: ':art: design/approved',\n color: '#64DD17',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n design: {\n needsReview: 'design/needs-review',\n requested: 'design/review-requested',\n changesRequested: 'design/changes-requested',\n approved: 'design/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config } from './types';\n\nconst config: Config<'dev'> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prLint: {\n title: [\n {\n regExp:\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\\(([a-z\\-/]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://github.com/marionebl/commitlint/tree/master/%40commitlint/config-conventional',\n },\n },\n ],\n },\n groups: {\n dev: {\n christophehurpeau: 'christophe@hurpeau.com',\n 'chris-reviewflow': 'christophe.hurpeau+reviewflow@gmail.com',\n },\n },\n waitForGroups: {\n dev: [],\n },\n labels: {\n list: {\n // /* ci */\n // 'ci/in-progress': { name: ':green_heart: ci/in-progress', color: '#0052cc' },\n // 'ci/fail': { name: ':green_heart: ci/fail', color: '#e11d21' },\n // 'ci/passed': { name: ':green_heart: ci/passed', color: '#86f9b4' },\n\n /* code */\n 'code/needs-review': {\n name: ':ok_hand: code/needs-review',\n color: '#FFD57F',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#B2E1FF',\n },\n 'code/changes-requested': {\n name: ':ok_hand: code/changes-requested',\n color: '#e11d21',\n },\n 'code/approved': {\n name: ':ok_hand: code/approved',\n color: '#64DD17',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n 'merge/delete-branch': {\n name: ':recycle: delete branch after merge',\n color: '#64DD17',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config as ConfigType } from './types';\nimport ornikar from './ornikar';\nimport christophehurpeau from './christophehurpeau';\n\nexport type Config = ConfigType;\n\nexport const teamConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n};\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","import { Context } from 'probot';\n// eslint-disable-next-line import/no-cycle\nimport { RepoContext } from '../../context/repoContext';\nimport { LabelResponse } from '../../context/initRepoLabels';\n\nexport const autoMergeIfPossible = async (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n prLabels: LabelResponse[] = pr.labels,\n): Promise => {\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return false;\n\n if (!prLabels.find((l: LabelResponse) => l.id === autoMergeLabel.id)) {\n context.log.debug('automerge not possible: no label');\n return false;\n }\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n context.log.debug('automerge not possible: blocking labels');\n return false;\n }\n\n const lockedPrNumber = repoContext.getMergeLocked();\n if (lockedPrNumber && lockedPrNumber !== pr.number) {\n context.log.info(`automerge not possible: locked pr ${pr.id}`);\n repoContext.pushAutomergeQueue(pr.id, pr.number);\n return false;\n }\n\n repoContext.addMergeLock(pr.number);\n\n if (pr.mergeable === undefined) {\n const prResult = await context.github.pulls.get(\n context.repo({\n number: pr.number,\n }),\n );\n pr = prResult.data;\n }\n\n if (pr.merged) {\n context.log.info(`automerge not possible: already merged pr ${pr.id}`);\n return false;\n }\n\n if (!pr.mergeable) {\n if (pr.mergeable_state === undefined) {\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, String(pr.id), pr.number);\n return false;\n }\n\n if (pr.head.ref.startsWith('renovate/')) {\n if (pr.mergeable_state === 'behind' || pr.mergeable_state === 'dirty') {\n context.log.info(\n `automerge not possible: rebase renovate branch pr ${pr.id}`,\n );\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n\n await context.github.issues.update(\n context.repo({\n number: pr.number,\n body: pr.body.replace(\n '[ ] ',\n '[x] ',\n ),\n }),\n );\n return false;\n } else {\n const checks = await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const hasFailedChecks = checks.data.check_runs.some(\n (check) => check.conclusion === 'failure',\n );\n if (hasFailedChecks) {\n context.log.info(`automerge not possible: failed check pr ${pr.id}`);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n\n const statuses = await context.github.repos.listStatusesForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const hasFailedStatuses = statuses.data.some(\n (status) => status.state === 'failure',\n );\n if (hasFailedStatuses) {\n context.log.info(`automerge not possible: failed status pr ${pr.id}`);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n }\n\n context.log.info(\n `automerge not possible: renovate with mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n if (pr.mergeable_state === 'behind') {\n context.log.info('automerge not possible: update branch');\n\n await context.github.repos.merge({\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n base: pr.head.name,\n head: pr.head.name,\n });\n\n return false;\n }\n\n repoContext.removeMergeLocked(context, pr.number);\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pr.number}`);\n const mergeResult = await context.github.pulls.merge({\n merge_method: 'squash',\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n number: pr.number,\n commit_title: `${pr.title} (#${pr.number})`,\n commit_message: '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removeMergeLocked(context, pr.number);\n return Boolean(mergeResult.data.merged);\n } catch (err) {\n context.log.info('could not merge:', err);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\n\nexport interface LabelResponse {\n id: number;\n node_id: string;\n url: string;\n name: string;\n description: string;\n color: string;\n default: boolean;\n}\n\nexport interface Labels {\n [key: string]: LabelResponse;\n}\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const { data: labels } = await context.github.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n const finalLabels: Record = {};\n\n for (const [labelKey, labelConfig] of Object.entries(config.labels.list)) {\n const labelColor = labelConfig.color.slice(1);\n const description = `Generated by review-flow for ${labelKey}`;\n\n let existingLabel = labels.find((label) => label.name === labelConfig.name);\n if (!existingLabel) {\n existingLabel = labels.find((label) => label.description === description);\n }\n if (!existingLabel) {\n if (labelKey === 'design/needs-review') {\n existingLabel = labels.find(\n (label) => label.name === 'needs-design-review',\n );\n }\n if (labelKey === 'design/approved') {\n existingLabel = labels.find(\n (label) => label.name === 'design-reviewed',\n );\n }\n }\n\n if (!existingLabel) {\n const result = await context.github.issues.createLabel(\n context.repo({\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else if (\n existingLabel.name !== labelConfig.name ||\n existingLabel.color !== labelColor // ||\n // TODO: description is never updated\n // existingLabel.description !== description\n ) {\n context.log.info('Needs to update label', {\n current_name: existingLabel.name,\n name: existingLabel.name !== labelConfig.name && labelConfig.name,\n color: existingLabel.color !== labelColor && labelColor,\n description: existingLabel.description !== description && description,\n });\n\n const result = await context.github.issues.updateLabel(\n context.repo({\n current_name: existingLabel.name,\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else {\n finalLabels[labelKey] = existingLabel;\n }\n }\n\n return finalLabels;\n};\n","export const getKeys = (o: T): (keyof T)[] =>\n Object.keys(o) as (keyof T)[];\n","import { WebClient } from '@slack/web-api';\nimport { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { getKeys } from './utils';\n\nexport interface TeamSlack {\n mention: (githubLogin: string) => string;\n postMessage: (githubLogin: string, text: string) => Promise;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const initTeamSlack = async (\n context: Context,\n config: Config,\n): Promise => {\n if (!config.slackToken) {\n return {\n mention: (githubLogin: string) => '',\n postMessage: (githubLogin: string, text: string) => Promise.resolve(),\n };\n }\n\n const githubLoginToSlackEmail = getKeys(config.groups).reduce<{\n [login: string]: string;\n }>((acc, groupName) => {\n Object.assign(acc, config.groups[groupName]);\n return acc;\n }, {});\n\n const slackClient = new WebClient(config.slackToken);\n const allUsers: any = await slackClient.users.list({ limit: 200 });\n const members: [string, { member: any; im: any }][] = Object.values(\n githubLoginToSlackEmail,\n )\n .map((email) => {\n const member = allUsers.members.find(\n (user: any) => user.profile.email === email,\n );\n if (!member) {\n console.warn(`Could not find user ${email}`);\n return;\n }\n return [email, { member, im: undefined }] as [\n string,\n { member: any; im: any }\n ];\n })\n .filter(ExcludesFalsy);\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.im.open({ user: user.member.id });\n user.im = im.channel;\n } catch (err) {\n console.error(err);\n }\n }\n\n const membersMap = new Map(members);\n\n const getUserFromGithubLogin = (githubLogin: string) => {\n const email = githubLoginToSlackEmail[githubLogin];\n if (!email) return null;\n return membersMap.get(email);\n };\n\n return {\n mention: (githubLogin: string) => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (githubLogin: string, text: string) => {\n context.log.info('send slack', { githubLogin, text });\n if (process.env.DRY_RUN) return;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return;\n await slackClient.chat.postMessage({\n channel: user.im.id,\n text,\n });\n },\n };\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { initTeamSlack, TeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface TeamContext {\n config: Config;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => string | undefined;\n getReviewerGroups: (githubLogins: string[]) => string[];\n reviewShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n}\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nconst initTeamContext = async (\n context: Context,\n config: Config,\n): Promise => {\n const slackPromise = initTeamSlack(context, config);\n\n const githubLoginToGroup = getKeys(config.groups).reduce>(\n (acc, groupName) => {\n Object.keys(config.groups[groupName]).forEach((login) => {\n acc.set(login, groupName);\n });\n return acc;\n },\n new Map(),\n );\n\n const getReviewerGroups = (githubLogins: string[]) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(Boolean),\n ),\n ];\n\n return {\n config,\n getReviewerGroup: (githubLogin) => githubLoginToGroup.get(githubLogin),\n getReviewerGroups: (githubLogins) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ],\n\n reviewShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ) => {\n if (!reviewerGroup) return false;\n\n const requestedReviewerGroups = getReviewerGroups(\n requestedReviewers.map((request) => request.login),\n );\n\n // contains another request of a reviewer in the same group\n if (\n includesReviewerGroup &&\n requestedReviewerGroups.includes(reviewerGroup)\n ) {\n return true;\n }\n\n // contains a request from a dependent group\n if (config.waitForGroups && includesWaitForGroups) {\n const waitForGroups = config.waitForGroups;\n return requestedReviewerGroups.some((group) =>\n waitForGroups[reviewerGroup].includes(group),\n );\n }\n\n return false;\n },\n\n slack: await slackPromise,\n };\n};\n\nconst teamContextsPromise = new Map();\nconst teamContexts = new Map();\n\nexport const obtainTeamContext = (\n context: Context,\n config: Config,\n): Promise => {\n const owner = context.payload.repository.owner;\n\n const existingTeamContext = teamContexts.get(owner.login);\n if (existingTeamContext) return existingTeamContext;\n\n const existingPromise = teamContextsPromise.get(owner.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initTeamContext(context, config);\n teamContextsPromise.set(owner.login, promise);\n\n return promise.then((teamContext) => {\n teamContextsPromise.delete(owner.login);\n teamContexts.set(owner.login, teamContext);\n return teamContext;\n });\n};\n","/* eslint-disable max-lines */\n\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../pr-handlers/actions/autoMergeIfPossible';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n protectedLabelIds: LabelResponse['id'][];\n\n hasNeedsReview: (labels: LabelResponse[]) => boolean;\n hasRequestedReview: (labels: LabelResponse[]) => boolean;\n hasChangesRequestedReview: (labels: LabelResponse[]) => boolean;\n hasApprovesReview: (labels: LabelResponse[]) => boolean;\n getNeedsReviewGroupNames: (labels: LabelResponse[]) => GroupNames[];\n\n lockPROrPRS(\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise;\n\n getMergeLocked(): number | undefined;\n addMergeLock(prNumber: number): void;\n removeMergeLocked(context: Context, prNumber: number): void;\n reschedule(context: Context, prId: string, prNumber: number): void;\n pushAutomergeQueue(prId: string, prNumber: number): void;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nasync function initRepoContext(\n context: Context,\n config: Config,\n): Promise> {\n const teamContext = await obtainTeamContext(context, config);\n const repoContext = Object.create(teamContext);\n\n const [labels] = await Promise.all([initRepoLabels(context, config)]);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewGroupNames\n .map((key: GroupNames) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const changesRequestedLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].changesRequested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const labelIdToGroupName = new Map();\n reviewGroupNames.forEach((key) => {\n const reviewGroupLabels = config.labels.review[key] as any;\n Object.keys(reviewGroupLabels).forEach((labelKey: string) => {\n labelIdToGroupName.set(labels[reviewGroupLabels[labelKey]].id, key);\n });\n });\n\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: LabelResponse[]) =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: LabelResponse[]): GroupNames[] =>\n labels\n .filter((label) => needsReviewLabelIds.includes(label.id))\n .map((label) => labelIdToGroupName.get(label.id))\n .filter(ExcludesFalsy);\n\n const lock = Lock();\n let lockMergePrNumber: number | undefined;\n const automergeQueue: { id: string; number: number }[] = [];\n\n const lockPROrPRS = (\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n console.log('lock: try to lock pr', { prIdOrIds });\n lock(prIdOrIds, async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n console.log('lock: lock acquired', { prIdOrIds });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { prIdOrIds });\n release();\n reject(err);\n return;\n }\n console.log('lock: release pr', { prIdOrIds });\n release();\n resolve();\n });\n });\n\n const reschedule = (\n context: Context,\n prId: string,\n prNumber: number,\n ) => {\n context.log.info('reschedule', { prNumber });\n setTimeout(() => {\n lockPROrPRS('reschedule', () => {\n return lockPROrPRS(prId, async () => {\n const prResult = await context.github.pulls.get(\n context.repo({\n number: prNumber,\n }),\n );\n await autoMergeIfPossible(context, repoContext, prResult.data);\n });\n });\n }, 1000);\n };\n\n return Object.assign(repoContext, {\n labels,\n protectedLabelIds: [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ],\n hasNeedsReview,\n hasRequestedReview,\n hasChangesRequestedReview,\n hasApprovesReview,\n getNeedsReviewGroupNames,\n\n getMergeLocked: () => lockMergePrNumber,\n addMergeLock: (prNumber): void => {\n console.log('merge lock: lock', { prNumber });\n if (lockMergePrNumber === prNumber) return;\n if (lockMergePrNumber) throw new Error('Already have lock id');\n lockMergePrNumber = prNumber;\n },\n removeMergeLocked: (context, prNumber): void => {\n console.log('merge lock: remove', { prNumber });\n if (lockMergePrNumber !== prNumber) return;\n const next = automergeQueue.shift();\n if (!next) {\n lockMergePrNumber = undefined;\n return;\n }\n\n console.log('merge lock: next', next);\n reschedule(context, next.id, next.number);\n },\n pushAutomergeQueue: (prId, prNumber): void => {\n console.log('merge lock: push queue', {\n prNumber,\n lockMergePrNumber,\n automergeQueue,\n });\n automergeQueue.push({ id: prId, number: prNumber });\n },\n reschedule,\n\n lockPROrPRS,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n context: Context,\n): Promise | RepoContext | null => {\n const owner = context.payload.repository.owner;\n if (!teamConfigs[owner.login]) {\n console.warn(owner.login, Object.keys(teamConfigs));\n return null;\n }\n const key = context.payload.repository.id;\n\n const existingRepoContext = repoContexts.get(key);\n if (existingRepoContext) return existingRepoContext;\n\n const existingPromise = repoContextsPromise.get(key);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initRepoContext(context, teamConfigs[owner.login]);\n repoContextsPromise.set(key, promise);\n\n return promise.then((repoContext) => {\n repoContextsPromise.delete(key);\n repoContexts.set(key, repoContext);\n return repoContext;\n });\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { obtainRepoContext, RepoContext } from '../context/repoContext';\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n) => Promise;\n\nexport type CallbackWithRepoContext = (\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const handlerPullRequestChange = async <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n callback: CallbackWithRepoContext,\n): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n repoContext.lockPROrPRS(String(context.payload.pull_request.id), async () => {\n await callback(repoContext);\n });\n};\n\ntype CallbackContextAndRepoContext = (\n context: Context,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: CallbackContextAndRepoContext,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport const createHandlerPullRequestsChange = (\n getPullRequests: (context: Context) => any[],\n callback: CallbackContextAndRepoContext,\n) => async (context: Context) => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n return repoContext.lockPROrPRS(\n getPullRequests(context).map((pr) => String(pr.id)),\n () => callback(context, repoContext),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoAssignPRToCreator: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext) => {\n if (!repoContext.config.autoAssignToCreator) return;\n\n const pr = context.payload.pull_request;\n if (pr.assignees.length !== 0) return;\n if (pr.user.type === 'Bot') return;\n\n await context.github.issues.addAssignees(\n context.issue({\n assignees: [pr.user.login],\n }),\n );\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(/[\\s-]+\\[?\\s*(ONK-\\d+)\\s*]?\\s*$/, ' $1')\n .replace(/^([A-Za-z]+)[/:]\\s*/, (s, arg1) => `${arg1.toLowerCase()}: `)\n .replace(/^Revert \"([^\"]+)\"$/, 'revert: $1')\n // eslint-disable-next-line unicorn/no-unsafe-regex\n .replace(/^(revert:.*)(\\s+\\(#\\d+\\))$/, '$1');\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { cleanTitle } from './utils/cleanTitle';\n\nexport const editOpenedPR = (\n context: Context,\n repoContext: RepoContext,\n) => {\n if (!repoContext.config.trimTitle) return;\n\n const pr = context.payload.pull_request;\n const title = cleanTitle(pr.title);\n\n if (pr.title !== title) {\n pr.title = title;\n context.github.issues.update(\n context.issue({\n title,\n }),\n );\n }\n};\n","import { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { StatusError, StatusInfo } from '../../teamconfigs/types';\n\ninterface StatusWithInfo {\n name: string;\n info: StatusInfo;\n error?: undefined;\n}\n\ninterface StatusWithError {\n name: string;\n error: StatusError;\n info?: undefined;\n}\n\ntype Status = StatusWithInfo | StatusWithError;\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const lintPR = async (\n context: Context,\n repoContext: RepoContext,\n) => {\n if (!repoContext.config.prLint) return;\n\n const repo = context.payload.repository;\n const pr = context.payload.pull_request;\n\n // do not lint pr from forks\n if (pr.head.repo.id !== repo.id) return;\n\n const isPrFromBot = pr.user.type === 'Bot';\n\n const statuses: Status[] = [];\n\n const errorRule = repoContext.config.prLint.title.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(pr.title);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n return true;\n }\n\n if (rule.status && rule.statusInfoFromMatch) {\n statuses.push({\n name: rule.status,\n info: rule.statusInfoFromMatch(match),\n });\n return false;\n }\n\n return false;\n });\n\n const date = new Date().toISOString();\n\n const hasLintPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find(\n (check) => check.name === `${process.env.NAME}/lint-pr`,\n );\n\n await Promise.all(\n [\n ...statuses.map(({ name, error, info }) =>\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/${name}`,\n sha: pr.head.sha,\n state: (error ? 'failure' : 'success') as 'failure' | 'success',\n target_url: error ? undefined : (info as StatusInfo).url,\n description: error ? error.title : (info as StatusInfo).title,\n }),\n ),\n ),\n hasLintPrCheck &&\n context.github.checks.create(\n context.repo({\n name: `${process.env.NAME}/lint-pr`,\n head_sha: pr.head.sha,\n status: 'completed' as 'completed',\n conclusion: (errorRule ? 'failure' : 'success') as\n | 'failure'\n | 'success',\n started_at: date,\n completed_at: date,\n output: errorRule\n ? errorRule.error\n : {\n title: '✓ Your PR is valid',\n summary: '',\n },\n }),\n ),\n !hasLintPrCheck &&\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/lint-pr`,\n sha: pr.head.sha,\n state: (errorRule ? 'failure' : 'success') as 'failure' | 'success',\n target_url: undefined,\n description: errorRule\n ? errorRule.error.title\n : '✓ Your PR is valid',\n }),\n ),\n ].filter(ExcludesFalsy),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { RepoContext } from '../../context/repoContext';\n\nconst addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n pr: any,\n { state, description }: { state: 'failure' | 'success'; description: string },\n): Promise {\n const hasPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find((check) => check.name === process.env.NAME);\n\n context.log.info('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME as string,\n head_sha: pr.head.sha,\n started_at: pr.created_at,\n status: 'completed',\n conclusion: state,\n completed_at: new Date().toISOString(),\n output: {\n title: description,\n summary: '',\n },\n }),\n );\n } else {\n await context.github.repos.createStatus(\n context.repo({\n context: process.env.NAME,\n sha: pr.head.sha,\n state,\n target_url: undefined,\n description,\n }),\n );\n }\n};\n\nconst createFailedStatusCheck = (\n context: Context,\n pr: any,\n description: string,\n): Promise =>\n addStatusCheck(context, pr, {\n state: 'failure',\n description,\n });\n\nexport const updateStatusCheckFromLabels = (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n labels: LabelResponse[] = pr.labels || [],\n): Promise => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n if (pr.requested_reviewers.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${pr.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Changes requested ! Push commits or discuss changes then re-request a review.',\n );\n }\n\n const needsReviewGroupNames = repoContext.getNeedsReviewGroupNames(labels);\n\n if (needsReviewGroupNames.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${needsReviewGroupNames.join(\n ', ',\n )}. Perhaps request someone ?`,\n );\n }\n\n if (!repoContext.hasApprovesReview(labels)) {\n if (repoContext.config.requiresReviewRequest) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Awaiting review... Perhaps request someone ?',\n );\n }\n }\n\n // if (\n // repoContext.config.requiresReviewRequest &&\n // !repoContext.hasRequestedReview(labels)\n // ) {\n // return createFailedStatusCheck(\n // context,\n // pr,\n // 'You need to request someone to review the PR',\n // );\n // return;\n // }\n // return createInProgressStatusCheck(context);\n // } else if (repoContext.hasApprovesReview(labels)) {\n return addStatusCheck(context, pr, {\n state: 'success',\n description: '✓ PR ready to merge !',\n });\n // }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { GroupLabels } from '../../teamconfigs/types';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends Webhooks.WebhookPayloadPullRequest,\n GroupNames extends string = any\n>(\n context: Context,\n repoContext: RepoContext,\n reviewGroup: GroupNames,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n): Promise => {\n context.log.info('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n const pr = context.payload.pull_request;\n let prLabels = pr.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n\n const toAdd = new Set();\n const toDelete = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = repoContext.config.labels.review[reviewGroup];\n if (!reviewConfig) return undefined;\n\n return reviewConfig[key] && labels[reviewConfig[key]]\n ? labels[reviewConfig[key]]\n : undefined;\n };\n\n if (labelsToAdd) {\n labelsToAdd.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (\n !label ||\n prLabels.some((prLabel: LabelResponse) => prLabel.id === label.id)\n ) {\n return;\n }\n newLabelNames.add(label.name);\n toAdd.add(key);\n });\n }\n\n if (labelsToRemove) {\n labelsToRemove.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label) return;\n const existing = prLabels.find(\n (prLabel: LabelResponse) => prLabel.id === label.id,\n );\n if (existing) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n const result = await context.github.issues.replaceLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(context, repoContext, pr, prLabels);\n // }\n\n return prLabels;\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.opened',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n autoAssignPRToCreator(context, repoContext),\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n context.payload.pull_request.head.ref.startsWith('renovate/')\n ? Promise.resolve(undefined)\n : updateReviewStatus(context, repoContext, 'dev', {\n add: ['needsReview'],\n }),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.closed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const pr = context.payload.pull_request;\n if (pr.merged) {\n await Promise.all([\n repoContext.removeMergeLocked(context, pr.number),\n // TODO delete branch\n ]);\n } else {\n await Promise.all([\n updateReviewStatus(context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.review_requested',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n\n // ignore if sender is self (dismissed review rerequest review)\n if (sender.type === 'Bot') return;\n\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n const shouldWait = false;\n // repoContext.reviewShouldWait(reviewerGroup, pr.requested_reviewers, { includesWaitForGroups: true });\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES' &&\n // In case this is a rerequest for review\n review.user.login !== reviewer.login,\n );\n\n if (!hasChangesRequestedInReviews) {\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved', 'changesRequested'],\n });\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${pr.html_url} !\\n> ${pr.title}`,\n );\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.review_request_removed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n const hasApprovedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'APPROVED',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: [\n // if changes requested by the one which requests was removed\n hasChangesRequestedInReviews && 'changesRequested',\n // if was already approved by another member in the group and has no other requests waiting\n approved && 'approved',\n ],\n // remove labels if has no other requests waiting\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n ],\n });\n }\n\n if (sender.login === reviewer.login) return;\n\n if (repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${pr.html_url}`,\n );\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request_review.submitted',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const pr = context.payload.pull_request;\n const { user: reviewer, state } = (context.payload as any).review;\n if (pr.user.login === reviewer.login) return;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged;\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n // TODO reenable this when accepted can notify request review to slack (dev accepted => design requested) and flag to disable for label (approved design ; still waiting for dev ?)\n // includesWaitForGroups: true,\n },\n );\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const newLabels = await updateReviewStatus(\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !(hasRequestedReviewsForGroup || state === 'changes_requested') &&\n 'requested',\n state === 'approved' &&\n !hasChangesRequestedInReviews &&\n 'changesRequested',\n state === 'changes_requested' && 'approved',\n ],\n },\n );\n\n if (approved && !hasChangesRequestedInReviews) {\n merged = await autoMergeIfPossible(\n context,\n repoContext,\n pr,\n newLabels,\n );\n }\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = pr.html_url;\n\n const message = (() => {\n if (state === 'changes_requested') {\n return `:x: ${mention} requests changes on ${prUrl}`;\n }\n if (state === 'approved') {\n return `:clap: :white_check_mark: ${mention} approves ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n return `:speech_balloon: ${mention} commented on ${prUrl}`;\n })();\n\n repoContext.slack.postMessage(pr.user.login, message);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request_review.dismissed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).review.user;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', 'requested'],\n remove: [\n !hasChangesRequestedInReviews && 'changesRequested',\n 'approved',\n ],\n });\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n repoContext.slack.postMessage(\n pr.user.login,\n `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${pr.html_url}`,\n );\n } else {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${pr.html_url}`,\n );\n }\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(async (context, repoContext) => {\n // old and new sha\n // const { before, after } = context.payload;\n\n await Promise.all([\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(context, repoContext),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { lintPR } from './actions/lintPR';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.edited',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n ]);\n\n await autoMergeIfPossible(context, repoContext);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\n\nexport default (app: Application) => {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n async (context) => {\n const sender = context.payload.sender;\n if (sender.type === 'Bot') return;\n\n await handlerPullRequestChange(context, async (repoContext) => {\n const label = context.payload.label;\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.github.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.github.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(context, repoContext);\n\n if (\n context.payload.action === 'labeled' &&\n label.id ===\n (repoContext.labels['merge/automerge'] &&\n repoContext.labels['merge/automerge'].id)\n ) {\n await autoMergeIfPossible(context, repoContext);\n }\n });\n },\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'check_run.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_run.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_run.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'check_suite.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_suite.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_suite.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n};\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\nimport closedHandler from './pr-handlers/closed';\nimport reviewRequestedHandler from './pr-handlers/reviewRequested';\nimport reviewRequestRemovedHandler from './pr-handlers/reviewRequestRemoved';\nimport reviewSubmittedHandler from './pr-handlers/reviewSubmitted';\nimport reviewDismissedHandler from './pr-handlers/reviewDismissed';\nimport synchromizeHandler from './pr-handlers/synchronize';\nimport editedHandler from './pr-handlers/edited';\nimport labelsChanged from './pr-handlers/labelsChanged';\nimport checkrunCompleted from './pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './pr-handlers/checksuiteCompleted';\n\nif (!process.env.NAME) process.env.NAME = 'reviewflow';\n\n// const getConfig = require('probot-config')\n// const { MongoClient } = require('mongodb');\n\n// const connect = MongoClient.connect(process.env.MONGO_URL);\n// const db = connect.then(client => client.db(process.env.MONGO_DB));\n\n// let config = await getConfig(context, 'reviewflow.yml');\n\n// eslint-disable-next-line import/no-commonjs\nProbot.run((app: Application) => {\n openedHandler(app);\n closedHandler(app);\n reviewRequestedHandler(app);\n reviewRequestRemovedHandler(app);\n\n // app.on('pull_request.closed', async context => {\n\n // });\n\n // app.on('pull_request.reopened', async context => {\n\n // });\n\n reviewSubmittedHandler(app);\n reviewDismissedHandler(app);\n labelsChanged(app);\n synchromizeHandler(app);\n editedHandler(app);\n\n checkrunCompleted(app);\n checksuiteCompleted(app);\n});\n"],"names":["config","slackToken","process","env","ORNIKAR_SLACK_TOKEN","autoAssignToCreator","trimTitle","requiresReviewRequest","prLint","title","regExp","error","summary","bot","status","statusInfoFromMatch","match","issue","url","groups","dev","abarreir","ORNIKAR_EMAIL_DOMAIN","christophehurpeau","arthurflachs","skyline42sh","LentnerStefan","HugoGarrido","CorentinAndre","rigma","Mxime","damienorny","tilap","design","jperriere","CoralineColasse","waitForGroups","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","teamConfigs","ornikar","autoMergeIfPossible","context","repoContext","pr","payload","pull_request","prLabels","autoMergeLabel","find","l","id","log","debug","hasNeedsReview","hasRequestedReview","lockedPrNumber","getMergeLocked","number","info","pushAutomergeQueue","addMergeLock","mergeable","undefined","prResult","github","pulls","get","repo","data","merged","mergeable_state","reschedule","String","head","ref","startsWith","issues","update","body","replace","checks","listForRef","sha","per_page","hasFailedChecks","check_runs","some","check","conclusion","removeMergeLocked","statuses","repos","listStatusesForRef","hasFailedStatuses","state","merge","owner","login","base","mergeResult","merge_method","commit_title","commit_message","Boolean","err","initRepoLabels","listLabelsForRepo","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","description","existingLabel","label","result","createLabel","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","initTeamSlack","mention","postMessage","Promise","resolve","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackClient","WebClient","allUsers","users","limit","members","values","map","email","member","user","profile","console","warn","im","filter","open","channel","membersMap","Map","getUserFromGithubLogin","githubLogin","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","create","all","reviewGroupNames","needsReviewLabelIds","key","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","labelIdToGroupName","reviewGroupLabels","lock","Lock","lockMergePrNumber","automergeQueue","lockPROrPRS","prIdOrIds","callback","reject","createReleaseCallback","release","prId","prNumber","setTimeout","protectedLabelIds","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","Error","next","shift","push","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","createHandlerPullRequestsChange","getPullRequests","autoAssignPRToCreator","assignees","length","type","addAssignees","cleanTitle","trim","s","arg1","toLowerCase","editOpenedPR","lintPR","isPrFromBot","errorRule","rule","exec","date","Date","toISOString","hasLintPrCheck","NAME","createStatus","target_url","head_sha","started_at","completed_at","output","addStatusCheck","hasPrCheck","created_at","createFailedStatusCheck","updateStatusCheckFromLabels","requested_reviewers","rr","join","needsReviewGroupNames","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","newLabelNamesArray","oldLabels","size","replaceLabels","app","on","sender","reviewer","requested_reviewer","reviews","listReviews","hasChangesRequestedInReviews","html_url","hasRequestedReviewsForGroup","hasApprovedInReviews","newLabels","prUrl","message","action","removeLabel","addLabels","check_run","pull_requests","check_suite","Probot","run","openedHandler","closedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","labelsChanged","synchromizeHandler","editedHandler","checkrunCompleted","checksuiteCompleted"],"mappings":";;;;;;;AAEA,MAAMA,MAAgC,GAAG;EACvCC,UAAU,EAAEC,OAAO,CAACC,GAAR,CAAYC,mBADe;EAEvCC,mBAAmB,EAAE,IAFkB;EAGvCC,SAAS,EAAE,IAH4B;EAIvCC,qBAAqB,EAAE,IAJgB;EAKvCC,MAAM,EAAE;IACNC,KAAK,EAAE,CACL;MACEC,MAAM;gGADR;MAIEC,KAAK,EAAE;QACLF,KAAK,EAAE,8CADF;QAELG,OAAO,EACL;;KARD,EAWL;MACEC,GAAG,EAAE,KADP;MAEEH,MAAM,EAAE,4BAFV;MAGEC,KAAK,EAAE;QACLF,KAAK,EAAE,gCADF;QAELG,OAAO,EAAE;OALb;MAOEE,MAAM,EAAE,YAPV;MAQEC,mBAAmB,EAAGC,KAAD,IAAW;cACxBC,KAAK,GAAGD,KAAK,CAAC,CAAD,CAAnB;;YACIC,KAAK,KAAK,YAAd,EAA4B;iBACnB;YACLR,KAAK,EAAE,UADF;YAELG,OAAO,EAAE;WAFX;;;eAKK;UACLM,GAAG,EAAG,wCAAuCD,KAAM,EAD9C;UAELR,KAAK,EAAG,eAAcQ,KAAM,EAFvB;UAGLL,OAAO,EAAG,IAAGK,KAAM,0CAAyCA,KAAM;SAHpE;;KA3BC;GAN8B;EA2CvCE,MAAM,EAAE;IACNC,GAAG,EAAE;MACHC,QAAQ,EAAG,YAAWnB,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EADpD;MAEHC,iBAAiB,EAAG,aAAYrB,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EAF9D;MAGHE,YAAY,EAAG,SAAQtB,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EAHrD;MAIHG,WAAW,EAAG,wBAAuBvB,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EAJnE;MAKHI,aAAa,EAAG,SAAQxB,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EALtD;MAMHK,WAAW,EAAG,OAAMzB,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EANlD;MAOHM,aAAa,EAAG,WAAU1B,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EAPxD;MAQHO,KAAK,EAAG,SAAQ3B,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EAR9C;MASHQ,KAAK,EAAG,SAAQ5B,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EAT9C;MAUHS,UAAU,EAAG,cAAa7B,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EAVxD;MAWHU,KAAK,EAAG,gBAAe9B,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EAXrD;eAYO,WAAUpB,OAAO,CAACC,GAAR,CAAYmB,oBAAqB;KAbjD;IAeNW,MAAM,EAAE;MACNC,SAAS,EAAG,SAAQhC,OAAO,CAACC,GAAR,CAAYmB,oBAAqB,EAD/C;MAENa,eAAe,EAAG,WAAUjC,OAAO,CAACC,GAAR,CAAYmB,oBAAqB;;GA5D1B;EA+DvCc,aAAa,EAAE;IACbhB,GAAG,EAAE,EADQ;IAEba,MAAM,EAAE,CAAC,KAAD;GAjE6B;EAmEvCI,MAAM,EAAE;IACNC,IAAI,EAAE;;;;;;;2BAOiB;QACnBC,IAAI,EAAE,6BADa;QAEnBC,KAAK,EAAE;OATL;+BAWqB;QACvBD,IAAI,EAAE,iCADiB;QAEvBC,KAAK,EAAE;OAbL;gCAesB;QACxBD,IAAI,EAAE,kCADkB;QAExBC,KAAK,EAAE;OAjBL;uBAmBa;QACfD,IAAI,EAAE,yBADS;QAEfC,KAAK,EAAE;OArBL;;;6BAyBmB;QACrBD,IAAI,EAAE,2BADe;QAErBC,KAAK,EAAE;OA3BL;iCA6BuB;QACzBD,IAAI,EAAE,+BADmB;QAEzBC,KAAK,EAAE;OA/BL;kCAiCwB;QAC1BD,IAAI,EAAE,gCADoB;QAE1BC,KAAK,EAAE;OAnCL;yBAqCe;QACjBD,IAAI,EAAE,uBADW;QAEjBC,KAAK,EAAE;OAvCL;;;yBA2Ce;QACjBD,IAAI,EAAE,kBADW;QAEjBC,KAAK,EAAE;;KA9CL;IAkDNC,MAAM,EAAE;MACNC,EAAE,EAAE;QACFC,UAAU,EAAE,gBADV;QAEFC,SAAS,EAAE,YAFT;QAGFC,MAAM,EAAE;OAJJ;MAMNzB,GAAG,EAAE;QACH0B,WAAW,EAAE,mBADV;QAEHC,SAAS,EAAE,uBAFR;QAGHC,gBAAgB,EAAE,wBAHf;QAIHC,QAAQ,EAAE;OAVN;MAYNhB,MAAM,EAAE;QACNa,WAAW,EAAE,qBADP;QAENC,SAAS,EAAE,yBAFL;QAGNC,gBAAgB,EAAE,0BAHZ;QAINC,QAAQ,EAAE;;;;CArIlB;;ACAA,MAAMjD,QAAqB,GAAG;EAC5BK,mBAAmB,EAAE,IADO;EAE5BC,SAAS,EAAE,IAFiB;EAG5BC,qBAAqB,EAAE,KAHK;EAI5BC,MAAM,EAAE;IACNC,KAAK,EAAE,CACL;MACEC,MAAM;gGADR;MAIEC,KAAK,EAAE;QACLF,KAAK,EAAE,8CADF;QAELG,OAAO,EACL;;KARD;GALmB;EAkB5BO,MAAM,EAAE;IACNC,GAAG,EAAE;MACHG,iBAAiB,EAAE,wBADhB;0BAEiB;;GArBI;EAwB5Ba,aAAa,EAAE;IACbhB,GAAG,EAAE;GAzBqB;EA2B5BiB,MAAM,EAAE;IACNC,IAAI,EAAE;;;;;;;2BAOiB;QACnBC,IAAI,EAAE,6BADa;QAEnBC,KAAK,EAAE;OATL;+BAWqB;QACvBD,IAAI,EAAE,iCADiB;QAEvBC,KAAK,EAAE;OAbL;gCAesB;QACxBD,IAAI,EAAE,kCADkB;QAExBC,KAAK,EAAE;OAjBL;uBAmBa;QACfD,IAAI,EAAE,yBADS;QAEfC,KAAK,EAAE;OArBL;;;yBAyBe;QACjBD,IAAI,EAAE,kBADW;QAEjBC,KAAK,EAAE;OA3BL;6BA6BmB;QACrBD,IAAI,EAAE,qCADe;QAErBC,KAAK,EAAE;;KAhCL;IAoCNC,MAAM,EAAE;MACNC,EAAE,EAAE;QACFC,UAAU,EAAE,gBADV;QAEFC,SAAS,EAAE,YAFT;QAGFC,MAAM,EAAE;OAJJ;MAMNzB,GAAG,EAAE;QACH0B,WAAW,EAAE,mBADV;QAEHC,SAAS,EAAE,uBAFR;QAGHC,gBAAgB,EAAE,wBAHf;QAIHC,QAAQ,EAAE;;;;CAzElB;;ACIO,MAAMC,WAAwC,GAAG;WACtDC,MADsD;qBAEtD5B;CAFK;;;;;;;ACLP;AAIA,AAAO,MAAM6B,mBAAmB,GAAG,OACjCC,OADiC,EAEjCC,WAFiC,EAGjCC,EAAO,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAHO,EAIjCC,QAAyB,GAAGH,EAAE,CAAClB,MAJE,KAKZ;QACfsB,cAAc,GAAGL,WAAW,CAACjB,MAAZ,CAAmB,iBAAnB,CAAvB;MACI,CAACsB,cAAL,EAAqB,OAAO,KAAP;;MAEjB,CAACD,QAAQ,CAACE,IAAT,CAAeC,CAAD,IAAsBA,CAAC,CAACC,EAAF,KAASH,cAAc,CAACG,EAA5D,CAAL,EAAsE;IACpET,OAAO,CAACU,GAAR,CAAYC,KAAZ,CAAkB,kCAAlB;WACO,KAAP;;;MAIAV,WAAW,CAACW,cAAZ,CAA2BP,QAA3B,KACAJ,WAAW,CAACY,kBAAZ,CAA+BR,QAA/B,CAFF,EAGE;IACAL,OAAO,CAACU,GAAR,CAAYC,KAAZ,CAAkB,yCAAlB;WACO,KAAP;;;QAGIG,cAAc,GAAGb,WAAW,CAACc,cAAZ,EAAvB;;MACID,cAAc,IAAIA,cAAc,KAAKZ,EAAE,CAACc,MAA5C,EAAoD;IAClDhB,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAkB,qCAAoCf,EAAE,CAACO,EAAG,EAA5D;IACAR,WAAW,CAACiB,kBAAZ,CAA+BhB,EAAE,CAACO,EAAlC,EAAsCP,EAAE,CAACc,MAAzC;WACO,KAAP;;;EAGFf,WAAW,CAACkB,YAAZ,CAAyBjB,EAAE,CAACc,MAA5B;;MAEId,EAAE,CAACkB,SAAH,KAAiBC,SAArB,EAAgC;UACxBC,QAAQ,GAAG,MAAMtB,OAAO,CAACuB,MAAR,CAAeC,KAAf,CAAqBC,GAArB,CACrBzB,OAAO,CAAC0B,IAAR,CAAa;MACXV,MAAM,EAAEd,EAAE,CAACc;KADb,CADqB,CAAvB;IAKAd,EAAE,GAAGoB,QAAQ,CAACK,IAAd;;;MAGEzB,EAAE,CAAC0B,MAAP,EAAe;IACb5B,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAkB,6CAA4Cf,EAAE,CAACO,EAAG,EAApE;WACO,KAAP;;;MAGE,CAACP,EAAE,CAACkB,SAAR,EAAmB;QACblB,EAAE,CAAC2B,eAAH,KAAuBR,SAA3B,EAAsC;;MAEpCpB,WAAW,CAAC6B,UAAZ,CAAuB9B,OAAvB,EAAgC+B,MAAM,CAAC7B,EAAE,CAACO,EAAJ,CAAtC,EAA+CP,EAAE,CAACc,MAAlD;aACO,KAAP;;;QAGEd,EAAE,CAAC8B,IAAH,CAAQC,GAAR,CAAYC,UAAZ,CAAuB,WAAvB,CAAJ,EAAyC;UACnChC,EAAE,CAAC2B,eAAH,KAAuB,QAAvB,IAAmC3B,EAAE,CAAC2B,eAAH,KAAuB,OAA9D,EAAuE;QACrE7B,OAAO,CAACU,GAAR,CAAYO,IAAZ,CACG,qDAAoDf,EAAE,CAACO,EAAG,EAD7D,EADqE;;cAM/DT,OAAO,CAACuB,MAAR,CAAeY,MAAf,CAAsBC,MAAtB,CACJpC,OAAO,CAAC0B,IAAR,CAAa;UACXV,MAAM,EAAEd,EAAE,CAACc,MADA;UAEXqB,IAAI,EAAEnC,EAAE,CAACmC,IAAH,CAAQC,OAAR,CACJ,8BADI,EAEJ,8BAFI;SAFR,CADI,CAAN;eASO,KAAP;OAfF,MAgBO;cACCC,MAAM,GAAG,MAAMvC,OAAO,CAACuB,MAAR,CAAegB,MAAf,CAAsBC,UAAtB,CACnBxC,OAAO,CAAC0B,IAAR,CAAa;UACXO,GAAG,EAAE/B,EAAE,CAAC8B,IAAH,CAAQS,GADF;UAEXC,QAAQ,EAAE;SAFZ,CADmB,CAArB;cAOMC,eAAe,GAAGJ,MAAM,CAACZ,IAAP,CAAYiB,UAAZ,CAAuBC,IAAvB,CACrBC,KAAD,IAAWA,KAAK,CAACC,UAAN,KAAqB,SADV,CAAxB;;YAGIJ,eAAJ,EAAqB;UACnB3C,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAkB,2CAA0Cf,EAAE,CAACO,EAAG,EAAlE;UACAR,WAAW,CAAC+C,iBAAZ,CAA8BhD,OAA9B,EAAuCE,EAAE,CAACc,MAA1C;iBACO,KAAP;;;cAGIiC,QAAQ,GAAG,MAAMjD,OAAO,CAACuB,MAAR,CAAe2B,KAAf,CAAqBC,kBAArB,CACrBnD,OAAO,CAAC0B,IAAR,CAAa;UACXO,GAAG,EAAE/B,EAAE,CAAC8B,IAAH,CAAQS,GADF;UAEXC,QAAQ,EAAE;SAFZ,CADqB,CAAvB;cAOMU,iBAAiB,GAAGH,QAAQ,CAACtB,IAAT,CAAckB,IAAd,CACvBpF,MAAD,IAAYA,MAAM,CAAC4F,KAAP,KAAiB,SADL,CAA1B;;YAGID,iBAAJ,EAAuB;UACrBpD,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAkB,4CAA2Cf,EAAE,CAACO,EAAG,EAAnE;UACAR,WAAW,CAAC+C,iBAAZ,CAA8BhD,OAA9B,EAAuCE,EAAE,CAACc,MAA1C;iBACO,KAAP;;;;MAIJhB,OAAO,CAACU,GAAR,CAAYO,IAAZ,CACG,yDACCf,EAAE,CAAC2B,eACJ,EAHH;aAKO,KAAP;;;QAGE3B,EAAE,CAAC2B,eAAH,KAAuB,QAA3B,EAAqC;MACnC7B,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAiB,uCAAjB;YAEMjB,OAAO,CAACuB,MAAR,CAAe2B,KAAf,CAAqBI,KAArB,CAA2B;QAC/BC,KAAK,EAAErD,EAAE,CAAC8B,IAAH,CAAQN,IAAR,CAAa6B,KAAb,CAAmBC,KADK;QAE/B9B,IAAI,EAAExB,EAAE,CAAC8B,IAAH,CAAQN,IAAR,CAAaxC,IAFY;QAG/BuE,IAAI,EAAEvD,EAAE,CAAC8B,IAAH,CAAQ9C,IAHiB;QAI/B8C,IAAI,EAAE9B,EAAE,CAAC8B,IAAH,CAAQ9C;OAJV,CAAN;aAOO,KAAP;;;IAGFe,WAAW,CAAC+C,iBAAZ,CAA8BhD,OAA9B,EAAuCE,EAAE,CAACc,MAA1C;IACAhB,OAAO,CAACU,GAAR,CAAYO,IAAZ,CACG,yDACCf,EAAE,CAAC2B,eACJ,EAHH;WAKO,KAAP;;;MAGE;IACF7B,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAkB,iBAAgBf,EAAE,CAACc,MAAO,EAA5C;UACM0C,WAAW,GAAG,MAAM1D,OAAO,CAACuB,MAAR,CAAeC,KAAf,CAAqB8B,KAArB,CAA2B;MACnDK,YAAY,EAAE,QADqC;MAEnDJ,KAAK,EAAErD,EAAE,CAAC8B,IAAH,CAAQN,IAAR,CAAa6B,KAAb,CAAmBC,KAFyB;MAGnD9B,IAAI,EAAExB,EAAE,CAAC8B,IAAH,CAAQN,IAAR,CAAaxC,IAHgC;MAInD8B,MAAM,EAAEd,EAAE,CAACc,MAJwC;MAKnD4C,YAAY,EAAG,GAAE1D,EAAE,CAAC9C,KAAM,MAAK8C,EAAE,CAACc,MAAO,GALU;MAMnD6C,cAAc,EAAE,EANmC;;KAA3B,CAA1B;IAQA7D,OAAO,CAACU,GAAR,CAAYC,KAAZ,CAAkB,eAAlB,EAAmC+C,WAAW,CAAC/B,IAA/C;IACA1B,WAAW,CAAC+C,iBAAZ,CAA8BhD,OAA9B,EAAuCE,EAAE,CAACc,MAA1C;WACO8C,OAAO,CAACJ,WAAW,CAAC/B,IAAZ,CAAiBC,MAAlB,CAAd;GAZF,CAaE,OAAOmC,GAAP,EAAY;IACZ/D,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAiB,kBAAjB,EAAqC8C,GAArC;IACA9D,WAAW,CAAC+C,iBAAZ,CAA8BhD,OAA9B,EAAuCE,EAAE,CAACc,MAA1C;WACO,KAAP;;CArJG;;ACYA,MAAMgD,cAAc,GAAG,OAC5BhE,OAD4B,EAE5BrD,MAF4B,KAGR;QACd;IAAEgF,IAAI,EAAE3C;MAAW,MAAMgB,OAAO,CAACuB,MAAR,CAAeY,MAAf,CAAsB8B,iBAAtB,CAC7BjE,OAAO,CAAC0B,IAAR,CAAa;IAAEgB,QAAQ,EAAE;GAAzB,CAD6B,CAA/B;QAGMwB,WAA0C,GAAG,EAAnD;;OAEK,MAAM,CAACC,QAAD,EAAWC,WAAX,CAAX,IAAsCC,MAAM,CAACC,OAAP,CAAe3H,MAAM,CAACqC,MAAP,CAAcC,IAA7B,CAAtC,EAA0E;UAClEsF,UAAU,GAAGH,WAAW,CAACjF,KAAZ,CAAkBqF,KAAlB,CAAwB,CAAxB,CAAnB;UACMC,WAAW,GAAI,gCAA+BN,QAAS,EAA7D;QAEIO,aAAa,GAAG1F,MAAM,CAACuB,IAAP,CAAaoE,KAAD,IAAWA,KAAK,CAACzF,IAAN,KAAekF,WAAW,CAAClF,IAAlD,CAApB;;QACI,CAACwF,aAAL,EAAoB;MAClBA,aAAa,GAAG1F,MAAM,CAACuB,IAAP,CAAaoE,KAAD,IAAWA,KAAK,CAACF,WAAN,KAAsBA,WAA7C,CAAhB;;;QAEE,CAACC,aAAL,EAAoB;UACdP,QAAQ,KAAK,qBAAjB,EAAwC;QACtCO,aAAa,GAAG1F,MAAM,CAACuB,IAAP,CACboE,KAAD,IAAWA,KAAK,CAACzF,IAAN,KAAe,qBADZ,CAAhB;;;UAIEiF,QAAQ,KAAK,iBAAjB,EAAoC;QAClCO,aAAa,GAAG1F,MAAM,CAACuB,IAAP,CACboE,KAAD,IAAWA,KAAK,CAACzF,IAAN,KAAe,iBADZ,CAAhB;;;;QAMA,CAACwF,aAAL,EAAoB;YACZE,MAAM,GAAG,MAAM5E,OAAO,CAACuB,MAAR,CAAeY,MAAf,CAAsB0C,WAAtB,CACnB7E,OAAO,CAAC0B,IAAR,CAAa;QACXxC,IAAI,EAAEkF,WAAW,CAAClF,IADP;QAEXC,KAAK,EAAEoF,UAFI;QAGXE;OAHF,CADmB,CAArB;MAOAP,WAAW,CAACC,QAAD,CAAX,GAAwBS,MAAM,CAACjD,IAA/B;KARF,MASO,IACL+C,aAAa,CAACxF,IAAd,KAAuBkF,WAAW,CAAClF,IAAnC,IACAwF,aAAa,CAACvF,KAAd,KAAwBoF,UAFnB;;;MAKL;QACAvE,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAiB,uBAAjB,EAA0C;UACxC6D,YAAY,EAAEJ,aAAa,CAACxF,IADY;UAExCA,IAAI,EAAEwF,aAAa,CAACxF,IAAd,KAAuBkF,WAAW,CAAClF,IAAnC,IAA2CkF,WAAW,CAAClF,IAFrB;UAGxCC,KAAK,EAAEuF,aAAa,CAACvF,KAAd,KAAwBoF,UAAxB,IAAsCA,UAHL;UAIxCE,WAAW,EAAEC,aAAa,CAACD,WAAd,KAA8BA,WAA9B,IAA6CA;SAJ5D;cAOMG,MAAM,GAAG,MAAM5E,OAAO,CAACuB,MAAR,CAAeY,MAAf,CAAsB4C,WAAtB,CACnB/E,OAAO,CAAC0B,IAAR,CAAa;UACXoD,YAAY,EAAEJ,aAAa,CAACxF,IADjB;UAEXA,IAAI,EAAEkF,WAAW,CAAClF,IAFP;UAGXC,KAAK,EAAEoF,UAHI;UAIXE;SAJF,CADmB,CAArB;QAQAP,WAAW,CAACC,QAAD,CAAX,GAAwBS,MAAM,CAACjD,IAA/B;OArBK,MAsBA;MACLuC,WAAW,CAACC,QAAD,CAAX,GAAwBO,aAAxB;;;;SAIGR,WAAP;CAlEK;;ACjBA,MAAMc,OAAO,GAAkBC,CAAf,IACrBZ,MAAM,CAACa,IAAP,CAAYD,CAAZ,CADK;;ACUP,MAAME,aAAa,GAAIrB,OAAvB;AAIA,AAAO,MAAMsB,aAAa,GAAG,OAC3BpF,OAD2B,EAE3BrD,MAF2B,KAGJ;MACnB,CAACA,MAAM,CAACC,UAAZ,EAAwB;WACf;MACLyI,OAAO,EAAE,MAAyB,EAD7B;MAELC,WAAW,EAAE,MAAuCC,OAAO,CAACC,OAAR;KAFtD;;;QAMIC,uBAAuB,GAAGT,OAAO,CAACrI,MAAM,CAACmB,MAAR,CAAP,CAAuB4H,MAAvB,CAE7B,CAACC,GAAD,EAAMC,SAAN,KAAoB;IACrBvB,MAAM,CAACwB,MAAP,CAAcF,GAAd,EAAmBhJ,MAAM,CAACmB,MAAP,CAAc8H,SAAd,CAAnB;WACOD,GAAP;GAJ8B,EAK7B,EAL6B,CAAhC;QAOMG,WAAW,GAAG,IAAIC,gBAAJ,CAAcpJ,MAAM,CAACC,UAArB,CAApB;QACMoJ,QAAa,GAAG,MAAMF,WAAW,CAACG,KAAZ,CAAkBhH,IAAlB,CAAuB;IAAEiH,KAAK,EAAE;GAAhC,CAA5B;QACMC,OAA6C,GAAG9B,MAAM,CAAC+B,MAAP,CACpDX,uBADoD,EAGnDY,GAHmD,CAG9CC,KAAD,IAAW;UACRC,MAAM,GAAGP,QAAQ,CAACG,OAAT,CAAiB5F,IAAjB,CACZiG,IAAD,IAAeA,IAAI,CAACC,OAAL,CAAaH,KAAb,KAAuBA,KADzB,CAAf;;QAGI,CAACC,MAAL,EAAa;MACXG,OAAO,CAACC,IAAR,CAAc,uBAAsBL,KAAM,EAA1C;;;;WAGK,CAACA,KAAD,EAAQ;MAAEC,MAAF;MAAUK,EAAE,EAAEvF;KAAtB,CAAP;GAXkD,EAgBnDwF,MAhBmD,CAgB5C1B,aAhB4C,CAAtD;;OAkBK,MAAM,GAAGqB,IAAH,CAAX,IAAuBL,OAAvB,EAAgC;QAC1B;YACIS,EAAO,GAAG,MAAMd,WAAW,CAACc,EAAZ,CAAeE,IAAf,CAAoB;QAAEN,IAAI,EAAEA,IAAI,CAACD,MAAL,CAAY9F;OAAxC,CAAtB;MACA+F,IAAI,CAACI,EAAL,GAAUA,EAAE,CAACG,OAAb;KAFF,CAGE,OAAOhD,GAAP,EAAY;MACZ2C,OAAO,CAACpJ,KAAR,CAAcyG,GAAd;;;;QAIEiD,UAAU,GAAG,IAAIC,GAAJ,CAAQd,OAAR,CAAnB;;QAEMe,sBAAsB,GAAIC,WAAD,IAAyB;UAChDb,KAAK,GAAGb,uBAAuB,CAAC0B,WAAD,CAArC;QACI,CAACb,KAAL,EAAY,OAAO,IAAP;WACLU,UAAU,CAACvF,GAAX,CAAe6E,KAAf,CAAP;GAHF;;SAMO;IACLjB,OAAO,EAAG8B,WAAD,IAAyB;YAC1BX,IAAI,GAAGU,sBAAsB,CAACC,WAAD,CAAnC;UACI,CAACX,IAAL,EAAW,OAAOW,WAAP;aACH,KAAIX,IAAI,CAACD,MAAL,CAAY9F,EAAG,GAA3B;KAJG;IAML6E,WAAW,EAAE,OAAO6B,WAAP,EAA4BC,IAA5B,KAA6C;MACxDpH,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAiB,YAAjB,EAA+B;QAAEkG,WAAF;QAAeC;OAA9C;UACIvK,OAAO,CAACC,GAAR,CAAYuK,OAAhB,EAAyB;YAEnBb,IAAI,GAAGU,sBAAsB,CAACC,WAAD,CAAnC;UACI,CAACX,IAAD,IAAS,CAACA,IAAI,CAACI,EAAnB,EAAuB;YACjBd,WAAW,CAACwB,IAAZ,CAAiBhC,WAAjB,CAA6B;QACjCyB,OAAO,EAAEP,IAAI,CAACI,EAAL,CAAQnG,EADgB;QAEjC2G;OAFI,CAAN;;GAZJ;CAvDK;;ACKP,MAAMjC,eAAa,GAAIrB,OAAvB;;AAIA,MAAMyD,eAAe,GAAG,OACtBvH,OADsB,EAEtBrD,MAFsB,KAGG;QACnB6K,YAAY,GAAGpC,aAAa,CAACpF,OAAD,EAAUrD,MAAV,CAAlC;QAEM8K,kBAAkB,GAAGzC,OAAO,CAACrI,MAAM,CAACmB,MAAR,CAAP,CAAuB4H,MAAvB,CACzB,CAACC,GAAD,EAAMC,SAAN,KAAoB;IAClBvB,MAAM,CAACa,IAAP,CAAYvI,MAAM,CAACmB,MAAP,CAAc8H,SAAd,CAAZ,EAAsC8B,OAAtC,CAA+ClE,KAAD,IAAW;MACvDmC,GAAG,CAACgC,GAAJ,CAAQnE,KAAR,EAAeoC,SAAf;KADF;WAGOD,GAAP;GALuB,EAOzB,IAAIsB,GAAJ,EAPyB,CAA3B;;QAUMW,iBAAiB,GAAIC,YAAD,IAA4B,CACpD,GAAG,IAAIC,GAAJ,CACDD,YAAY,CACTxB,GADH,CACQc,WAAD,IAAiBM,kBAAkB,CAAChG,GAAnB,CAAuB0F,WAAvB,CADxB,EAEGN,MAFH,CAEU/C,OAFV,CADC,CADiD,CAAtD;;SAQO;IACLnH,MADK;IAELoL,gBAAgB,EAAGZ,WAAD,IAAiBM,kBAAkB,CAAChG,GAAnB,CAAuB0F,WAAvB,CAF9B;IAGLS,iBAAiB,EAAGC,YAAD,IAAkB,CACnC,GAAG,IAAIC,GAAJ,CACDD,YAAY,CACTxB,GADH,CACQc,WAAD,IAAiBM,kBAAkB,CAAChG,GAAnB,CAAuB0F,WAAvB,CADxB,EAEGN,MAFH,CAEU1B,eAFV,CADC,CADgC,CAHhC;IAWL6C,gBAAgB,EAAE,CAChBC,aADgB,EAEhBC,kBAFgB,EAGhB;MAAEC,qBAAF;MAAyBC;KAHT,KAIb;UACC,CAACH,aAAL,EAAoB,OAAO,KAAP;YAEdI,uBAAuB,GAAGT,iBAAiB,CAC/CM,kBAAkB,CAAC7B,GAAnB,CAAwBiC,OAAD,IAAaA,OAAO,CAAC9E,KAA5C,CAD+C,CAAjD,CAHG;;UASD2E,qBAAqB,IACrBE,uBAAuB,CAACE,QAAxB,CAAiCN,aAAjC,CAFF,EAGE;eACO,IAAP;OAZC;;;UAgBCtL,MAAM,CAACoC,aAAP,IAAwBqJ,qBAA5B,EAAmD;cAC3CrJ,aAAa,GAAGpC,MAAM,CAACoC,aAA7B;eACOsJ,uBAAuB,CAACxF,IAAxB,CAA8B2F,KAAD,IAClCzJ,aAAa,CAACkJ,aAAD,CAAb,CAA6BM,QAA7B,CAAsCC,KAAtC,CADK,CAAP;;;aAKK,KAAP;KAtCG;IAyCLC,KAAK,EAAE,MAAMjB;GAzCf;CAxBF;;AAqEA,MAAMkB,mBAAmB,GAAG,IAAIzB,GAAJ,EAA5B;AACA,MAAM0B,YAAY,GAAG,IAAI1B,GAAJ,EAArB;AAEA,AAAO,MAAM2B,iBAAiB,GAAG,CAC/B5I,OAD+B,EAE/BrD,MAF+B,KAGN;QACnB4G,KAAK,GAAGvD,OAAO,CAACG,OAAR,CAAgB0I,UAAhB,CAA2BtF,KAAzC;QAEMuF,mBAAmB,GAAGH,YAAY,CAAClH,GAAb,CAAiB8B,KAAK,CAACC,KAAvB,CAA5B;MACIsF,mBAAJ,EAAyB,OAAOA,mBAAP;QAEnBC,eAAe,GAAGL,mBAAmB,CAACjH,GAApB,CAAwB8B,KAAK,CAACC,KAA9B,CAAxB;MACIuF,eAAJ,EAAqB,OAAOxD,OAAO,CAACC,OAAR,CAAgBuD,eAAhB,CAAP;QAEfC,OAAO,GAAGzB,eAAe,CAACvH,OAAD,EAAUrD,MAAV,CAA/B;EACA+L,mBAAmB,CAACf,GAApB,CAAwBpE,KAAK,CAACC,KAA9B,EAAqCwF,OAArC;SAEOA,OAAO,CAACC,IAAR,CAAcC,WAAD,IAAiB;IACnCR,mBAAmB,CAACS,MAApB,CAA2B5F,KAAK,CAACC,KAAjC;IACAmF,YAAY,CAAChB,GAAb,CAAiBpE,KAAK,CAACC,KAAvB,EAA8B0F,WAA9B;WACOA,WAAP;GAHK,CAAP;CAfK;;AC/FP;AAEA,AA8BA,MAAM/D,eAAa,GAAIrB,OAAvB;;AASA,eAAesF,eAAf,CACEpJ,OADF,EAEErD,MAFF,EAGoC;QAC5BuM,WAAW,GAAG,MAAMN,iBAAiB,CAAC5I,OAAD,EAAUrD,MAAV,CAA3C;QACMsD,WAAW,GAAGoE,MAAM,CAACgF,MAAP,CAAcH,WAAd,CAApB;QAEM,CAAClK,MAAD,IAAW,MAAMuG,OAAO,CAAC+D,GAAR,CAAY,CAACtF,cAAc,CAAChE,OAAD,EAAUrD,MAAV,CAAf,CAAZ,CAAvB;QAEM4M,gBAAgB,GAAGlF,MAAM,CAACa,IAAP,CAAYvI,MAAM,CAACmB,MAAnB,CAAzB;QAEM0L,mBAAmB,GAAGD,gBAAgB,CACzClD,GADyB,CACpBoD,GAAD,IAAqB9M,MAAM,CAACqC,MAAP,CAAcI,MAAd,CAAqBqK,GAArB,EAA0BhK,WAD1B,EAEzBoH,MAFyB,CAElB/C,OAFkB,EAGzBuC,GAHyB,CAGpBnH,IAAD,IAAUF,MAAM,CAACE,IAAD,CAAN,CAAauB,EAHF,CAA5B;QAKMiJ,uBAAuB,GAAGH,gBAAgB,CAC7ClD,GAD6B,CACxBoD,GAAD,IAAS9M,MAAM,CAACqC,MAAP,CAAcI,MAAd,CAAqBqK,GAArB,EAA0B/J,SADV,EAE7BmH,MAF6B,CAEtB/C,OAFsB,EAG7BuC,GAH6B,CAGxBnH,IAAD,IAAUF,MAAM,CAACE,IAAD,CAAN,CAAauB,EAHE,CAAhC;QAKMkJ,wBAAwB,GAAGJ,gBAAgB,CAC9ClD,GAD8B,CACzBoD,GAAD,IAAS9M,MAAM,CAACqC,MAAP,CAAcI,MAAd,CAAqBqK,GAArB,EAA0B9J,gBADT,EAE9BkH,MAF8B,CAEvB/C,OAFuB,EAG9BuC,GAH8B,CAGzBnH,IAAD,IAAUF,MAAM,CAACE,IAAD,CAAN,CAAauB,EAHG,CAAjC;QAKMmJ,sBAAsB,GAAGL,gBAAgB,CAC5ClD,GAD4B,CACvBoD,GAAD,IAAS9M,MAAM,CAACqC,MAAP,CAAcI,MAAd,CAAqBqK,GAArB,EAA0B7J,QADX,EAE5BiH,MAF4B,CAErB/C,OAFqB,EAG5BuC,GAH4B,CAGvBnH,IAAD,IAAUF,MAAM,CAACE,IAAD,CAAN,CAAauB,EAHC,CAA/B;QAKMoJ,kBAAkB,GAAG,IAAI5C,GAAJ,EAA3B;EACAsC,gBAAgB,CAAC7B,OAAjB,CAA0B+B,GAAD,IAAS;UAC1BK,iBAAiB,GAAGnN,MAAM,CAACqC,MAAP,CAAcI,MAAd,CAAqBqK,GAArB,CAA1B;IACApF,MAAM,CAACa,IAAP,CAAY4E,iBAAZ,EAA+BpC,OAA/B,CAAwCvD,QAAD,IAAsB;MAC3D0F,kBAAkB,CAAClC,GAAnB,CAAuB3I,MAAM,CAAC8K,iBAAiB,CAAC3F,QAAD,CAAlB,CAAN,CAAoC1D,EAA3D,EAA+DgJ,GAA/D;KADF;GAFF,EA7BkC;;QAqD5BM,MAAI,GAAGC,SAAI,EAAjB;MACIC,iBAAJ;QACMC,cAAgD,GAAG,EAAzD;;QAEMC,WAAW,GAAG,CAClBC,SADkB,EAElBC,QAFkB,KAIlB,IAAI9E,OAAJ,CAAY,CAACC,OAAD,EAAU8E,MAAV,KAAqB;IAC/B5D,OAAO,CAAChG,GAAR,CAAY,sBAAZ,EAAoC;MAAE0J;KAAtC;IACAL,MAAI,CAACK,SAAD,EAAY,MAAOG,qBAAP,IAAiC;YACzCC,OAAO,GAAGD,qBAAqB,CAAC,MAAM,EAAP,CAArC;MACA7D,OAAO,CAAChG,GAAR,CAAY,qBAAZ,EAAmC;QAAE0J;OAArC;;UACI;cACIC,QAAQ,EAAd;OADF,CAEE,OAAOtG,GAAP,EAAY;QACZ2C,OAAO,CAAChG,GAAR,CAAY,+BAAZ,EAA6C;UAAE0J;SAA/C;QACAI,OAAO;QACPF,MAAM,CAACvG,GAAD,CAAN;;;;MAGF2C,OAAO,CAAChG,GAAR,CAAY,kBAAZ,EAAgC;QAAE0J;OAAlC;MACAI,OAAO;MACPhF,OAAO;KAbL,CAAJ;GAFF,CAJF;;QAuBM1D,UAAU,GAAG,CACjB9B,OADiB,EAEjByK,IAFiB,EAGjBC,QAHiB,KAId;IACH1K,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAiB,YAAjB,EAA+B;MAAEyJ;KAAjC;IACAC,UAAU,CAAC,MAAM;MACfR,WAAW,CAAC,YAAD,EAAe,MAAM;eACvBA,WAAW,CAACM,IAAD,EAAO,YAAY;gBAC7BnJ,QAAQ,GAAG,MAAMtB,OAAO,CAACuB,MAAR,CAAeC,KAAf,CAAqBC,GAArB,CACrBzB,OAAO,CAAC0B,IAAR,CAAa;YACXV,MAAM,EAAE0J;WADV,CADqB,CAAvB;gBAKM3K,mBAAmB,CAACC,OAAD,EAAUC,WAAV,EAAuBqB,QAAQ,CAACK,IAAhC,CAAzB;SANgB,CAAlB;OADS,CAAX;KADQ,EAWP,IAXO,CAAV;GANF;;SAoBO0C,MAAM,CAACwB,MAAP,CAAc5F,WAAd,EAA2B;IAChCjB,MADgC;IAEhC4L,iBAAiB,EAAE,CACjB,GAAGlB,uBADc,EAEjB,GAAGC,wBAFc,EAGjB,GAAGC,sBAHc,CAFa;IAOhChJ,cAAc,EArEQ5B,MAAD,IACrBA,MAAM,CAAC6D,IAAP,CAAa8B,KAAD,IAAW6E,mBAAmB,CAACjB,QAApB,CAA6B5D,KAAK,CAAClE,EAAnC,CAAvB,CA6DgC;IAQhCI,kBAAkB,EApEQ7B,MAAD,IACzBA,MAAM,CAAC6D,IAAP,CAAa8B,KAAD,IAAW+E,uBAAuB,CAACnB,QAAxB,CAAiC5D,KAAK,CAAClE,EAAvC,CAAvB,CA2DgC;IAShCoK,yBAAyB,EAnEQ7L,MAAD,IAChCA,MAAM,CAAC6D,IAAP,CAAa8B,KAAD,IAAWgF,wBAAwB,CAACpB,QAAzB,CAAkC5D,KAAK,CAAClE,EAAxC,CAAvB,CAyDgC;IAUhCqK,iBAAiB,EAlEQ9L,MAAD,IACxBA,MAAM,CAAC6D,IAAP,CAAa8B,KAAD,IAAWiF,sBAAsB,CAACrB,QAAvB,CAAgC5D,KAAK,CAAClE,EAAtC,CAAvB,CAuDgC;IAWhCsK,wBAAwB,EAhEQ/L,MAAD,IAC/BA,MAAM,CACH6H,MADH,CACWlC,KAAD,IAAW6E,mBAAmB,CAACjB,QAApB,CAA6B5D,KAAK,CAAClE,EAAnC,CADrB,EAEG4F,GAFH,CAEQ1B,KAAD,IAAWkF,kBAAkB,CAACpI,GAAnB,CAAuBkD,KAAK,CAAClE,EAA7B,CAFlB,EAGGoG,MAHH,CAGU1B,eAHV,CAoDgC;IAahCpE,cAAc,EAAE,MAAMkJ,iBAbU;IAchC9I,YAAY,EAAGuJ,QAAD,IAAoB;MAChChE,OAAO,CAAChG,GAAR,CAAY,kBAAZ,EAAgC;QAAEgK;OAAlC;UACIT,iBAAiB,KAAKS,QAA1B,EAAoC;UAChCT,iBAAJ,EAAuB,MAAM,IAAIe,KAAJ,CAAU,sBAAV,CAAN;MACvBf,iBAAiB,GAAGS,QAApB;KAlB8B;IAoBhC1H,iBAAiB,EAAE,CAAChD,OAAD,EAAU0K,QAAV,KAA6B;MAC9ChE,OAAO,CAAChG,GAAR,CAAY,oBAAZ,EAAkC;QAAEgK;OAApC;UACIT,iBAAiB,KAAKS,QAA1B,EAAoC;YAC9BO,IAAI,GAAGf,cAAc,CAACgB,KAAf,EAAb;;UACI,CAACD,IAAL,EAAW;QACThB,iBAAiB,GAAG5I,SAApB;;;;MAIFqF,OAAO,CAAChG,GAAR,CAAY,kBAAZ,EAAgCuK,IAAhC;MACAnJ,UAAU,CAAC9B,OAAD,EAAUiL,IAAI,CAACxK,EAAf,EAAmBwK,IAAI,CAACjK,MAAxB,CAAV;KA9B8B;IAgChCE,kBAAkB,EAAE,CAACuJ,IAAD,EAAOC,QAAP,KAA0B;MAC5ChE,OAAO,CAAChG,GAAR,CAAY,wBAAZ,EAAsC;QACpCgK,QADoC;QAEpCT,iBAFoC;QAGpCC;OAHF;MAKAA,cAAc,CAACiB,IAAf,CAAoB;QAAE1K,EAAE,EAAEgK,IAAN;QAAYzJ,MAAM,EAAE0J;OAAxC;KAtC8B;IAwChC5I,UAxCgC;IA0ChCqI;GA1CK,CAAP;;;AA8CF,MAAMiB,mBAAmB,GAAG,IAAInE,GAAJ,EAA5B;AACA,MAAMoE,YAAY,GAAG,IAAIpE,GAAJ,EAArB;AAEA,AAAO,MAAMqE,iBAAiB,GAC5BtL,OAD+B,IAEe;QACxCuD,KAAK,GAAGvD,OAAO,CAACG,OAAR,CAAgB0I,UAAhB,CAA2BtF,KAAzC;;MACI,CAAC1D,WAAW,CAAC0D,KAAK,CAACC,KAAP,CAAhB,EAA+B;IAC7BkD,OAAO,CAACC,IAAR,CAAapD,KAAK,CAACC,KAAnB,EAA0Ba,MAAM,CAACa,IAAP,CAAYrF,WAAZ,CAA1B;WACO,IAAP;;;QAEI4J,GAAG,GAAGzJ,OAAO,CAACG,OAAR,CAAgB0I,UAAhB,CAA2BpI,EAAvC;QAEM8K,mBAAmB,GAAGF,YAAY,CAAC5J,GAAb,CAAiBgI,GAAjB,CAA5B;MACI8B,mBAAJ,EAAyB,OAAOA,mBAAP;QAEnBxC,eAAe,GAAGqC,mBAAmB,CAAC3J,GAApB,CAAwBgI,GAAxB,CAAxB;MACIV,eAAJ,EAAqB,OAAOxD,OAAO,CAACC,OAAR,CAAgBuD,eAAhB,CAAP;QAEfC,OAAO,GAAGI,eAAe,CAACpJ,OAAD,EAAUH,WAAW,CAAC0D,KAAK,CAACC,KAAP,CAArB,CAA/B;EACA4H,mBAAmB,CAACzD,GAApB,CAAwB8B,GAAxB,EAA6BT,OAA7B;SAEOA,OAAO,CAACC,IAAR,CAAchJ,WAAD,IAAiB;IACnCmL,mBAAmB,CAACjC,MAApB,CAA2BM,GAA3B;IACA4B,YAAY,CAAC1D,GAAb,CAAiB8B,GAAjB,EAAsBxJ,WAAtB;WACOA,WAAP;GAHK,CAAP;CAnBK;;ACpLA,MAAMuL,wBAAwB,GAAG,OAGtCxL,OAHsC,EAItCqK,QAJsC,KAKpB;QACZpK,WAAW,GAAG,MAAMqL,iBAAiB,CAACtL,OAAD,CAA3C;MACI,CAACC,WAAL,EAAkB;EAElBA,WAAW,CAACkK,WAAZ,CAAwBpI,MAAM,CAAC/B,OAAO,CAACG,OAAR,CAAgBC,YAAhB,CAA6BK,EAA9B,CAA9B,EAAiE,YAAY;UACrE4J,QAAQ,CAACpK,WAAD,CAAd;GADF;CATK;AAmBP,AAAO,MAAMwL,8BAA8B,GAGzCpB,QAH4C,IAIxCrK,OAAD,IAAyB;SACrBwL,wBAAwB,CAACxL,OAAD,EAAWC,WAAD,IACvCoK,QAAQ,CAACrK,OAAD,EAAUC,WAAV,CADqB,CAA/B;CALK;AAUP,AAAO,MAAMyL,+BAA+B,GAAG,CAC7CC,eAD6C,EAE7CtB,QAF6C,KAG1C,MAAOrK,OAAP,IAA+B;QAC5BC,WAAW,GAAG,MAAMqL,iBAAiB,CAACtL,OAAD,CAA3C;MACI,CAACC,WAAL,EAAkB;SAEXA,WAAW,CAACkK,WAAZ,CACLwB,eAAe,CAAC3L,OAAD,CAAf,CAAyBqG,GAAzB,CAA8BnG,EAAD,IAAQ6B,MAAM,CAAC7B,EAAE,CAACO,EAAJ,CAA3C,CADK,EAEL,MAAM4J,QAAQ,CAACrK,OAAD,EAAUC,WAAV,CAFT,CAAP;CAPK;;ACvCA,MAAM2L,qBAEZ,GAAG,OAAO5L,OAAP,EAAgBC,WAAhB,KAAgC;MAC9B,CAACA,WAAW,CAACtD,MAAZ,CAAmBK,mBAAxB,EAA6C;QAEvCkD,EAAE,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAA3B;MACIF,EAAE,CAAC2L,SAAH,CAAaC,MAAb,KAAwB,CAA5B,EAA+B;MAC3B5L,EAAE,CAACsG,IAAH,CAAQuF,IAAR,KAAiB,KAArB,EAA4B;QAEtB/L,OAAO,CAACuB,MAAR,CAAeY,MAAf,CAAsB6J,YAAtB,CACJhM,OAAO,CAACpC,KAAR,CAAc;IACZiO,SAAS,EAAE,CAAC3L,EAAE,CAACsG,IAAH,CAAQhD,KAAT;GADb,CADI,CAAN;CATK;;ACHA,MAAMyI,UAAU,GAAI7O,KAAD,IACxBA,KAAK,CACF8O,IADH,GAEG5J,OAFH,CAEW,gCAFX,EAE6C,KAF7C,EAGGA,OAHH,CAGW,qBAHX,EAGkC,CAAC6J,CAAD,EAAIC,IAAJ,KAAc,GAAEA,IAAI,CAACC,WAAL,EAAmB,IAHrE,EAIG/J,OAJH,CAIW,oBAJX,EAIiC,YAJjC;CAMGA,OANH,CAMW,4BANX,EAMyC,IANzC,CADK;;ACKA,MAAMgK,YAAY,GAAG,CAC1BtM,OAD0B,EAE1BC,WAF0B,KAGvB;MACC,CAACA,WAAW,CAACtD,MAAZ,CAAmBM,SAAxB,EAAmC;QAE7BiD,EAAE,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAA3B;QACMhD,KAAK,GAAG6O,UAAU,CAAC/L,EAAE,CAAC9C,KAAJ,CAAxB;;MAEI8C,EAAE,CAAC9C,KAAH,KAAaA,KAAjB,EAAwB;IACtB8C,EAAE,CAAC9C,KAAH,GAAWA,KAAX;IACA4C,OAAO,CAACuB,MAAR,CAAeY,MAAf,CAAsBC,MAAtB,CACEpC,OAAO,CAACpC,KAAR,CAAc;MACZR;KADF,CADF;;CAXG;;ACaP,MAAM+H,eAAa,GAAIrB,OAAvB;AAIA,AAAO,MAAMyI,MAAM,GAAG,OACpBvM,OADoB,EAEpBC,WAFoB,KAGjB;MACC,CAACA,WAAW,CAACtD,MAAZ,CAAmBQ,MAAxB,EAAgC;QAE1BuE,IAAI,GAAG1B,OAAO,CAACG,OAAR,CAAgB0I,UAA7B;QACM3I,EAAE,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAA3B,CAJG;;MAOCF,EAAE,CAAC8B,IAAH,CAAQN,IAAR,CAAajB,EAAb,KAAoBiB,IAAI,CAACjB,EAA7B,EAAiC;QAE3B+L,WAAW,GAAGtM,EAAE,CAACsG,IAAH,CAAQuF,IAAR,KAAiB,KAArC;QAEM9I,QAAkB,GAAG,EAA3B;QAEMwJ,SAAS,GAAGxM,WAAW,CAACtD,MAAZ,CAAmBQ,MAAnB,CAA0BC,KAA1B,CAAgCmD,IAAhC,CAAsCmM,IAAD,IAAU;QAC3DA,IAAI,CAAClP,GAAL,KAAa,KAAb,IAAsBgP,WAA1B,EAAuC,OAAO,KAAP;UAEjC7O,KAAK,GAAG+O,IAAI,CAACrP,MAAL,CAAYsP,IAAZ,CAAiBzM,EAAE,CAAC9C,KAApB,CAAd;;QACIO,KAAK,KAAK,IAAd,EAAoB;UACd+O,IAAI,CAACjP,MAAT,EAAiB;QACfwF,QAAQ,CAACkI,IAAT,CAAc;UAAEjM,IAAI,EAAEwN,IAAI,CAACjP,MAAb;UAAqBH,KAAK,EAAEoP,IAAI,CAACpP;SAA/C;;;aAEK,IAAP;;;QAGEoP,IAAI,CAACjP,MAAL,IAAeiP,IAAI,CAAChP,mBAAxB,EAA6C;MAC3CuF,QAAQ,CAACkI,IAAT,CAAc;QACZjM,IAAI,EAAEwN,IAAI,CAACjP,MADC;QAEZwD,IAAI,EAAEyL,IAAI,CAAChP,mBAAL,CAAyBC,KAAzB;OAFR;aAIO,KAAP;;;WAGK,KAAP;GAnBgB,CAAlB;QAsBMiP,IAAI,GAAG,IAAIC,IAAJ,GAAWC,WAAX,EAAb;QAEMC,cAAc,GAAG,CAAC,MAAM/M,OAAO,CAACuB,MAAR,CAAegB,MAAf,CAAsBC,UAAtB,CAC5BxC,OAAO,CAAC0B,IAAR,CAAa;IACXO,GAAG,EAAE/B,EAAE,CAAC8B,IAAH,CAAQS;GADf,CAD4B,CAAP,EAIpBd,IAJoB,CAIfiB,UAJe,CAIJrC,IAJI,CAKpBuC,KAAD,IAAWA,KAAK,CAAC5D,IAAN,KAAgB,GAAErC,OAAO,CAACC,GAAR,CAAYkQ,IAAK,UALzB,CAAvB;QAQMzH,OAAO,CAAC+D,GAAR,CACJ,CACE,GAAGrG,QAAQ,CAACoD,GAAT,CAAa,CAAC;IAAEnH,IAAF;IAAQ5B,KAAR;IAAe2D;GAAhB,KACdjB,OAAO,CAACuB,MAAR,CAAe2B,KAAf,CAAqB+J,YAArB,CACEjN,OAAO,CAAC0B,IAAR,CAAa;IACX1B,OAAO,EAAG,GAAEnD,OAAO,CAACC,GAAR,CAAYkQ,IAAK,IAAG9N,IAAK,EAD1B;IAEXuD,GAAG,EAAEvC,EAAE,CAAC8B,IAAH,CAAQS,GAFF;IAGXY,KAAK,EAAG/F,KAAK,GAAG,SAAH,GAAe,SAHjB;IAIX4P,UAAU,EAAE5P,KAAK,GAAG+D,SAAH,GAAgBJ,IAAD,CAAqBpD,GAJ1C;IAKX4G,WAAW,EAAEnH,KAAK,GAAGA,KAAK,CAACF,KAAT,GAAkB6D,IAAD,CAAqB7D;GAL1D,CADF,CADC,CADL,EAYE2P,cAAc,IACZ/M,OAAO,CAACuB,MAAR,CAAegB,MAAf,CAAsB8G,MAAtB,CACErJ,OAAO,CAAC0B,IAAR,CAAa;IACXxC,IAAI,EAAG,GAAErC,OAAO,CAACC,GAAR,CAAYkQ,IAAK,UADf;IAEXG,QAAQ,EAAEjN,EAAE,CAAC8B,IAAH,CAAQS,GAFP;IAGXhF,MAAM,EAAE,WAHG;IAIXsF,UAAU,EAAG0J,SAAS,GAAG,SAAH,GAAe,SAJ1B;IAOXW,UAAU,EAAER,IAPD;IAQXS,YAAY,EAAET,IARH;IASXU,MAAM,EAAEb,SAAS,GACbA,SAAS,CAACnP,KADG,GAEb;MACEF,KAAK,EAAE,oBADT;MAEEG,OAAO,EAAE;;GAbjB,CADF,CAbJ,EA+BE,CAACwP,cAAD,IACE/M,OAAO,CAACuB,MAAR,CAAe2B,KAAf,CAAqB+J,YAArB,CACEjN,OAAO,CAAC0B,IAAR,CAAa;IACX1B,OAAO,EAAG,GAAEnD,OAAO,CAACC,GAAR,CAAYkQ,IAAK,UADlB;IAEXvK,GAAG,EAAEvC,EAAE,CAAC8B,IAAH,CAAQS,GAFF;IAGXY,KAAK,EAAGoJ,SAAS,GAAG,SAAH,GAAe,SAHrB;IAIXS,UAAU,EAAE7L,SAJD;IAKXoD,WAAW,EAAEgI,SAAS,GAClBA,SAAS,CAACnP,KAAV,CAAgBF,KADE,GAElB;GAPN,CADF,CAhCJ,EA2CEyJ,MA3CF,CA2CS1B,eA3CT,CADI,CAAN;CAhDK;;ACjBP,MAAMoI,cAAc,GAAG,gBAGrBvN,OAHqB,EAIrBE,EAJqB,EAKrB;EAAEmD,KAAF;EAASoB;CALY,EAMN;QACT+I,UAAU,GAAG,CAAC,MAAMxN,OAAO,CAACuB,MAAR,CAAegB,MAAf,CAAsBC,UAAtB,CACxBxC,OAAO,CAAC0B,IAAR,CAAa;IACXO,GAAG,EAAE/B,EAAE,CAAC8B,IAAH,CAAQS;GADf,CADwB,CAAP,EAIhBd,IAJgB,CAIXiB,UAJW,CAIArC,IAJA,CAIMuC,KAAD,IAAWA,KAAK,CAAC5D,IAAN,KAAerC,OAAO,CAACC,GAAR,CAAYkQ,IAJ3C,CAAnB;EAMAhN,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAiB,kBAAjB,EAAqC;IAAEuM,UAAF;IAAcnK,KAAd;IAAqBoB;GAA1D;;MAEI+I,UAAJ,EAAgB;UACRxN,OAAO,CAACuB,MAAR,CAAegB,MAAf,CAAsB8G,MAAtB,CACJrJ,OAAO,CAAC0B,IAAR,CAAa;MACXxC,IAAI,EAAErC,OAAO,CAACC,GAAR,CAAYkQ,IADP;MAEXG,QAAQ,EAAEjN,EAAE,CAAC8B,IAAH,CAAQS,GAFP;MAGX2K,UAAU,EAAElN,EAAE,CAACuN,UAHJ;MAIXhQ,MAAM,EAAE,WAJG;MAKXsF,UAAU,EAAEM,KALD;MAMXgK,YAAY,EAAE,IAAIR,IAAJ,GAAWC,WAAX,EANH;MAOXQ,MAAM,EAAE;QACNlQ,KAAK,EAAEqH,WADD;QAENlH,OAAO,EAAE;;KATb,CADI,CAAN;GADF,MAeO;UACCyC,OAAO,CAACuB,MAAR,CAAe2B,KAAf,CAAqB+J,YAArB,CACJjN,OAAO,CAAC0B,IAAR,CAAa;MACX1B,OAAO,EAAEnD,OAAO,CAACC,GAAR,CAAYkQ,IADV;MAEXvK,GAAG,EAAEvC,EAAE,CAAC8B,IAAH,CAAQS,GAFF;MAGXY,KAHW;MAIX6J,UAAU,EAAE7L,SAJD;MAKXoD;KALF,CADI,CAAN;;CA/BJ;;AA2CA,MAAMiJ,uBAAuB,GAAG,CAC9B1N,OAD8B,EAE9BE,EAF8B,EAG9BuE,WAH8B,KAK9B8I,cAAc,CAACvN,OAAD,EAAUE,EAAV,EAAc;EAC1BmD,KAAK,EAAE,SADmB;EAE1BoB;CAFY,CALhB;;AAUA,AAAO,MAAMkJ,2BAA2B,GAAG,CACzC3N,OADyC,EAEzCC,WAFyC,EAGzCC,EAAO,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAHe,EAIzCpB,MAAuB,GAAGkB,EAAE,CAAClB,MAAH,IAAa,EAJE,KAKvB;EAClBgB,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAiB,6BAAjB,EAAgD;IAC9CjC,MAAM,EAAEA,MAAM,CAACqH,GAAP,CAAY7F,CAAD,IAAOA,CAAC,IAAIA,CAAC,CAACtB,IAAzB,CADsC;IAE9C0B,cAAc,EAAEX,WAAW,CAACW,cAAZ,CAA2B5B,MAA3B,CAF8B;IAG9C8L,iBAAiB,EAAE7K,WAAW,CAAC6K,iBAAZ,CAA8B9L,MAA9B;GAHrB;;MAMIkB,EAAE,CAAC0N,mBAAH,CAAuB9B,MAAvB,KAAkC,CAAtC,EAAyC;WAChC4B,uBAAuB,CAC5B1N,OAD4B,EAE5BE,EAF4B,EAG3B,yBAAwBA,EAAE,CAAC0N,mBAAH,CACtBvH,GADsB,CACjBwH,EAAD,IAAaA,EAAE,CAACrK,KADE,EAEtBsK,IAFsB,CAEjB,IAFiB,CAEX,EALc,CAA9B;;;MASE7N,WAAW,CAAC4K,yBAAZ,CAAsC7L,MAAtC,CAAJ,EAAmD;WAC1C0O,uBAAuB,CAC5B1N,OAD4B,EAE5BE,EAF4B,EAG5B,+EAH4B,CAA9B;;;QAOI6N,qBAAqB,GAAG9N,WAAW,CAAC8K,wBAAZ,CAAqC/L,MAArC,CAA9B;;MAEI+O,qBAAqB,CAACjC,MAAtB,KAAiC,CAArC,EAAwC;WAC/B4B,uBAAuB,CAC5B1N,OAD4B,EAE5BE,EAF4B,EAG3B,yBAAwB6N,qBAAqB,CAACD,IAAtB,CACvB,IADuB,CAEvB,6BAL0B,CAA9B;;;MASE,CAAC7N,WAAW,CAAC6K,iBAAZ,CAA8B9L,MAA9B,CAAL,EAA4C;QACtCiB,WAAW,CAACtD,MAAZ,CAAmBO,qBAAvB,EAA8C;aACrCwQ,uBAAuB,CAC5B1N,OAD4B,EAE5BE,EAF4B,EAG5B,8CAH4B,CAA9B;;GAvCc;;;;;;;;;;;;;;;SA4DXqN,cAAc,CAACvN,OAAD,EAAUE,EAAV,EAAc;IACjCmD,KAAK,EAAE,SAD0B;IAEjCoB,WAAW,EAAE;GAFM,CAArB,CA5DkB;CALb;;ACnDA,MAAMuJ,kBAAkB,GAAG,OAIhChO,OAJgC,EAKhCC,WALgC,EAMhCgO,WANgC,EAOhC;EACEC,GAAG,EAAEC,WADP;EAEEC,MAAM,EAAEC;CATsB,KAcH;EAC7BrO,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAiB,oBAAjB,EAAuC;IACrCgN,WADqC;IAErCE,WAFqC;IAGrCE;GAHF;QAMMnO,EAAE,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAA3B;MACIC,QAAQ,GAAGH,EAAE,CAAClB,MAAH,IAAa,EAA5B;MACI,CAACiP,WAAL,EAAkB,OAAO5N,QAAP;QAEZiO,aAAa,GAAG,IAAIxG,GAAJ,CACpBzH,QAAQ,CAACgG,GAAT,CAAc1B,KAAD,IAA0BA,KAAK,CAACzF,IAA7C,CADoB,CAAtB;QAIMqP,KAAK,GAAG,IAAIzG,GAAJ,EAAd;QACM0G,QAAQ,GAAG,IAAI1G,GAAJ,EAAjB;QACM9I,MAAM,GAAGiB,WAAW,CAACjB,MAA3B;;QAEMyP,eAAe,GAAIhF,GAAD,IAAiD;UACjEiF,YAAY,GAAGzO,WAAW,CAACtD,MAAZ,CAAmBqC,MAAnB,CAA0BI,MAA1B,CAAiC6O,WAAjC,CAArB;QACI,CAACS,YAAL,EAAmB,OAAOrN,SAAP;WAEZqN,YAAY,CAACjF,GAAD,CAAZ,IAAqBzK,MAAM,CAAC0P,YAAY,CAACjF,GAAD,CAAb,CAA3B,GACHzK,MAAM,CAAC0P,YAAY,CAACjF,GAAD,CAAb,CADH,GAEHpI,SAFJ;GAJF;;MASI8M,WAAJ,EAAiB;IACfA,WAAW,CAACzG,OAAZ,CAAqB+B,GAAD,IAAS;UACvB,CAACA,GAAL,EAAU;YACJ9E,KAAK,GAAG8J,eAAe,CAAChF,GAAD,CAA7B;;UAEE,CAAC9E,KAAD,IACAtE,QAAQ,CAACwC,IAAT,CAAe8L,OAAD,IAA4BA,OAAO,CAAClO,EAAR,KAAekE,KAAK,CAAClE,EAA/D,CAFF,EAGE;;;;MAGF6N,aAAa,CAACJ,GAAd,CAAkBvJ,KAAK,CAACzF,IAAxB;MACAqP,KAAK,CAACL,GAAN,CAAUzE,GAAV;KAVF;;;MAcE4E,cAAJ,EAAoB;IAClBA,cAAc,CAAC3G,OAAf,CAAwB+B,GAAD,IAAS;UAC1B,CAACA,GAAL,EAAU;YACJ9E,KAAK,GAAG8J,eAAe,CAAChF,GAAD,CAA7B;UACI,CAAC9E,KAAL,EAAY;YACNiK,QAAQ,GAAGvO,QAAQ,CAACE,IAAT,CACdoO,OAAD,IAA4BA,OAAO,CAAClO,EAAR,KAAekE,KAAK,CAAClE,EADlC,CAAjB;;UAGImO,QAAJ,EAAc;QACZN,aAAa,CAACnF,MAAd,CAAqByF,QAAQ,CAAC1P,IAA9B;QACAsP,QAAQ,CAACN,GAAT,CAAazE,GAAb;;KATJ;;;QAcIoF,kBAAkB,GAAG,CAAC,GAAGP,aAAJ,CAA3B;EAEAtO,OAAO,CAACU,GAAR,CAAYO,IAAZ,CAAiB,oBAAjB,EAAuC;IACrCgN,WADqC;IAErCM,KAAK,EAAE,CAAC,GAAGA,KAAJ,CAF8B;IAGrCC,QAAQ,EAAE,CAAC,GAAGA,QAAJ,CAH2B;IAIrCM,SAAS,EAAEzO,QAAQ,CAACgG,GAAT,CAAc7F,CAAD,IAAsBA,CAAC,CAACtB,IAArC,CAJ0B;IAKrCoP,aAAa,EAAEO;GALjB,EA5D6B;;MAsEzBN,KAAK,CAACQ,IAAN,IAAcP,QAAQ,CAACO,IAA3B,EAAiC;UACzBnK,MAAM,GAAG,MAAM5E,OAAO,CAACuB,MAAR,CAAeY,MAAf,CAAsB6M,aAAtB,CACnBhP,OAAO,CAACpC,KAAR,CAAc;MACZoB,MAAM,EAAE6P;KADV,CADmB,CAArB;IAKAxO,QAAQ,GAAGuE,MAAM,CAACjD,IAAlB;GA5E2B;;;;;;;;QAqFvBgM,2BAA2B,CAAC3N,OAAD,EAAUC,WAAV,EAAuBC,EAAvB,EAA2BG,QAA3B,CAAjC,CArF6B;;SAwFtBA,QAAP;CAtGK;;ACAP,qBAAgB4O,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEEzD,8BAA8B,CAAC,OAAOzL,OAAP,EAAgBC,WAAhB,KAAgC;UACvDsF,OAAO,CAAC+D,GAAR,CAAY,CAChBsC,qBAAqB,CAAC5L,OAAD,EAAUC,WAAV,CADL,EAEhBqM,YAAY,CAACtM,OAAD,EAAUC,WAAV,CAFI,EAGhBsM,MAAM,CAACvM,OAAD,EAAUC,WAAV,CAHU,EAIhBD,OAAO,CAACG,OAAR,CAAgBC,YAAhB,CAA6B4B,IAA7B,CAAkCC,GAAlC,CAAsCC,UAAtC,CAAiD,WAAjD,IACIqD,OAAO,CAACC,OAAR,CAAgBnE,SAAhB,CADJ,GAEI2M,kBAAkB,CAAChO,OAAD,EAAUC,WAAV,EAAuB,KAAvB,EAA8B;MAC9CiO,GAAG,EAAE,CAAC,aAAD;KADW,CANN,CAAZ,CAAN;GAD4B,CAFhC;CADF;;ACHA,qBAAgBe,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEEzD,8BAA8B,CAAC,OAAOzL,OAAP,EAAgBC,WAAhB,KAAgC;UACvDC,EAAE,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAA3B;;QACIF,EAAE,CAAC0B,MAAP,EAAe;YACP2D,OAAO,CAAC+D,GAAR,CAAY,CAChBrJ,WAAW,CAAC+C,iBAAZ,CAA8BhD,OAA9B,EAAuCE,EAAE,CAACc,MAA1C,CADgB,CAAZ,CAAN;KADF,MAKO;YACCuE,OAAO,CAAC+D,GAAR,CAAY,CAChB0E,kBAAkB,CAAChO,OAAD,EAAUC,WAAV,EAAuB,KAAvB,EAA8B;QAC9CmO,MAAM,EAAE,CAAC,aAAD;OADQ,CADF,CAAZ,CAAN;;GAR0B,CAFhC;CADF;;ACAA,8BAAgBa,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,+BADF,EAEEzD,8BAA8B,CAAC,OAAOzL,OAAP,EAAgBC,WAAhB,KAAgC;UACvDkP,MAAM,GAAGnP,OAAO,CAACG,OAAR,CAAgBgP,MAA/B,CAD6D;;QAIzDA,MAAM,CAACpD,IAAP,KAAgB,KAApB,EAA2B;UAErB7L,EAAE,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAA3B;UACMgP,QAAQ,GAAIpP,OAAO,CAACG,OAAT,CAAyBkP,kBAA1C;UAEMpH,aAAa,GAAGhI,WAAW,CAAC8H,gBAAZ,CAA6BqH,QAAQ,CAAC5L,KAAtC,CAAtB;;;QAIIyE,aAAa,IAAIhI,WAAW,CAACtD,MAAZ,CAAmBqC,MAAnB,CAA0BI,MAA1B,CAAiC6I,aAAjC,CAArB,EAAsE;YAC9D;QAAEtG,IAAI,EAAE2N;UAAY,MAAMtP,OAAO,CAACuB,MAAR,CAAeC,KAAf,CAAqB+N,WAArB,CAC9BvP,OAAO,CAACpC,KAAR,CAAc;QAAE8E,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAGM8M,4BAA4B,GAAGF,OAAO,CAACzM,IAAR,CAClCzD,MAAD,IACEa,WAAW,CAAC8H,gBAAZ,CAA6B3I,MAAM,CAACoH,IAAP,CAAYhD,KAAzC,MAAoDyE,aAApD,IACA7I,MAAM,CAACiE,KAAP,KAAiB,iBADjB;MAGAjE,MAAM,CAACoH,IAAP,CAAYhD,KAAZ,KAAsB4L,QAAQ,CAAC5L,KALE,CAArC;;UAQI,CAACgM,4BAAL,EAAmC;cAC3BxB,kBAAkB,CAAChO,OAAD,EAAUC,WAAV,EAAuBgI,aAAvB,EAAsC;UAC5DiG,GAAG,EAAE,CAAC,aAAD,cADuD;UAE5DE,MAAM,EAAE,CAAC,UAAD,EAAa,kBAAb;SAFc,CAAxB;;;;QAOAe,MAAM,CAAC3L,KAAP,KAAiB4L,QAAQ,CAAC5L,KAA9B,EAAqC;;QAElBvD,WAAW,CAACwI,KAA/B,EAAsC;MACpCxI,WAAW,CAACwI,KAAZ,CAAkBnD,WAAlB,CACE8J,QAAQ,CAAC5L,KADX,EAEG,UAASvD,WAAW,CAACwI,KAAZ,CAAkBpD,OAAlB,CACR8J,MAAM,CAAC3L,KADC,CAER,4BAA2BtD,EAAE,CAACuP,QAAS,SAAQvP,EAAE,CAAC9C,KAAM,EAJ5D;;GApC0B,CAFhC;CADF;;ACAA,mCAAgB6R,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,qCADF,EAEEzD,8BAA8B,CAAC,OAAOzL,OAAP,EAAgBC,WAAhB,KAAgC;UACvDkP,MAAM,GAAGnP,OAAO,CAACG,OAAR,CAAgBgP,MAA/B;UACMjP,EAAE,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAA3B;UACMgP,QAAQ,GAAIpP,OAAO,CAACG,OAAT,CAAyBkP,kBAA1C;UAEMpH,aAAa,GAAGhI,WAAW,CAAC8H,gBAAZ,CAA6BqH,QAAQ,CAAC5L,KAAtC,CAAtB;;QAEIyE,aAAa,IAAIhI,WAAW,CAACtD,MAAZ,CAAmBqC,MAAnB,CAA0BI,MAA1B,CAAiC6I,aAAjC,CAArB,EAAsE;YAC9DyH,2BAA2B,GAAGzP,WAAW,CAAC+H,gBAAZ,CAClCC,aADkC,EAElC/H,EAAE,CAAC0N,mBAF+B,EAGlC;QACEzF,qBAAqB,EAAE;OAJS,CAApC;YAQM;QAAExG,IAAI,EAAE2N;UAAY,MAAMtP,OAAO,CAACuB,MAAR,CAAeC,KAAf,CAAqB+N,WAArB,CAC9BvP,OAAO,CAACpC,KAAR,CAAc;QAAE8E,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAIM8M,4BAA4B,GAAGF,OAAO,CAACzM,IAAR,CAClCzD,MAAD,IACEa,WAAW,CAAC8H,gBAAZ,CAA6B3I,MAAM,CAACoH,IAAP,CAAYhD,KAAzC,MAAoDyE,aAApD,IACA7I,MAAM,CAACiE,KAAP,KAAiB,iBAHgB,CAArC;YAMMsM,oBAAoB,GAAGL,OAAO,CAACzM,IAAR,CAC1BzD,MAAD,IACEa,WAAW,CAAC8H,gBAAZ,CAA6B3I,MAAM,CAACoH,IAAP,CAAYhD,KAAzC,MAAoDyE,aAApD,IACA7I,MAAM,CAACiE,KAAP,KAAiB,UAHQ,CAA7B;YAMMzD,QAAQ,GACZ,CAAC8P,2BAAD,IACA,CAACF,4BADD,IAEAG,oBAHF;YAIM3B,kBAAkB,CAAChO,OAAD,EAAUC,WAAV,EAAuBgI,aAAvB,EAAsC;QAC5DiG,GAAG,EAAE;QAEHsB,4BAA4B,IAAI,kBAF7B;QAIH5P,QAAQ,IAAI,UAJT,CADuD;;QAQ5DwO,MAAM,EAAE,CACNxO,QAAQ,IAAI,aADN,EAEN,CAAC8P,2BAAD,IACE,CAACF,4BADH,IAEE,WAJI;OARc,CAAxB;;;QAiBEL,MAAM,CAAC3L,KAAP,KAAiB4L,QAAQ,CAAC5L,KAA9B,EAAqC;;QAEjCvD,WAAW,CAACwI,KAAhB,EAAuB;MACrBxI,WAAW,CAACwI,KAAZ,CAAkBnD,WAAlB,CACE8J,QAAQ,CAAC5L,KADX,EAEG,0BAAyBvD,WAAW,CAACwI,KAAZ,CAAkBpD,OAAlB,CACxB8J,MAAM,CAAC3L,KADiB,CAExB,2CAA0CtD,EAAE,CAACuP,QAAS,EAJ1D;;GAxD0B,CAFhC;CADF;;ACCA,8BAAgBR,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,+BADF,EAEEzD,8BAA8B,CAAC,OAAOzL,OAAP,EAAgBC,WAAhB,KAAgC;UACvDC,EAAE,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAA3B;UACM;MAAEoG,IAAI,EAAE4I,QAAR;MAAkB/L;QAAWrD,OAAO,CAACG,OAAT,CAAyBf,MAA3D;QACIc,EAAE,CAACsG,IAAH,CAAQhD,KAAR,KAAkB4L,QAAQ,CAAC5L,KAA/B,EAAsC;UAEhCyE,aAAa,GAAGhI,WAAW,CAAC8H,gBAAZ,CAA6BqH,QAAQ,CAAC5L,KAAtC,CAAtB;QACI5B,MAAJ;;QAEIqG,aAAa,IAAIhI,WAAW,CAACtD,MAAZ,CAAmBqC,MAAnB,CAA0BI,MAA1B,CAAiC6I,aAAjC,CAArB,EAAsE;YAC9DyH,2BAA2B,GAAGzP,WAAW,CAAC+H,gBAAZ,CAClCC,aADkC,EAElC/H,EAAE,CAAC0N,mBAF+B,EAGlC;QACEzF,qBAAqB,EAAE,IADzB;;;OAHkC,CAApC;YASM;QAAExG,IAAI,EAAE2N;UAAY,MAAMtP,OAAO,CAACuB,MAAR,CAAeC,KAAf,CAAqB+N,WAArB,CAC9BvP,OAAO,CAACpC,KAAR,CAAc;QAAE8E,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAGM8M,4BAA4B,GAAGF,OAAO,CAACzM,IAAR,CAClCzD,MAAD,IACEa,WAAW,CAAC8H,gBAAZ,CAA6B3I,MAAM,CAACoH,IAAP,CAAYhD,KAAzC,MAAoDyE,aAApD,IACA7I,MAAM,CAACiE,KAAP,KAAiB,iBAHgB,CAArC;YAMMzD,QAAQ,GACZ,CAAC8P,2BAAD,IACA,CAACF,4BADD,IAEAnM,KAAK,KAAK,UAHZ;YAKMuM,SAAS,GAAG,MAAM5B,kBAAkB,CACxChO,OADwC,EAExCC,WAFwC,EAGxCgI,aAHwC,EAIxC;QACEiG,GAAG,EAAE,CACHtO,QAAQ,IAAI,UADT,EAEHyD,KAAK,KAAK,mBAAV,IAAiC,kBAF9B,CADP;QAKE+K,MAAM,EAAE,CACNxO,QAAQ,IAAI,aADN,EAEN,EAAE8P,2BAA2B,IAAIrM,KAAK,KAAK,mBAA3C,KACE,WAHI,EAINA,KAAK,KAAK,UAAV,IACE,CAACmM,4BADH,IAEE,kBANI,EAONnM,KAAK,KAAK,mBAAV,IAAiC,UAP3B;OAT8B,CAA1C;;UAqBIzD,QAAQ,IAAI,CAAC4P,4BAAjB,EAA+C;QAC7C5N,MAAM,GAAG,MAAM7B,mBAAmB,CAChCC,OADgC,EAEhCC,WAFgC,EAGhCC,EAHgC,EAIhC0P,SAJgC,CAAlC;;;;UASEvK,OAAO,GAAGpF,WAAW,CAACwI,KAAZ,CAAkBpD,OAAlB,CAA0B+J,QAAQ,CAAC5L,KAAnC,CAAhB;UACMqM,KAAK,GAAG3P,EAAE,CAACuP,QAAjB;;UAEMK,OAAO,GAAG,CAAC,MAAM;UACjBzM,KAAK,KAAK,mBAAd,EAAmC;eACzB,OAAMgC,OAAQ,wBAAuBwK,KAAM,EAAnD;;;UAEExM,KAAK,KAAK,UAAd,EAA0B;eAChB,6BAA4BgC,OAAQ,aAAYwK,KAAM,GAC5DjO,MAAM,GAAG,0BAAH,GAAgC,EACvC,EAFD;;;aAIM,oBAAmByD,OAAQ,iBAAgBwK,KAAM,EAAzD;KATc,GAAhB;;IAYA5P,WAAW,CAACwI,KAAZ,CAAkBnD,WAAlB,CAA8BpF,EAAE,CAACsG,IAAH,CAAQhD,KAAtC,EAA6CsM,OAA7C;GA9E4B,CAFhC;CADF;;ACDA,8BAAgBb,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,+BADF,EAEEzD,8BAA8B,CAAC,OAAOzL,OAAP,EAAgBC,WAAhB,KAAgC;UACvDkP,MAAM,GAAGnP,OAAO,CAACG,OAAR,CAAgBgP,MAA/B;UACMjP,EAAE,GAAGF,OAAO,CAACG,OAAR,CAAgBC,YAA3B;UACMgP,QAAQ,GAAIpP,OAAO,CAACG,OAAT,CAAyBf,MAAzB,CAAgCoH,IAAjD;UAEMyB,aAAa,GAAGhI,WAAW,CAAC8H,gBAAZ,CAA6BqH,QAAQ,CAAC5L,KAAtC,CAAtB;;QAEIyE,aAAa,IAAIhI,WAAW,CAACtD,MAAZ,CAAmBqC,MAAnB,CAA0BI,MAA1B,CAAiC6I,aAAjC,CAArB,EAAsE;YAC9D;QAAEtG,IAAI,EAAE2N;UAAY,MAAMtP,OAAO,CAACuB,MAAR,CAAeC,KAAf,CAAqB+N,WAArB,CAC9BvP,OAAO,CAACpC,KAAR,CAAc;QAAE8E,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAGM8M,4BAA4B,GAAGF,OAAO,CAACzM,IAAR,CAClCzD,MAAD,IACEa,WAAW,CAAC8H,gBAAZ,CAA6B3I,MAAM,CAACoH,IAAP,CAAYhD,KAAzC,MAAoDyE,aAApD,IACA7I,MAAM,CAACiE,KAAP,KAAiB,iBAHgB,CAArC;YAMM2K,kBAAkB,CAAChO,OAAD,EAAUC,WAAV,EAAuBgI,aAAvB,EAAsC;QAC5DiG,GAAG,EAAE,CAAC,aAAD,EAAgB,WAAhB,CADuD;QAE5DE,MAAM,EAAE,CACN,CAACoB,4BAAD,IAAiC,kBAD3B,EAEN,UAFM;OAFc,CAAxB;;;QASEvP,WAAW,CAACwI,KAAhB,EAAuB;UACjB0G,MAAM,CAAC3L,KAAP,KAAiB4L,QAAQ,CAAC5L,KAA9B,EAAqC;QACnCvD,WAAW,CAACwI,KAAZ,CAAkBnD,WAAlB,CACEpF,EAAE,CAACsG,IAAH,CAAQhD,KADV,EAEG,WAAUvD,WAAW,CAACwI,KAAZ,CAAkBpD,OAAlB,CACT+J,QAAQ,CAAC5L,KADA,CAET,4BAA2BtD,EAAE,CAACuP,QAAS,EAJ3C;OADF,MAOO;QACLxP,WAAW,CAACwI,KAAZ,CAAkBnD,WAAlB,CACE8J,QAAQ,CAAC5L,KADX,EAEG,WAAUvD,WAAW,CAACwI,KAAZ,CAAkBpD,OAAlB,CACT8J,MAAM,CAAC3L,KADE,CAET,6BAA4BtD,EAAE,CAACuP,QAAS,EAJ5C;;;GAnCwB,CAFhC;CADF;;ACEA,0BAAgBR,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,0BADF,EAEEzD,8BAA8B,CAAC,OAAOzL,OAAP,EAAgBC,WAAhB,KAAgC;;;UAIvDsF,OAAO,CAAC+D,GAAR,CAAY,CAChBgD,YAAY,CAACtM,OAAD,EAAUC,WAAV,CADI,EAEhBsM,MAAM,CAACvM,OAAD,EAAUC,WAAV,CAFU;IAIhB0N,2BAA2B,CAAC3N,OAAD,EAAUC,WAAV,CAJX,CAAZ,CAAN;GAJ4B,CAFhC;CADF;;ACAA,qBAAgBgP,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEEzD,8BAA8B,CAAC,OAAOzL,OAAP,EAAgBC,WAAhB,KAAgC;UACvDsF,OAAO,CAAC+D,GAAR,CAAY,CAChBgD,YAAY,CAACtM,OAAD,EAAUC,WAAV,CADI,EAEhBsM,MAAM,CAACvM,OAAD,EAAUC,WAAV,CAFU,CAAZ,CAAN;UAKMF,mBAAmB,CAACC,OAAD,EAAUC,WAAV,CAAzB;GAN4B,CAFhC;CADF;;ACDA,qBAAgBgP,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,CAAC,sBAAD,EAAyB,wBAAzB,CADF,EAEE,MAAOlP,OAAP,IAAmB;UACXmP,MAAM,GAAGnP,OAAO,CAACG,OAAR,CAAgBgP,MAA/B;QACIA,MAAM,CAACpD,IAAP,KAAgB,KAApB,EAA2B;UAErBP,wBAAwB,CAACxL,OAAD,EAAU,MAAOC,WAAP,IAAuB;YACvD0E,KAAK,GAAG3E,OAAO,CAACG,OAAR,CAAgBwE,KAA9B;;UACI1E,WAAW,CAAC2K,iBAAZ,CAA8BrC,QAA9B,CAAuC5D,KAAK,CAAClE,EAA7C,CAAJ,EAAsD;YAChDT,OAAO,CAACG,OAAR,CAAgB4P,MAAhB,KAA2B,SAA/B,EAA0C;gBAClC/P,OAAO,CAACuB,MAAR,CAAeY,MAAf,CAAsB6N,WAAtB,CACJhQ,OAAO,CAACpC,KAAR,CAAc;YAAEsB,IAAI,EAAEyF,KAAK,CAACzF;WAA5B,CADI,CAAN;SADF,MAIO;gBACCc,OAAO,CAACuB,MAAR,CAAeY,MAAf,CAAsB8N,SAAtB,CACJjQ,OAAO,CAACpC,KAAR,CAAc;YAAEoB,MAAM,EAAE,CAAC2F,KAAK,CAACzF,IAAP;WAAxB,CADI,CAAN;;;;;;YAOEyO,2BAA2B,CAAC3N,OAAD,EAAUC,WAAV,CAAjC;;UAGED,OAAO,CAACG,OAAR,CAAgB4P,MAAhB,KAA2B,SAA3B,IACApL,KAAK,CAAClE,EAAN,MACGR,WAAW,CAACjB,MAAZ,CAAmB,iBAAnB,KACCiB,WAAW,CAACjB,MAAZ,CAAmB,iBAAnB,EAAsCyB,EAF1C,CAFF,EAKE;cACMV,mBAAmB,CAACC,OAAD,EAAUC,WAAV,CAAzB;;KAvB0B,CAA9B;GANJ;CADF;;ACDA,yBAAgBgP,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEExD,+BAA+B,CAC5B1L,OAAD,IAAaA,OAAO,CAACG,OAAR,CAAgB+P,SAAhB,CAA0BC,aADV,EAE7B,OAAOnQ,OAAP,EAAgBC,WAAhB,KAAgC;UACxBsF,OAAO,CAAC+D,GAAR,CACJtJ,OAAO,CAACG,OAAR,CAAgB+P,SAAhB,CAA0BC,aAA1B,CAAwC9J,GAAxC,CAA6CnG,EAAD,IAC1CF,OAAO,CAACuB,MAAR,CAAeC,KAAf,CACGC,GADH,CAEIzB,OAAO,CAAC0B,IAAR,CAAa;MACXV,MAAM,EAAEd,EAAE,CAACc;KADb,CAFJ,EAMGiI,IANH,CAMS3H,QAAD,IAAc;aACXvB,mBAAmB,CAACC,OAAD,EAAUC,WAAV,EAAuBqB,QAAQ,CAACK,IAAhC,CAA1B;KAPJ,CADF,CADI,CAAN;GAH2B,CAFjC;CADF;;ACAA,2BAAgBsN,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,uBADF,EAEExD,+BAA+B,CAC5B1L,OAAD,IAAaA,OAAO,CAACG,OAAR,CAAgBiQ,WAAhB,CAA4BD,aADZ,EAE7B,OAAOnQ,OAAP,EAAgBC,WAAhB,KAAgC;UACxBsF,OAAO,CAAC+D,GAAR,CACJtJ,OAAO,CAACG,OAAR,CAAgBiQ,WAAhB,CAA4BD,aAA5B,CAA0C9J,GAA1C,CAA+CnG,EAAD,IAC5CF,OAAO,CAACuB,MAAR,CAAeC,KAAf,CACGC,GADH,CAEIzB,OAAO,CAAC0B,IAAR,CAAa;MACXV,MAAM,EAAEd,EAAE,CAACc;KADb,CAFJ,EAMGiI,IANH,CAMS3H,QAAD,IAAc;aACXvB,mBAAmB,CAACC,OAAD,EAAUC,WAAV,EAAuBqB,QAAQ,CAACK,IAAhC,CAA1B;KAPJ,CADF,CADI,CAAN;GAH2B,CAFjC;CADF;;ACUA,IAAI,CAAC9E,OAAO,CAACC,GAAR,CAAYkQ,IAAjB,EAAuBnQ,OAAO,CAACC,GAAR,CAAYkQ,IAAZ,GAAmB,YAAnB;;;;;;;AAWvBqD,aAAM,CAACC,GAAP,CAAYrB,GAAD,IAAsB;EAC/BsB,aAAa,CAACtB,GAAD,CAAb;EACAuB,aAAa,CAACvB,GAAD,CAAb;EACAwB,sBAAsB,CAACxB,GAAD,CAAtB;EACAyB,2BAA2B,CAACzB,GAAD,CAA3B,CAJ+B;;;;;EAc/B0B,sBAAsB,CAAC1B,GAAD,CAAtB;EACA2B,sBAAsB,CAAC3B,GAAD,CAAtB;EACA4B,aAAa,CAAC5B,GAAD,CAAb;EACA6B,kBAAkB,CAAC7B,GAAD,CAAlB;EACA8B,aAAa,CAAC9B,GAAD,CAAb;EAEA+B,iBAAiB,CAAC/B,GAAD,CAAjB;EACAgC,mBAAmB,CAAChC,GAAD,CAAnB;CArBF"} \ No newline at end of file +{"version":3,"file":"index-node10.cjs.js","sources":["../src/teamconfigs/ornikar.ts","../src/teamconfigs/christophehurpeau.ts","../src/teamconfigs/index.ts","../src/pr-handlers/actions/autoMergeIfPossible.ts","../src/context/initRepoLabels.ts","../src/context/utils.ts","../src/context/initTeamSlack.ts","../src/context/teamContext.ts","../src/context/repoContext.ts","../src/pr-handlers/utils.ts","../src/pr-handlers/actions/autoAssignPRToCreator.ts","../src/pr-handlers/actions/utils/cleanTitle.ts","../src/pr-handlers/actions/editOpenedPR.ts","../src/pr-handlers/actions/lintPR.ts","../src/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/pr-handlers/actions/updateReviewStatus.ts","../src/pr-handlers/opened.ts","../src/pr-handlers/closed.ts","../src/pr-handlers/reviewRequested.ts","../src/pr-handlers/reviewRequestRemoved.ts","../src/pr-handlers/reviewSubmitted.ts","../src/pr-handlers/reviewDismissed.ts","../src/pr-handlers/synchronize.ts","../src/pr-handlers/edited.ts","../src/pr-handlers/labelsChanged.ts","../src/pr-handlers/checkrunCompleted.ts","../src/pr-handlers/checksuiteCompleted.ts","../src/index.ts"],"sourcesContent":["import { Config } from './types';\n\nconst config: Config<'dev' | 'design'> = {\n slackToken: process.env.ORNIKAR_SLACK_TOKEN,\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: true,\n prLint: {\n title: [\n {\n regExp:\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\\(([a-z\\-/]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://github.com/marionebl/commitlint/tree/master/%40commitlint/config-conventional',\n },\n },\n {\n bot: false,\n regExp: /\\s(ONK-(\\d+)|\\[no issue])$/,\n error: {\n title: 'Title does not have JIRA issue',\n summary: 'The PR title should end with ONK-0000, or [no issue]',\n },\n status: 'jira-issue',\n statusInfoFromMatch: (match) => {\n const issue = match[1];\n if (issue === '[no issue]') {\n return {\n title: 'No issue',\n summary: '',\n };\n }\n return {\n url: `https://ornikar.atlassian.net/browse/${issue}`,\n title: `JIRA issue: ${issue}`,\n summary: `[${issue}](https://ornikar.atlassian.net/browse/${issue})`,\n };\n },\n },\n ],\n },\n\n groups: {\n dev: {\n abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n skyline42sh: `alexandre.charbonnier${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n design: {\n jperriere: `julien${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CoralineColasse: `coraline${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n },\n waitForGroups: {\n dev: [],\n design: ['dev'],\n },\n labels: {\n list: {\n // /* ci */\n // 'ci/in-progress': { name: ':green_heart: ci/in-progress', color: '#0052cc' },\n // 'ci/fail': { name: ':green_heart: ci/fail', color: '#e11d21' },\n // 'ci/passed': { name: ':green_heart: ci/passed', color: '#86f9b4' },\n\n /* code */\n 'code/needs-review': {\n name: ':ok_hand: code/needs-review',\n color: '#FFD57F',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#B2E1FF',\n },\n 'code/changes-requested': {\n name: ':ok_hand: code/changes-requested',\n color: '#e11d21',\n },\n 'code/approved': {\n name: ':ok_hand: code/approved',\n color: '#64DD17',\n },\n\n /* design */\n 'design/needs-review': {\n name: ':art: design/needs-review',\n color: '#FFD57F',\n },\n 'design/review-requested': {\n name: ':art: design/review-requested',\n color: '#B2E1FF',\n },\n 'design/changes-requested': {\n name: ':art: design/changes-requested',\n color: '#e11d21',\n },\n 'design/approved': {\n name: ':art: design/approved',\n color: '#64DD17',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n design: {\n needsReview: 'design/needs-review',\n requested: 'design/review-requested',\n changesRequested: 'design/changes-requested',\n approved: 'design/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config } from './types';\n\nconst config: Config<'dev'> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prLint: {\n title: [\n {\n regExp:\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\\(([a-z\\-/]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://github.com/marionebl/commitlint/tree/master/%40commitlint/config-conventional',\n },\n },\n ],\n },\n groups: {\n dev: {\n christophehurpeau: 'christophe@hurpeau.com',\n 'chris-reviewflow': 'christophe.hurpeau+reviewflow@gmail.com',\n },\n },\n waitForGroups: {\n dev: [],\n },\n labels: {\n list: {\n // /* ci */\n // 'ci/in-progress': { name: ':green_heart: ci/in-progress', color: '#0052cc' },\n // 'ci/fail': { name: ':green_heart: ci/fail', color: '#e11d21' },\n // 'ci/passed': { name: ':green_heart: ci/passed', color: '#86f9b4' },\n\n /* code */\n 'code/needs-review': {\n name: ':ok_hand: code/needs-review',\n color: '#FFD57F',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#B2E1FF',\n },\n 'code/changes-requested': {\n name: ':ok_hand: code/changes-requested',\n color: '#e11d21',\n },\n 'code/approved': {\n name: ':ok_hand: code/approved',\n color: '#64DD17',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n 'merge/delete-branch': {\n name: ':recycle: delete branch after merge',\n color: '#64DD17',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config as ConfigType } from './types';\nimport ornikar from './ornikar';\nimport christophehurpeau from './christophehurpeau';\n\nexport type Config = ConfigType;\n\nexport const teamConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n};\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","import { Context } from 'probot';\n// eslint-disable-next-line import/no-cycle\nimport { RepoContext } from '../../context/repoContext';\nimport { LabelResponse } from '../../context/initRepoLabels';\n\nexport const autoMergeIfPossible = async (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n prLabels: LabelResponse[] = pr.labels,\n): Promise => {\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return false;\n\n if (!prLabels.find((l: LabelResponse) => l.id === autoMergeLabel.id)) {\n context.log.debug('automerge not possible: no label');\n return false;\n }\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n context.log.debug('automerge not possible: blocking labels');\n return false;\n }\n\n const lockedPrNumber = repoContext.getMergeLocked();\n if (lockedPrNumber && lockedPrNumber !== pr.number) {\n context.log.info(`automerge not possible: locked pr ${pr.id}`);\n repoContext.pushAutomergeQueue(pr.id, pr.number);\n return false;\n }\n\n repoContext.addMergeLock(pr.number);\n\n if (pr.mergeable === undefined) {\n const prResult = await context.github.pulls.get(\n context.repo({\n number: pr.number,\n }),\n );\n pr = prResult.data;\n }\n\n if (pr.merged) {\n repoContext.removeMergeLocked(context, pr.number);\n context.log.info(`automerge not possible: already merged pr ${pr.id}`);\n return false;\n }\n\n context.log.info(\n `automerge?: ${pr.id}, mergeable=${pr.mergeable} state=${\n pr.mergeable_state\n }`,\n );\n if (!pr.mergeable) {\n if (!pr.mergeable_state) {\n context.log.info(`automerge not possible: rescheduling ${pr.id}`);\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, String(pr.id), pr.number);\n return false;\n }\n\n if (pr.head.ref.startsWith('renovate/')) {\n if (pr.mergeable_state === 'behind' || pr.mergeable_state === 'dirty') {\n context.log.info(\n `automerge not possible: rebase renovate branch pr ${pr.id}`,\n );\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n\n await context.github.issues.update(\n context.repo({\n number: pr.number,\n body: pr.body.replace(\n '[ ] ',\n '[x] ',\n ),\n }),\n );\n return false;\n } else {\n const checks = await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const hasFailedChecks = checks.data.check_runs.some(\n (check) => check.conclusion === 'failure',\n );\n if (hasFailedChecks) {\n context.log.info(`automerge not possible: failed check pr ${pr.id}`);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n\n const statuses = await context.github.repos.listStatusesForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const hasFailedStatuses = statuses.data.some(\n (status) => status.state === 'failure',\n );\n if (hasFailedStatuses) {\n context.log.info(`automerge not possible: failed status pr ${pr.id}`);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n }\n\n context.log.info(\n `automerge not possible: renovate with mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n if (pr.mergeable_state === 'behind') {\n context.log.info('automerge not possible: update branch');\n\n await context.github.repos.merge({\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n base: pr.head.name,\n head: pr.head.name,\n });\n\n return false;\n }\n\n repoContext.removeMergeLocked(context, pr.number);\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pr.number}`);\n const mergeResult = await context.github.pulls.merge({\n merge_method: 'squash',\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n number: pr.number,\n commit_title: `${pr.title} (#${pr.number})`,\n commit_message: '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removeMergeLocked(context, pr.number);\n return Boolean(mergeResult.data.merged);\n } catch (err) {\n context.log.info('could not merge:', err);\n repoContext.removeMergeLocked(context, pr.number);\n return false;\n }\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\n\nexport interface LabelResponse {\n id: number;\n node_id: string;\n url: string;\n name: string;\n description: string;\n color: string;\n default: boolean;\n}\n\nexport interface Labels {\n [key: string]: LabelResponse;\n}\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const { data: labels } = await context.github.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n const finalLabels: Record = {};\n\n for (const [labelKey, labelConfig] of Object.entries(config.labels.list)) {\n const labelColor = labelConfig.color.slice(1);\n const description = `Generated by review-flow for ${labelKey}`;\n\n let existingLabel = labels.find((label) => label.name === labelConfig.name);\n if (!existingLabel) {\n existingLabel = labels.find((label) => label.description === description);\n }\n if (!existingLabel) {\n if (labelKey === 'design/needs-review') {\n existingLabel = labels.find(\n (label) => label.name === 'needs-design-review',\n );\n }\n if (labelKey === 'design/approved') {\n existingLabel = labels.find(\n (label) => label.name === 'design-reviewed',\n );\n }\n }\n\n if (!existingLabel) {\n const result = await context.github.issues.createLabel(\n context.repo({\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else if (\n existingLabel.name !== labelConfig.name ||\n existingLabel.color !== labelColor // ||\n // TODO: description is never updated\n // existingLabel.description !== description\n ) {\n context.log.info('Needs to update label', {\n current_name: existingLabel.name,\n name: existingLabel.name !== labelConfig.name && labelConfig.name,\n color: existingLabel.color !== labelColor && labelColor,\n description: existingLabel.description !== description && description,\n });\n\n const result = await context.github.issues.updateLabel(\n context.repo({\n current_name: existingLabel.name,\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else {\n finalLabels[labelKey] = existingLabel;\n }\n }\n\n return finalLabels;\n};\n","export const getKeys = (o: T): (keyof T)[] =>\n Object.keys(o) as (keyof T)[];\n","import { WebClient } from '@slack/web-api';\nimport { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { getKeys } from './utils';\n\nexport interface TeamSlack {\n mention: (githubLogin: string) => string;\n postMessage: (githubLogin: string, text: string) => Promise;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const initTeamSlack = async (\n context: Context,\n config: Config,\n): Promise => {\n if (!config.slackToken) {\n return {\n mention: (githubLogin: string) => '',\n postMessage: (githubLogin: string, text: string) => Promise.resolve(),\n };\n }\n\n const githubLoginToSlackEmail = getKeys(config.groups).reduce<{\n [login: string]: string;\n }>((acc, groupName) => {\n Object.assign(acc, config.groups[groupName]);\n return acc;\n }, {});\n\n const slackClient = new WebClient(config.slackToken);\n const allUsers: any = await slackClient.users.list({ limit: 200 });\n const members: [string, { member: any; im: any }][] = Object.values(\n githubLoginToSlackEmail,\n )\n .map((email) => {\n const member = allUsers.members.find(\n (user: any) => user.profile.email === email,\n );\n if (!member) {\n console.warn(`Could not find user ${email}`);\n return;\n }\n return [email, { member, im: undefined }] as [\n string,\n { member: any; im: any }\n ];\n })\n .filter(ExcludesFalsy);\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.im.open({ user: user.member.id });\n user.im = im.channel;\n } catch (err) {\n console.error(err);\n }\n }\n\n const membersMap = new Map(members);\n\n const getUserFromGithubLogin = (githubLogin: string) => {\n const email = githubLoginToSlackEmail[githubLogin];\n if (!email) return null;\n return membersMap.get(email);\n };\n\n return {\n mention: (githubLogin: string) => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (githubLogin: string, text: string) => {\n context.log.info('send slack', { githubLogin, text });\n if (process.env.DRY_RUN) return;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return;\n await slackClient.chat.postMessage({\n channel: user.im.id,\n text,\n });\n },\n };\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { initTeamSlack, TeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface TeamContext {\n config: Config;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => string | undefined;\n getReviewerGroups: (githubLogins: string[]) => string[];\n reviewShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n}\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nconst initTeamContext = async (\n context: Context,\n config: Config,\n): Promise => {\n const slackPromise = initTeamSlack(context, config);\n\n const githubLoginToGroup = getKeys(config.groups).reduce>(\n (acc, groupName) => {\n Object.keys(config.groups[groupName]).forEach((login) => {\n acc.set(login, groupName);\n });\n return acc;\n },\n new Map(),\n );\n\n const getReviewerGroups = (githubLogins: string[]) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(Boolean),\n ),\n ];\n\n return {\n config,\n getReviewerGroup: (githubLogin) => githubLoginToGroup.get(githubLogin),\n getReviewerGroups: (githubLogins) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ],\n\n reviewShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ) => {\n if (!reviewerGroup) return false;\n\n const requestedReviewerGroups = getReviewerGroups(\n requestedReviewers.map((request) => request.login),\n );\n\n // contains another request of a reviewer in the same group\n if (\n includesReviewerGroup &&\n requestedReviewerGroups.includes(reviewerGroup)\n ) {\n return true;\n }\n\n // contains a request from a dependent group\n if (config.waitForGroups && includesWaitForGroups) {\n const waitForGroups = config.waitForGroups;\n return requestedReviewerGroups.some((group) =>\n waitForGroups[reviewerGroup].includes(group),\n );\n }\n\n return false;\n },\n\n slack: await slackPromise,\n };\n};\n\nconst teamContextsPromise = new Map();\nconst teamContexts = new Map();\n\nexport const obtainTeamContext = (\n context: Context,\n config: Config,\n): Promise => {\n const owner = context.payload.repository.owner;\n\n const existingTeamContext = teamContexts.get(owner.login);\n if (existingTeamContext) return existingTeamContext;\n\n const existingPromise = teamContextsPromise.get(owner.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initTeamContext(context, config);\n teamContextsPromise.set(owner.login, promise);\n\n return promise.then((teamContext) => {\n teamContextsPromise.delete(owner.login);\n teamContexts.set(owner.login, teamContext);\n return teamContext;\n });\n};\n","/* eslint-disable max-lines */\n\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../pr-handlers/actions/autoMergeIfPossible';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n protectedLabelIds: LabelResponse['id'][];\n\n hasNeedsReview: (labels: LabelResponse[]) => boolean;\n hasRequestedReview: (labels: LabelResponse[]) => boolean;\n hasChangesRequestedReview: (labels: LabelResponse[]) => boolean;\n hasApprovesReview: (labels: LabelResponse[]) => boolean;\n getNeedsReviewGroupNames: (labels: LabelResponse[]) => GroupNames[];\n\n lockPROrPRS(\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise;\n\n getMergeLocked(): number | undefined;\n addMergeLock(prNumber: number): void;\n removeMergeLocked(context: Context, prNumber: number): void;\n reschedule(context: Context, prId: string, prNumber: number): void;\n pushAutomergeQueue(prId: string, prNumber: number): void;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nasync function initRepoContext(\n context: Context,\n config: Config,\n): Promise> {\n const teamContext = await obtainTeamContext(context, config);\n const repoContext = Object.create(teamContext);\n\n const [labels] = await Promise.all([initRepoLabels(context, config)]);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewGroupNames\n .map((key: GroupNames) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const changesRequestedLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].changesRequested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const labelIdToGroupName = new Map();\n reviewGroupNames.forEach((key) => {\n const reviewGroupLabels = config.labels.review[key] as any;\n Object.keys(reviewGroupLabels).forEach((labelKey: string) => {\n labelIdToGroupName.set(labels[reviewGroupLabels[labelKey]].id, key);\n });\n });\n\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: LabelResponse[]) =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: LabelResponse[]): GroupNames[] =>\n labels\n .filter((label) => needsReviewLabelIds.includes(label.id))\n .map((label) => labelIdToGroupName.get(label.id))\n .filter(ExcludesFalsy);\n\n const lock = Lock();\n let lockMergePrNumber: number | undefined;\n const automergeQueue: { id: string; number: number }[] = [];\n\n const lockPROrPRS = (\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n console.log('lock: try to lock pr', { prIdOrIds });\n lock(prIdOrIds, async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n console.log('lock: lock acquired', { prIdOrIds });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { prIdOrIds });\n release();\n reject(err);\n return;\n }\n console.log('lock: release pr', { prIdOrIds });\n release();\n resolve();\n });\n });\n\n const reschedule = (\n context: Context,\n prId: string,\n prNumber: number,\n ) => {\n context.log.info('reschedule', { prNumber });\n setTimeout(() => {\n lockPROrPRS('reschedule', () => {\n return lockPROrPRS(prId, async () => {\n const prResult = await context.github.pulls.get(\n context.repo({\n number: prNumber,\n }),\n );\n await autoMergeIfPossible(context, repoContext, prResult.data);\n });\n });\n }, 1000);\n };\n\n return Object.assign(repoContext, {\n labels,\n protectedLabelIds: [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ],\n hasNeedsReview,\n hasRequestedReview,\n hasChangesRequestedReview,\n hasApprovesReview,\n getNeedsReviewGroupNames,\n\n getMergeLocked: () => lockMergePrNumber,\n addMergeLock: (prNumber): void => {\n console.log('merge lock: lock', { prNumber });\n if (lockMergePrNumber === prNumber) return;\n if (lockMergePrNumber) throw new Error('Already have lock id');\n lockMergePrNumber = prNumber;\n },\n removeMergeLocked: (context, prNumber): void => {\n console.log('merge lock: remove', { prNumber });\n if (lockMergePrNumber !== prNumber) return;\n const next = automergeQueue.shift();\n if (!next) {\n lockMergePrNumber = undefined;\n return;\n }\n\n console.log('merge lock: next', next);\n reschedule(context, next.id, next.number);\n },\n pushAutomergeQueue: (prId, prNumber): void => {\n console.log('merge lock: push queue', {\n prNumber,\n lockMergePrNumber,\n automergeQueue,\n });\n automergeQueue.push({ id: prId, number: prNumber });\n },\n reschedule,\n\n lockPROrPRS,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n context: Context,\n): Promise | RepoContext | null => {\n const owner = context.payload.repository.owner;\n if (!teamConfigs[owner.login]) {\n console.warn(owner.login, Object.keys(teamConfigs));\n return null;\n }\n const key = context.payload.repository.id;\n\n const existingRepoContext = repoContexts.get(key);\n if (existingRepoContext) return existingRepoContext;\n\n const existingPromise = repoContextsPromise.get(key);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initRepoContext(context, teamConfigs[owner.login]);\n repoContextsPromise.set(key, promise);\n\n return promise.then((repoContext) => {\n repoContextsPromise.delete(key);\n repoContexts.set(key, repoContext);\n return repoContext;\n });\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { obtainRepoContext, RepoContext } from '../context/repoContext';\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n) => Promise;\n\nexport type CallbackWithRepoContext = (\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const handlerPullRequestChange = async <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n callback: CallbackWithRepoContext,\n): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n repoContext.lockPROrPRS(String(context.payload.pull_request.id), async () => {\n await callback(repoContext);\n });\n};\n\ntype CallbackContextAndRepoContext = (\n context: Context,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: CallbackContextAndRepoContext,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport const createHandlerPullRequestsChange = (\n getPullRequests: (context: Context) => any[],\n callback: CallbackContextAndRepoContext,\n) => async (context: Context) => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n return repoContext.lockPROrPRS(\n getPullRequests(context).map((pr) => String(pr.id)),\n () => callback(context, repoContext),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoAssignPRToCreator: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext) => {\n if (!repoContext.config.autoAssignToCreator) return;\n\n const pr = context.payload.pull_request;\n if (pr.assignees.length !== 0) return;\n if (pr.user.type === 'Bot') return;\n\n await context.github.issues.addAssignees(\n context.issue({\n assignees: [pr.user.login],\n }),\n );\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(/[\\s-]+\\[?\\s*(ONK-\\d+)\\s*]?\\s*$/, ' $1')\n .replace(/^([A-Za-z]+)[/:]\\s*/, (s, arg1) => `${arg1.toLowerCase()}: `)\n .replace(/^Revert \"([^\"]+)\"$/, 'revert: $1')\n // eslint-disable-next-line unicorn/no-unsafe-regex\n .replace(/^(revert:.*)(\\s+\\(#\\d+\\))$/, '$1');\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { cleanTitle } from './utils/cleanTitle';\n\nexport const editOpenedPR = (\n context: Context,\n repoContext: RepoContext,\n) => {\n if (!repoContext.config.trimTitle) return;\n\n const pr = context.payload.pull_request;\n const title = cleanTitle(pr.title);\n\n if (pr.title !== title) {\n pr.title = title;\n context.github.issues.update(\n context.issue({\n title,\n }),\n );\n }\n};\n","import { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { StatusError, StatusInfo } from '../../teamconfigs/types';\n\ninterface StatusWithInfo {\n name: string;\n info: StatusInfo;\n error?: undefined;\n}\n\ninterface StatusWithError {\n name: string;\n error: StatusError;\n info?: undefined;\n}\n\ntype Status = StatusWithInfo | StatusWithError;\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const lintPR = async (\n context: Context,\n repoContext: RepoContext,\n) => {\n if (!repoContext.config.prLint) return;\n\n const repo = context.payload.repository;\n const pr = context.payload.pull_request;\n\n // do not lint pr from forks\n if (pr.head.repo.id !== repo.id) return;\n\n const isPrFromBot = pr.user.type === 'Bot';\n\n const statuses: Status[] = [];\n\n const errorRule = repoContext.config.prLint.title.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(pr.title);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n return true;\n }\n\n if (rule.status && rule.statusInfoFromMatch) {\n statuses.push({\n name: rule.status,\n info: rule.statusInfoFromMatch(match),\n });\n return false;\n }\n\n return false;\n });\n\n const date = new Date().toISOString();\n\n const hasLintPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find(\n (check) => check.name === `${process.env.NAME}/lint-pr`,\n );\n\n await Promise.all(\n [\n ...statuses.map(({ name, error, info }) =>\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/${name}`,\n sha: pr.head.sha,\n state: (error ? 'failure' : 'success') as 'failure' | 'success',\n target_url: error ? undefined : (info as StatusInfo).url,\n description: error ? error.title : (info as StatusInfo).title,\n }),\n ),\n ),\n hasLintPrCheck &&\n context.github.checks.create(\n context.repo({\n name: `${process.env.NAME}/lint-pr`,\n head_sha: pr.head.sha,\n status: 'completed' as 'completed',\n conclusion: (errorRule ? 'failure' : 'success') as\n | 'failure'\n | 'success',\n started_at: date,\n completed_at: date,\n output: errorRule\n ? errorRule.error\n : {\n title: '✓ Your PR is valid',\n summary: '',\n },\n }),\n ),\n !hasLintPrCheck &&\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/lint-pr`,\n sha: pr.head.sha,\n state: (errorRule ? 'failure' : 'success') as 'failure' | 'success',\n target_url: undefined,\n description: errorRule\n ? errorRule.error.title\n : '✓ Your PR is valid',\n }),\n ),\n ].filter(ExcludesFalsy),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { RepoContext } from '../../context/repoContext';\n\nconst addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n pr: any,\n { state, description }: { state: 'failure' | 'success'; description: string },\n): Promise {\n const hasPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find((check) => check.name === process.env.NAME);\n\n context.log.info('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME as string,\n head_sha: pr.head.sha,\n started_at: pr.created_at,\n status: 'completed',\n conclusion: state,\n completed_at: new Date().toISOString(),\n output: {\n title: description,\n summary: '',\n },\n }),\n );\n } else {\n await context.github.repos.createStatus(\n context.repo({\n context: process.env.NAME,\n sha: pr.head.sha,\n state,\n target_url: undefined,\n description,\n }),\n );\n }\n};\n\nconst createFailedStatusCheck = (\n context: Context,\n pr: any,\n description: string,\n): Promise =>\n addStatusCheck(context, pr, {\n state: 'failure',\n description,\n });\n\nexport const updateStatusCheckFromLabels = (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n labels: LabelResponse[] = pr.labels || [],\n): Promise => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n if (pr.requested_reviewers.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${pr.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Changes requested ! Push commits or discuss changes then re-request a review.',\n );\n }\n\n const needsReviewGroupNames = repoContext.getNeedsReviewGroupNames(labels);\n\n if (needsReviewGroupNames.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${needsReviewGroupNames.join(\n ', ',\n )}. Perhaps request someone ?`,\n );\n }\n\n if (!repoContext.hasApprovesReview(labels)) {\n if (repoContext.config.requiresReviewRequest) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Awaiting review... Perhaps request someone ?',\n );\n }\n }\n\n // if (\n // repoContext.config.requiresReviewRequest &&\n // !repoContext.hasRequestedReview(labels)\n // ) {\n // return createFailedStatusCheck(\n // context,\n // pr,\n // 'You need to request someone to review the PR',\n // );\n // return;\n // }\n // return createInProgressStatusCheck(context);\n // } else if (repoContext.hasApprovesReview(labels)) {\n return addStatusCheck(context, pr, {\n state: 'success',\n description: '✓ PR ready to merge !',\n });\n // }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { GroupLabels } from '../../teamconfigs/types';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends Webhooks.WebhookPayloadPullRequest,\n GroupNames extends string = any\n>(\n context: Context,\n repoContext: RepoContext,\n reviewGroup: GroupNames,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n): Promise => {\n context.log.info('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n const pr = context.payload.pull_request;\n let prLabels = pr.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n\n const toAdd = new Set();\n const toDelete = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = repoContext.config.labels.review[reviewGroup];\n if (!reviewConfig) return undefined;\n\n return reviewConfig[key] && labels[reviewConfig[key]]\n ? labels[reviewConfig[key]]\n : undefined;\n };\n\n if (labelsToAdd) {\n labelsToAdd.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (\n !label ||\n prLabels.some((prLabel: LabelResponse) => prLabel.id === label.id)\n ) {\n return;\n }\n newLabelNames.add(label.name);\n toAdd.add(key);\n });\n }\n\n if (labelsToRemove) {\n labelsToRemove.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label) return;\n const existing = prLabels.find(\n (prLabel: LabelResponse) => prLabel.id === label.id,\n );\n if (existing) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n const result = await context.github.issues.replaceLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(context, repoContext, pr, prLabels);\n // }\n\n return prLabels;\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.opened',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n autoAssignPRToCreator(context, repoContext),\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n context.payload.pull_request.head.ref.startsWith('renovate/')\n ? Promise.resolve(undefined)\n : updateReviewStatus(context, repoContext, 'dev', {\n add: ['needsReview'],\n }),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.closed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const pr = context.payload.pull_request;\n if (pr.merged) {\n await Promise.all([\n repoContext.removeMergeLocked(context, pr.number),\n // TODO delete branch\n ]);\n } else {\n await Promise.all([\n updateReviewStatus(context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.review_requested',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n\n // ignore if sender is self (dismissed review rerequest review)\n if (sender.type === 'Bot') return;\n\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n const shouldWait = false;\n // repoContext.reviewShouldWait(reviewerGroup, pr.requested_reviewers, { includesWaitForGroups: true });\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES' &&\n // In case this is a rerequest for review\n review.user.login !== reviewer.login,\n );\n\n if (!hasChangesRequestedInReviews) {\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved', 'changesRequested'],\n });\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${pr.html_url} !\\n> ${pr.title}`,\n );\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.review_request_removed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n const hasApprovedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'APPROVED',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: [\n // if changes requested by the one which requests was removed\n hasChangesRequestedInReviews && 'changesRequested',\n // if was already approved by another member in the group and has no other requests waiting\n approved && 'approved',\n ],\n // remove labels if has no other requests waiting\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n ],\n });\n }\n\n if (sender.login === reviewer.login) return;\n\n if (repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${pr.html_url}`,\n );\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request_review.submitted',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const pr = context.payload.pull_request;\n const { user: reviewer, state } = (context.payload as any).review;\n if (pr.user.login === reviewer.login) return;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged;\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n // TODO reenable this when accepted can notify request review to slack (dev accepted => design requested) and flag to disable for label (approved design ; still waiting for dev ?)\n // includesWaitForGroups: true,\n },\n );\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const newLabels = await updateReviewStatus(\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !(hasRequestedReviewsForGroup || state === 'changes_requested') &&\n 'requested',\n state === 'approved' &&\n !hasChangesRequestedInReviews &&\n 'changesRequested',\n state === 'changes_requested' && 'approved',\n ],\n },\n );\n\n if (approved && !hasChangesRequestedInReviews) {\n merged = await autoMergeIfPossible(\n context,\n repoContext,\n pr,\n newLabels,\n );\n }\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = pr.html_url;\n\n const message = (() => {\n if (state === 'changes_requested') {\n return `:x: ${mention} requests changes on ${prUrl}`;\n }\n if (state === 'approved') {\n return `:clap: :white_check_mark: ${mention} approves ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n return `:speech_balloon: ${mention} commented on ${prUrl}`;\n })();\n\n repoContext.slack.postMessage(pr.user.login, message);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request_review.dismissed',\n createHandlerPullRequestChange(async (context, repoContext) => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).review.user;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) === reviewerGroup &&\n review.state === 'REQUEST_CHANGES',\n );\n\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', 'requested'],\n remove: [\n !hasChangesRequestedInReviews && 'changesRequested',\n 'approved',\n ],\n });\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n repoContext.slack.postMessage(\n pr.user.login,\n `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${pr.html_url}`,\n );\n } else {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${pr.html_url}`,\n );\n }\n }\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(async (context, repoContext) => {\n // old and new sha\n // const { before, after } = context.payload;\n\n await Promise.all([\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(context, repoContext),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { lintPR } from './actions/lintPR';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.edited',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n editOpenedPR(context, repoContext),\n lintPR(context, repoContext),\n ]);\n\n await autoMergeIfPossible(context, repoContext);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\n\nexport default (app: Application) => {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n async (context) => {\n const sender = context.payload.sender;\n if (sender.type === 'Bot') return;\n\n await handlerPullRequestChange(context, async (repoContext) => {\n const label = context.payload.label;\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.github.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.github.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(context, repoContext);\n\n if (\n context.payload.action === 'labeled' &&\n label.id ===\n (repoContext.labels['merge/automerge'] &&\n repoContext.labels['merge/automerge'].id)\n ) {\n await autoMergeIfPossible(context, repoContext);\n }\n });\n },\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'check_run.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_run.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_run.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default (app: Application) => {\n app.on(\n 'check_suite.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_suite.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_suite.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n};\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\nimport closedHandler from './pr-handlers/closed';\nimport reviewRequestedHandler from './pr-handlers/reviewRequested';\nimport reviewRequestRemovedHandler from './pr-handlers/reviewRequestRemoved';\nimport reviewSubmittedHandler from './pr-handlers/reviewSubmitted';\nimport reviewDismissedHandler from './pr-handlers/reviewDismissed';\nimport synchromizeHandler from './pr-handlers/synchronize';\nimport editedHandler from './pr-handlers/edited';\nimport labelsChanged from './pr-handlers/labelsChanged';\nimport checkrunCompleted from './pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './pr-handlers/checksuiteCompleted';\n\nif (!process.env.NAME) process.env.NAME = 'reviewflow';\n\n// const getConfig = require('probot-config')\n// const { MongoClient } = require('mongodb');\n\n// const connect = MongoClient.connect(process.env.MONGO_URL);\n// const db = connect.then(client => client.db(process.env.MONGO_DB));\n\n// let config = await getConfig(context, 'reviewflow.yml');\n\n// eslint-disable-next-line import/no-commonjs\nProbot.run((app: Application) => {\n openedHandler(app);\n closedHandler(app);\n reviewRequestedHandler(app);\n reviewRequestRemovedHandler(app);\n\n // app.on('pull_request.closed', async context => {\n\n // });\n\n // app.on('pull_request.reopened', async context => {\n\n // });\n\n reviewSubmittedHandler(app);\n reviewDismissedHandler(app);\n labelsChanged(app);\n synchromizeHandler(app);\n editedHandler(app);\n\n checkrunCompleted(app);\n checksuiteCompleted(app);\n});\n"],"names":["config","slackToken","process","env","ORNIKAR_SLACK_TOKEN","autoAssignToCreator","trimTitle","requiresReviewRequest","prLint","title","regExp","error","summary","bot","status","statusInfoFromMatch","match","issue","url","groups","dev","abarreir","ORNIKAR_EMAIL_DOMAIN","christophehurpeau","arthurflachs","skyline42sh","LentnerStefan","HugoGarrido","CorentinAndre","rigma","Mxime","damienorny","tilap","design","jperriere","CoralineColasse","waitForGroups","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","teamConfigs","ornikar","autoMergeIfPossible","context","repoContext","pr","payload","pull_request","prLabels","autoMergeLabel","find","l","id","log","debug","hasNeedsReview","hasRequestedReview","lockedPrNumber","getMergeLocked","number","info","pushAutomergeQueue","addMergeLock","mergeable","undefined","prResult","github","pulls","get","repo","data","merged","removeMergeLocked","mergeable_state","reschedule","String","head","ref","startsWith","issues","update","body","replace","checks","listForRef","sha","per_page","hasFailedChecks","check_runs","some","check","conclusion","statuses","repos","listStatusesForRef","hasFailedStatuses","state","merge","owner","login","base","mergeResult","merge_method","commit_title","commit_message","Boolean","err","initRepoLabels","listLabelsForRepo","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","description","existingLabel","label","result","createLabel","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","initTeamSlack","mention","postMessage","Promise","resolve","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackClient","WebClient","allUsers","users","limit","members","values","map","email","member","user","profile","console","warn","im","filter","open","channel","membersMap","Map","getUserFromGithubLogin","githubLogin","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","create","all","reviewGroupNames","needsReviewLabelIds","key","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","labelIdToGroupName","reviewGroupLabels","lock","Lock","lockMergePrNumber","automergeQueue","lockPROrPRS","prIdOrIds","callback","reject","createReleaseCallback","release","prId","prNumber","setTimeout","protectedLabelIds","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","Error","next","shift","push","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","createHandlerPullRequestsChange","getPullRequests","autoAssignPRToCreator","assignees","length","type","addAssignees","cleanTitle","trim","s","arg1","toLowerCase","editOpenedPR","lintPR","isPrFromBot","errorRule","rule","exec","date","Date","toISOString","hasLintPrCheck","NAME","createStatus","target_url","head_sha","started_at","completed_at","output","addStatusCheck","hasPrCheck","created_at","createFailedStatusCheck","updateStatusCheckFromLabels","requested_reviewers","rr","join","needsReviewGroupNames","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","newLabelNamesArray","oldLabels","size","replaceLabels","app","on","sender","reviewer","requested_reviewer","reviews","listReviews","hasChangesRequestedInReviews","html_url","hasRequestedReviewsForGroup","hasApprovedInReviews","newLabels","prUrl","message","action","removeLabel","addLabels","check_run","pull_requests","check_suite","Probot","run","openedHandler","closedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","labelsChanged","synchromizeHandler","editedHandler","checkrunCompleted","checksuiteCompleted"],"mappings":"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"} \ No newline at end of file diff --git a/dist/pr-handlers/actions/autoMergeIfPossible.d.ts.map b/dist/pr-handlers/actions/autoMergeIfPossible.d.ts.map index 2c2cbcbc6..57edd9d9b 100644 --- a/dist/pr-handlers/actions/autoMergeIfPossible.d.ts.map +++ b/dist/pr-handlers/actions/autoMergeIfPossible.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"autoMergeIfPossible.d.ts","sourceRoot":"","sources":["../../../src/pr-handlers/actions/autoMergeIfPossible.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,eAAO,MAAM,mBAAmB,kHAuJ/B,CAAC"} \ No newline at end of file +{"version":3,"file":"autoMergeIfPossible.d.ts","sourceRoot":"","sources":["../../../src/pr-handlers/actions/autoMergeIfPossible.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,eAAO,MAAM,mBAAmB,kHA8J/B,CAAC"} \ No newline at end of file diff --git a/src/pr-handlers/actions/autoMergeIfPossible.ts b/src/pr-handlers/actions/autoMergeIfPossible.ts index 968bf38e7..f3bc521f8 100644 --- a/src/pr-handlers/actions/autoMergeIfPossible.ts +++ b/src/pr-handlers/actions/autoMergeIfPossible.ts @@ -44,12 +44,19 @@ export const autoMergeIfPossible = async ( } if (pr.merged) { + repoContext.removeMergeLocked(context, pr.number); context.log.info(`automerge not possible: already merged pr ${pr.id}`); return false; } + context.log.info( + `automerge?: ${pr.id}, mergeable=${pr.mergeable} state=${ + pr.mergeable_state + }`, + ); if (!pr.mergeable) { - if (pr.mergeable_state === undefined) { + if (!pr.mergeable_state) { + context.log.info(`automerge not possible: rescheduling ${pr.id}`); // GitHub is determining whether the pull request is mergeable repoContext.reschedule(context, String(pr.id), pr.number); return false;