From e3ac7ebd7136dc32546e7f8ac5dd58141e694954 Mon Sep 17 00:00:00 2001 From: Christophe Hurpeau Date: Mon, 1 Apr 2019 20:03:44 +0200 Subject: [PATCH] feat: add valerian and tilap --- dist/index-node10-dev.cjs.js | 4 +++- dist/index-node10-dev.cjs.js.map | 2 +- dist/index-node10.cjs.js | 4 +++- dist/index-node10.cjs.js.map | 2 +- dist/teamconfigs/ornikar.d.ts.map | 2 +- src/teamconfigs/ornikar.ts | 2 ++ 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/dist/index-node10-dev.cjs.js b/dist/index-node10-dev.cjs.js index 58a08d9cf..31374dd7c 100644 --- a/dist/index-node10-dev.cjs.js +++ b/dist/index-node10-dev.cjs.js @@ -55,7 +55,9 @@ const config = { CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`, rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`, Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`, - damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}` + damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`, + tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`, + '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}` }, design: { jperriere: `julien${process.env.ORNIKAR_EMAIL_DOMAIN}`, diff --git a/dist/index-node10-dev.cjs.js.map b/dist/index-node10-dev.cjs.js.map index f80d70bc2..bc1d97544 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/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/opened.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/actions/autoMergeIfPossible.ts","../src/pr-handlers/labelsChanged.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 },\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, Group } 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\nexport const getMembers = (\n groups: Record,\n): string[] => {\n return Object.values(groups).flat(1);\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 type Labels = Record;\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 always undefined\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.values(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 Webhooks from '@octokit/webhooks';\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\nimport { GroupLabels } from '../teamconfigs/types';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n\n updateStatusCheckFromLabels(\n context: Context,\n labels?: LabelResponse[],\n ): Promise;\n\n lockPR(\n context: Context,\n callback: () => Promise | void,\n ): Promise;\n\n updateReviewStatus(\n context: Context,\n reviewGroup: GroupNames | undefined,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n ): Promise;\n\n addStatusCheckToLatestCommit(context: Context): Promise;\n}\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\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 initRepoLabels(context, config);\n const labelsValues = Object.values(labels);\n const reviewKeys = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n >(context: Context, statusInfo: any): Promise {\n const pr = context.payload.pull_request;\n\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME,\n head_sha: pr.head.sha,\n ...statusInfo,\n }),\n );\n };\n\n const createInProgressStatusCheck = <\n E extends Webhooks.WebhookPayloadPullRequest\n >(\n context: Context,\n ): Promise =>\n addStatusCheck(context, {\n status: 'in_progress',\n });\n\n const createFailedStatusCheck = <\n E extends Webhooks.WebhookPayloadPullRequest\n >(\n context: Context,\n message: string,\n ): Promise =>\n addStatusCheck(context, {\n status: 'completed',\n conclusion: 'failure',\n started_at: context.payload.pull_request.created_at,\n completed_at: new Date(),\n output: {\n title: message,\n summary: '',\n },\n });\n\n const createDoneStatusCheck = (context: Context): Promise =>\n addStatusCheck(context, {\n status: 'completed',\n conclusion: 'success',\n started_at: context.payload.pull_request.created_at,\n completed_at: new Date(),\n output: {\n title: '✓ All reviews done !',\n summary: 'Pull request was successfully reviewed',\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 hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const updateStatusCheckFromLabels = async (\n context: Context,\n labels: LabelResponse[] = context.payload.pull_request.labels || [],\n ) => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: hasNeedsReview(labels),\n hasApprovesReview: hasApprovesReview(labels),\n });\n\n if (hasNeedsReview(labels)) {\n console.log(config.requiresReviewRequest, !hasRequestedReview(labels));\n if (config.requiresReviewRequest && !hasRequestedReview(labels)) {\n await createFailedStatusCheck(\n context,\n 'You need to request someone to review the PR',\n );\n return;\n }\n await createInProgressStatusCheck(context);\n } else if (hasApprovesReview(labels)) {\n await createDoneStatusCheck(context);\n }\n };\n\n const lock = Lock();\n\n return Object.assign(repoContext, {\n labels,\n updateStatusCheckFromLabels,\n\n lockPR: (context, callback) =>\n new Promise((resolve, reject) => {\n const pr = context.payload.pull_request;\n console.log('lock: try to lock pr', { id: pr.id });\n lock(`${pr.id}`, async (release) => {\n console.log('lock: lock acquired', { id: pr.id });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { id: pr.id });\n release()();\n reject(err);\n return;\n }\n console.log('lock: release pr', { id: pr.id });\n release()();\n resolve();\n });\n }),\n\n updateReviewStatus: async (\n context,\n reviewGroup: GroupNames,\n { add: labelsToAdd, remove: labelsToRemove },\n ) => {\n if (!reviewGroup) return;\n\n const prLabels = context.payload.pull_request.labels || [];\n const newLabels = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n const toAdd = new Set();\n const toDelete = new Set();\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = 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 newLabels.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 newLabels.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabels: [...newLabels],\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n await context.github.issues.replaceLabels(\n context.issue({\n labels: [...newLabels],\n }),\n );\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 updateStatusCheckFromLabels(\n context,\n [...newLabels]\n .map((labelName) => labelsValues.find((l) => l.name === labelName))\n // ignore labels not handled, like \"wip\"\n .filter(ExcludesFalsy),\n );\n // }\n },\n\n addStatusCheckToLatestCommit: (context) =>\n // old and new sha\n // const { before, after } = context.payload;\n updateStatusCheckFromLabels(context),\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 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.lockPR(context, async () => {\n await callback(repoContext);\n });\n};\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: (\n context: Context,\n repoContext: RepoContext,\n ) => void | Promise,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n ...args: any[]\n) => Promise;\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().toString();\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 { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\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 repoContext.updateReviewStatus(context, 'dev', {\n add: ['needsReview'],\n }),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\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 repoContext.updateReviewStatus(context, 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';\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 const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\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\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 repoContext.updateReviewStatus(context, 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';\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\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 repoContext.updateReviewStatus(context, reviewerGroup, {\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 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 }\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';\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 repoContext.updateReviewStatus(context, 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';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n editOpenedPR(context, repoContext),\n repoContext.addStatusCheckToLatestCommit(context),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { lintPR } from './actions/lintPR';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\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 );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoMergeIfPossible: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext, labelAdded?: boolean) => {\n if (!labelAdded) return;\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return;\n\n const pr = context.payload.pull_request;\n\n if (!pr.labels.find((l) => l.id === autoMergeLabel.id)) return;\n\n if (pr.mergeable) {\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.info('merge result:', mergeResult);\n }\n};\n","import { Application } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\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 await repoContext.updateStatusCheckFromLabels(context);\n\n if (\n context.payload.action === 'labeled' &&\n context.payload.label.id ===\n (repoContext.labels['merge/automerge'] &&\n repoContext.labels['merge/automerge'].id)\n ) {\n await autoMergeIfPossible(context, repoContext, true);\n }\n });\n },\n );\n};\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\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';\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 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"],"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","design","jperriere","CoralineColasse","waitForGroups","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","teamConfigs","ornikar","initRepoLabels","context","data","github","issues","listLabelsForRepo","repo","per_page","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","description","existingLabel","find","label","result","createLabel","log","info","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","Boolean","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","undefined","filter","open","id","channel","err","membersMap","Map","getUserFromGithubLogin","githubLogin","get","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","login","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","some","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","owner","payload","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","repoContext","create","labelsValues","reviewKeys","needsReviewLabelIds","key","requestedReviewLabelIds","approvedReviewLabelIds","addStatusCheck","statusInfo","pr","pull_request","checks","NAME","head_sha","head","sha","createInProgressStatusCheck","createFailedStatusCheck","message","conclusion","started_at","created_at","completed_at","Date","output","createDoneStatusCheck","hasNeedsReview","hasRequestedReview","hasApprovesReview","updateStatusCheckFromLabels","l","lock","Lock","lockPR","callback","reject","release","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","prLabels","newLabels","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","oldLabels","size","replaceLabels","labelName","addStatusCheckToLatestCommit","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","autoAssignPRToCreator","assignees","length","type","addAssignees","cleanTitle","trim","replace","s","arg1","toLowerCase","editOpenedPR","update","lintPR","isPrFromBot","statuses","errorRule","rule","exec","push","date","toString","hasLintPrCheck","listForRef","ref","check_runs","check","all","repos","createStatus","state","target_url","app","on","sender","reviewer","requested_reviewer","reviews","pulls","listReviews","hasChangesRequestedInReviews","html_url","hasRequestedReviewsForGroup","requested_reviewers","hasApprovedInReviews","prUrl","autoMergeIfPossible","labelAdded","autoMergeLabel","mergeable","mergeResult","merge","merge_method","number","commit_title","commit_message","action","Probot","run","openedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","labelsChanged","synchromizeHandler","editedHandler"],"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/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/opened.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/actions/autoMergeIfPossible.ts","../src/pr-handlers/labelsChanged.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, Group } 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\nexport const getMembers = (\n groups: Record,\n): string[] => {\n return Object.values(groups).flat(1);\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 type Labels = Record;\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 always undefined\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.values(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 Webhooks from '@octokit/webhooks';\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\nimport { GroupLabels } from '../teamconfigs/types';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n\n updateStatusCheckFromLabels(\n context: Context,\n labels?: LabelResponse[],\n ): Promise;\n\n lockPR(\n context: Context,\n callback: () => Promise | void,\n ): Promise;\n\n updateReviewStatus(\n context: Context,\n reviewGroup: GroupNames | undefined,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n ): Promise;\n\n addStatusCheckToLatestCommit(context: Context): Promise;\n}\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\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 initRepoLabels(context, config);\n const labelsValues = Object.values(labels);\n const reviewKeys = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n >(context: Context, statusInfo: any): Promise {\n const pr = context.payload.pull_request;\n\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME,\n head_sha: pr.head.sha,\n ...statusInfo,\n }),\n );\n };\n\n const createInProgressStatusCheck = <\n E extends Webhooks.WebhookPayloadPullRequest\n >(\n context: Context,\n ): Promise =>\n addStatusCheck(context, {\n status: 'in_progress',\n });\n\n const createFailedStatusCheck = <\n E extends Webhooks.WebhookPayloadPullRequest\n >(\n context: Context,\n message: string,\n ): Promise =>\n addStatusCheck(context, {\n status: 'completed',\n conclusion: 'failure',\n started_at: context.payload.pull_request.created_at,\n completed_at: new Date(),\n output: {\n title: message,\n summary: '',\n },\n });\n\n const createDoneStatusCheck = (context: Context): Promise =>\n addStatusCheck(context, {\n status: 'completed',\n conclusion: 'success',\n started_at: context.payload.pull_request.created_at,\n completed_at: new Date(),\n output: {\n title: '✓ All reviews done !',\n summary: 'Pull request was successfully reviewed',\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 hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const updateStatusCheckFromLabels = async (\n context: Context,\n labels: LabelResponse[] = context.payload.pull_request.labels || [],\n ) => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: hasNeedsReview(labels),\n hasApprovesReview: hasApprovesReview(labels),\n });\n\n if (hasNeedsReview(labels)) {\n console.log(config.requiresReviewRequest, !hasRequestedReview(labels));\n if (config.requiresReviewRequest && !hasRequestedReview(labels)) {\n await createFailedStatusCheck(\n context,\n 'You need to request someone to review the PR',\n );\n return;\n }\n await createInProgressStatusCheck(context);\n } else if (hasApprovesReview(labels)) {\n await createDoneStatusCheck(context);\n }\n };\n\n const lock = Lock();\n\n return Object.assign(repoContext, {\n labels,\n updateStatusCheckFromLabels,\n\n lockPR: (context, callback) =>\n new Promise((resolve, reject) => {\n const pr = context.payload.pull_request;\n console.log('lock: try to lock pr', { id: pr.id });\n lock(`${pr.id}`, async (release) => {\n console.log('lock: lock acquired', { id: pr.id });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { id: pr.id });\n release()();\n reject(err);\n return;\n }\n console.log('lock: release pr', { id: pr.id });\n release()();\n resolve();\n });\n }),\n\n updateReviewStatus: async (\n context,\n reviewGroup: GroupNames,\n { add: labelsToAdd, remove: labelsToRemove },\n ) => {\n if (!reviewGroup) return;\n\n const prLabels = context.payload.pull_request.labels || [];\n const newLabels = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n const toAdd = new Set();\n const toDelete = new Set();\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = 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 newLabels.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 newLabels.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabels: [...newLabels],\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n await context.github.issues.replaceLabels(\n context.issue({\n labels: [...newLabels],\n }),\n );\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 updateStatusCheckFromLabels(\n context,\n [...newLabels]\n .map((labelName) => labelsValues.find((l) => l.name === labelName))\n // ignore labels not handled, like \"wip\"\n .filter(ExcludesFalsy),\n );\n // }\n },\n\n addStatusCheckToLatestCommit: (context) =>\n // old and new sha\n // const { before, after } = context.payload;\n updateStatusCheckFromLabels(context),\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 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.lockPR(context, async () => {\n await callback(repoContext);\n });\n};\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: (\n context: Context,\n repoContext: RepoContext,\n ) => void | Promise,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n ...args: any[]\n) => Promise;\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().toString();\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 { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\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 repoContext.updateReviewStatus(context, 'dev', {\n add: ['needsReview'],\n }),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\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 repoContext.updateReviewStatus(context, 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';\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 const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\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\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 repoContext.updateReviewStatus(context, 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';\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\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 repoContext.updateReviewStatus(context, reviewerGroup, {\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 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 }\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';\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 repoContext.updateReviewStatus(context, 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';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n editOpenedPR(context, repoContext),\n repoContext.addStatusCheckToLatestCommit(context),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { lintPR } from './actions/lintPR';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\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 );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoMergeIfPossible: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext, labelAdded?: boolean) => {\n if (!labelAdded) return;\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return;\n\n const pr = context.payload.pull_request;\n\n if (!pr.labels.find((l) => l.id === autoMergeLabel.id)) return;\n\n if (pr.mergeable) {\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.info('merge result:', mergeResult);\n }\n};\n","import { Application } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\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 await repoContext.updateStatusCheckFromLabels(context);\n\n if (\n context.payload.action === 'labeled' &&\n context.payload.label.id ===\n (repoContext.labels['merge/automerge'] &&\n repoContext.labels['merge/automerge'].id)\n ) {\n await autoMergeIfPossible(context, repoContext, true);\n }\n });\n },\n );\n};\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\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';\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 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"],"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","initRepoLabels","context","data","github","issues","listLabelsForRepo","repo","per_page","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","description","existingLabel","find","label","result","createLabel","log","info","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","Boolean","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","undefined","filter","open","id","channel","err","membersMap","Map","getUserFromGithubLogin","githubLogin","get","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","login","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","some","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","owner","payload","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","repoContext","create","labelsValues","reviewKeys","needsReviewLabelIds","key","requestedReviewLabelIds","approvedReviewLabelIds","addStatusCheck","statusInfo","pr","pull_request","checks","NAME","head_sha","head","sha","createInProgressStatusCheck","createFailedStatusCheck","message","conclusion","started_at","created_at","completed_at","Date","output","createDoneStatusCheck","hasNeedsReview","hasRequestedReview","hasApprovesReview","updateStatusCheckFromLabels","l","lock","Lock","lockPR","callback","reject","release","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","prLabels","newLabels","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","oldLabels","size","replaceLabels","labelName","addStatusCheckToLatestCommit","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","autoAssignPRToCreator","assignees","length","type","addAssignees","cleanTitle","trim","replace","s","arg1","toLowerCase","editOpenedPR","update","lintPR","isPrFromBot","statuses","errorRule","rule","exec","push","date","toString","hasLintPrCheck","listForRef","ref","check_runs","check","all","repos","createStatus","state","target_url","app","on","sender","reviewer","requested_reviewer","reviews","pulls","listReviews","hasChangesRequestedInReviews","html_url","hasRequestedReviewsForGroup","requested_reviewers","hasApprovedInReviews","prUrl","autoMergeIfPossible","labelAdded","autoMergeLabel","mergeable","mergeResult","merge","merge_method","number","commit_title","commit_message","action","Probot","run","openedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","labelsChanged","synchromizeHandler","editedHandler"],"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 2dc7022d8..add35d58f 100644 --- a/dist/index-node10.cjs.js +++ b/dist/index-node10.cjs.js @@ -55,7 +55,9 @@ const config = { CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`, rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`, Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`, - damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}` + damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`, + tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`, + '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}` }, design: { jperriere: `julien${process.env.ORNIKAR_EMAIL_DOMAIN}`, diff --git a/dist/index-node10.cjs.js.map b/dist/index-node10.cjs.js.map index 4c1943a9a..c9bbbaea8 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/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/opened.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/actions/autoMergeIfPossible.ts","../src/pr-handlers/labelsChanged.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 },\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, Group } 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\nexport const getMembers = (\n groups: Record,\n): string[] => {\n return Object.values(groups).flat(1);\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 type Labels = Record;\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 always undefined\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.values(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 Webhooks from '@octokit/webhooks';\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\nimport { GroupLabels } from '../teamconfigs/types';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n\n updateStatusCheckFromLabels(\n context: Context,\n labels?: LabelResponse[],\n ): Promise;\n\n lockPR(\n context: Context,\n callback: () => Promise | void,\n ): Promise;\n\n updateReviewStatus(\n context: Context,\n reviewGroup: GroupNames | undefined,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n ): Promise;\n\n addStatusCheckToLatestCommit(context: Context): Promise;\n}\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\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 initRepoLabels(context, config);\n const labelsValues = Object.values(labels);\n const reviewKeys = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n >(context: Context, statusInfo: any): Promise {\n const pr = context.payload.pull_request;\n\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME,\n head_sha: pr.head.sha,\n ...statusInfo,\n }),\n );\n };\n\n const createInProgressStatusCheck = <\n E extends Webhooks.WebhookPayloadPullRequest\n >(\n context: Context,\n ): Promise =>\n addStatusCheck(context, {\n status: 'in_progress',\n });\n\n const createFailedStatusCheck = <\n E extends Webhooks.WebhookPayloadPullRequest\n >(\n context: Context,\n message: string,\n ): Promise =>\n addStatusCheck(context, {\n status: 'completed',\n conclusion: 'failure',\n started_at: context.payload.pull_request.created_at,\n completed_at: new Date(),\n output: {\n title: message,\n summary: '',\n },\n });\n\n const createDoneStatusCheck = (context: Context): Promise =>\n addStatusCheck(context, {\n status: 'completed',\n conclusion: 'success',\n started_at: context.payload.pull_request.created_at,\n completed_at: new Date(),\n output: {\n title: '✓ All reviews done !',\n summary: 'Pull request was successfully reviewed',\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 hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const updateStatusCheckFromLabels = async (\n context: Context,\n labels: LabelResponse[] = context.payload.pull_request.labels || [],\n ) => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: hasNeedsReview(labels),\n hasApprovesReview: hasApprovesReview(labels),\n });\n\n if (hasNeedsReview(labels)) {\n console.log(config.requiresReviewRequest, !hasRequestedReview(labels));\n if (config.requiresReviewRequest && !hasRequestedReview(labels)) {\n await createFailedStatusCheck(\n context,\n 'You need to request someone to review the PR',\n );\n return;\n }\n await createInProgressStatusCheck(context);\n } else if (hasApprovesReview(labels)) {\n await createDoneStatusCheck(context);\n }\n };\n\n const lock = Lock();\n\n return Object.assign(repoContext, {\n labels,\n updateStatusCheckFromLabels,\n\n lockPR: (context, callback) =>\n new Promise((resolve, reject) => {\n const pr = context.payload.pull_request;\n console.log('lock: try to lock pr', { id: pr.id });\n lock(`${pr.id}`, async (release) => {\n console.log('lock: lock acquired', { id: pr.id });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { id: pr.id });\n release()();\n reject(err);\n return;\n }\n console.log('lock: release pr', { id: pr.id });\n release()();\n resolve();\n });\n }),\n\n updateReviewStatus: async (\n context,\n reviewGroup: GroupNames,\n { add: labelsToAdd, remove: labelsToRemove },\n ) => {\n if (!reviewGroup) return;\n\n const prLabels = context.payload.pull_request.labels || [];\n const newLabels = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n const toAdd = new Set();\n const toDelete = new Set();\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = 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 newLabels.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 newLabels.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabels: [...newLabels],\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n await context.github.issues.replaceLabels(\n context.issue({\n labels: [...newLabels],\n }),\n );\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 updateStatusCheckFromLabels(\n context,\n [...newLabels]\n .map((labelName) => labelsValues.find((l) => l.name === labelName))\n // ignore labels not handled, like \"wip\"\n .filter(ExcludesFalsy),\n );\n // }\n },\n\n addStatusCheckToLatestCommit: (context) =>\n // old and new sha\n // const { before, after } = context.payload;\n updateStatusCheckFromLabels(context),\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 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.lockPR(context, async () => {\n await callback(repoContext);\n });\n};\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: (\n context: Context,\n repoContext: RepoContext,\n ) => void | Promise,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n ...args: any[]\n) => Promise;\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().toString();\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 { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\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 repoContext.updateReviewStatus(context, 'dev', {\n add: ['needsReview'],\n }),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\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 repoContext.updateReviewStatus(context, 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';\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 const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\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\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 repoContext.updateReviewStatus(context, 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';\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\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 repoContext.updateReviewStatus(context, reviewerGroup, {\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 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 }\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';\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 repoContext.updateReviewStatus(context, 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';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n editOpenedPR(context, repoContext),\n repoContext.addStatusCheckToLatestCommit(context),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { lintPR } from './actions/lintPR';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\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 );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoMergeIfPossible: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext, labelAdded?: boolean) => {\n if (!labelAdded) return;\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return;\n\n const pr = context.payload.pull_request;\n\n if (!pr.labels.find((l) => l.id === autoMergeLabel.id)) return;\n\n if (pr.mergeable) {\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.info('merge result:', mergeResult);\n }\n};\n","import { Application } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\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 await repoContext.updateStatusCheckFromLabels(context);\n\n if (\n context.payload.action === 'labeled' &&\n context.payload.label.id ===\n (repoContext.labels['merge/automerge'] &&\n repoContext.labels['merge/automerge'].id)\n ) {\n await autoMergeIfPossible(context, repoContext, true);\n }\n });\n },\n );\n};\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\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';\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 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"],"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","design","jperriere","CoralineColasse","waitForGroups","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","teamConfigs","ornikar","initRepoLabels","context","data","github","issues","listLabelsForRepo","repo","per_page","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","description","existingLabel","find","label","result","createLabel","log","info","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","Boolean","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","undefined","filter","open","id","channel","err","membersMap","Map","getUserFromGithubLogin","githubLogin","get","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","login","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","some","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","owner","payload","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","repoContext","create","labelsValues","reviewKeys","needsReviewLabelIds","key","requestedReviewLabelIds","approvedReviewLabelIds","addStatusCheck","statusInfo","pr","pull_request","checks","NAME","head_sha","head","sha","createInProgressStatusCheck","createFailedStatusCheck","message","conclusion","started_at","created_at","completed_at","Date","output","createDoneStatusCheck","hasNeedsReview","hasRequestedReview","hasApprovesReview","updateStatusCheckFromLabels","l","lock","Lock","lockPR","callback","reject","release","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","prLabels","newLabels","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","oldLabels","size","replaceLabels","labelName","addStatusCheckToLatestCommit","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","autoAssignPRToCreator","assignees","length","type","addAssignees","cleanTitle","trim","replace","s","arg1","toLowerCase","editOpenedPR","update","lintPR","isPrFromBot","statuses","errorRule","rule","exec","push","date","toString","hasLintPrCheck","listForRef","ref","check_runs","check","all","repos","createStatus","state","target_url","app","on","sender","reviewer","requested_reviewer","reviews","pulls","listReviews","hasChangesRequestedInReviews","html_url","hasRequestedReviewsForGroup","requested_reviewers","hasApprovedInReviews","prUrl","autoMergeIfPossible","labelAdded","autoMergeLabel","mergeable","mergeResult","merge","merge_method","number","commit_title","commit_message","action","Probot","run","openedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","labelsChanged","synchromizeHandler","editedHandler"],"mappings":"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"} \ 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/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/opened.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/actions/autoMergeIfPossible.ts","../src/pr-handlers/labelsChanged.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, Group } 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\nexport const getMembers = (\n groups: Record,\n): string[] => {\n return Object.values(groups).flat(1);\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 type Labels = Record;\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 always undefined\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.values(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 Webhooks from '@octokit/webhooks';\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\nimport { GroupLabels } from '../teamconfigs/types';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n\n updateStatusCheckFromLabels(\n context: Context,\n labels?: LabelResponse[],\n ): Promise;\n\n lockPR(\n context: Context,\n callback: () => Promise | void,\n ): Promise;\n\n updateReviewStatus(\n context: Context,\n reviewGroup: GroupNames | undefined,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n ): Promise;\n\n addStatusCheckToLatestCommit(context: Context): Promise;\n}\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\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 initRepoLabels(context, config);\n const labelsValues = Object.values(labels);\n const reviewKeys = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewKeys\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n >(context: Context, statusInfo: any): Promise {\n const pr = context.payload.pull_request;\n\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME,\n head_sha: pr.head.sha,\n ...statusInfo,\n }),\n );\n };\n\n const createInProgressStatusCheck = <\n E extends Webhooks.WebhookPayloadPullRequest\n >(\n context: Context,\n ): Promise =>\n addStatusCheck(context, {\n status: 'in_progress',\n });\n\n const createFailedStatusCheck = <\n E extends Webhooks.WebhookPayloadPullRequest\n >(\n context: Context,\n message: string,\n ): Promise =>\n addStatusCheck(context, {\n status: 'completed',\n conclusion: 'failure',\n started_at: context.payload.pull_request.created_at,\n completed_at: new Date(),\n output: {\n title: message,\n summary: '',\n },\n });\n\n const createDoneStatusCheck = (context: Context): Promise =>\n addStatusCheck(context, {\n status: 'completed',\n conclusion: 'success',\n started_at: context.payload.pull_request.created_at,\n completed_at: new Date(),\n output: {\n title: '✓ All reviews done !',\n summary: 'Pull request was successfully reviewed',\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 hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const updateStatusCheckFromLabels = async (\n context: Context,\n labels: LabelResponse[] = context.payload.pull_request.labels || [],\n ) => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: hasNeedsReview(labels),\n hasApprovesReview: hasApprovesReview(labels),\n });\n\n if (hasNeedsReview(labels)) {\n console.log(config.requiresReviewRequest, !hasRequestedReview(labels));\n if (config.requiresReviewRequest && !hasRequestedReview(labels)) {\n await createFailedStatusCheck(\n context,\n 'You need to request someone to review the PR',\n );\n return;\n }\n await createInProgressStatusCheck(context);\n } else if (hasApprovesReview(labels)) {\n await createDoneStatusCheck(context);\n }\n };\n\n const lock = Lock();\n\n return Object.assign(repoContext, {\n labels,\n updateStatusCheckFromLabels,\n\n lockPR: (context, callback) =>\n new Promise((resolve, reject) => {\n const pr = context.payload.pull_request;\n console.log('lock: try to lock pr', { id: pr.id });\n lock(`${pr.id}`, async (release) => {\n console.log('lock: lock acquired', { id: pr.id });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { id: pr.id });\n release()();\n reject(err);\n return;\n }\n console.log('lock: release pr', { id: pr.id });\n release()();\n resolve();\n });\n }),\n\n updateReviewStatus: async (\n context,\n reviewGroup: GroupNames,\n { add: labelsToAdd, remove: labelsToRemove },\n ) => {\n if (!reviewGroup) return;\n\n const prLabels = context.payload.pull_request.labels || [];\n const newLabels = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n const toAdd = new Set();\n const toDelete = new Set();\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = 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 newLabels.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 newLabels.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabels: [...newLabels],\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n await context.github.issues.replaceLabels(\n context.issue({\n labels: [...newLabels],\n }),\n );\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 updateStatusCheckFromLabels(\n context,\n [...newLabels]\n .map((labelName) => labelsValues.find((l) => l.name === labelName))\n // ignore labels not handled, like \"wip\"\n .filter(ExcludesFalsy),\n );\n // }\n },\n\n addStatusCheckToLatestCommit: (context) =>\n // old and new sha\n // const { before, after } = context.payload;\n updateStatusCheckFromLabels(context),\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 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.lockPR(context, async () => {\n await callback(repoContext);\n });\n};\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: (\n context: Context,\n repoContext: RepoContext,\n ) => void | Promise,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n ...args: any[]\n) => Promise;\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().toString();\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 { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { lintPR } from './actions/lintPR';\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 repoContext.updateReviewStatus(context, 'dev', {\n add: ['needsReview'],\n }),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\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 repoContext.updateReviewStatus(context, 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';\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 const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\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\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 repoContext.updateReviewStatus(context, 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';\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\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 repoContext.updateReviewStatus(context, reviewerGroup, {\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 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 }\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';\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 repoContext.updateReviewStatus(context, 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';\n\nexport default (app: Application) => {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(async (context, repoContext) => {\n await Promise.all([\n editOpenedPR(context, repoContext),\n repoContext.addStatusCheckToLatestCommit(context),\n ]);\n }),\n );\n};\n","import { Application } from 'probot';\nimport { lintPR } from './actions/lintPR';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\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 );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoMergeIfPossible: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext, labelAdded?: boolean) => {\n if (!labelAdded) return;\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return;\n\n const pr = context.payload.pull_request;\n\n if (!pr.labels.find((l) => l.id === autoMergeLabel.id)) return;\n\n if (pr.mergeable) {\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.info('merge result:', mergeResult);\n }\n};\n","import { Application } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\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 await repoContext.updateStatusCheckFromLabels(context);\n\n if (\n context.payload.action === 'labeled' &&\n context.payload.label.id ===\n (repoContext.labels['merge/automerge'] &&\n repoContext.labels['merge/automerge'].id)\n ) {\n await autoMergeIfPossible(context, repoContext, true);\n }\n });\n },\n );\n};\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\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';\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 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"],"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","initRepoLabels","context","data","github","issues","listLabelsForRepo","repo","per_page","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","description","existingLabel","find","label","result","createLabel","log","info","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","Boolean","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","undefined","filter","open","id","channel","err","membersMap","Map","getUserFromGithubLogin","githubLogin","get","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","login","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","some","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","owner","payload","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","repoContext","create","labelsValues","reviewKeys","needsReviewLabelIds","key","requestedReviewLabelIds","approvedReviewLabelIds","addStatusCheck","statusInfo","pr","pull_request","checks","NAME","head_sha","head","sha","createInProgressStatusCheck","createFailedStatusCheck","message","conclusion","started_at","created_at","completed_at","Date","output","createDoneStatusCheck","hasNeedsReview","hasRequestedReview","hasApprovesReview","updateStatusCheckFromLabels","l","lock","Lock","lockPR","callback","reject","release","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","prLabels","newLabels","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","oldLabels","size","replaceLabels","labelName","addStatusCheckToLatestCommit","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","autoAssignPRToCreator","assignees","length","type","addAssignees","cleanTitle","trim","replace","s","arg1","toLowerCase","editOpenedPR","update","lintPR","isPrFromBot","statuses","errorRule","rule","exec","push","date","toString","hasLintPrCheck","listForRef","ref","check_runs","check","all","repos","createStatus","state","target_url","app","on","sender","reviewer","requested_reviewer","reviews","pulls","listReviews","hasChangesRequestedInReviews","html_url","hasRequestedReviewsForGroup","requested_reviewers","hasApprovedInReviews","prUrl","autoMergeIfPossible","labelAdded","autoMergeLabel","mergeable","mergeResult","merge","merge_method","number","commit_title","commit_message","action","Probot","run","openedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","labelsChanged","synchromizeHandler","editedHandler"],"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;;ACSA,MAAM6B,cAAc,GAAG,OAC5BC,OAD4B,EAE5BrD,MAF4B,KAGR;QACd;IAAEsD,IAAI,EAAEjB;MAAW,MAAMgB,OAAO,CAACE,MAAR,CAAeC,MAAf,CAAsBC,iBAAtB,CAC7BJ,OAAO,CAACK,IAAR,CAAa;IAAEC,QAAQ,EAAE;GAAzB,CAD6B,CAA/B;QAGMC,WAA0C,GAAG,EAAnD;;OAEK,MAAM,CAACC,QAAD,EAAWC,WAAX,CAAX,IAAsCC,MAAM,CAACC,OAAP,CAAehE,MAAM,CAACqC,MAAP,CAAcC,IAA7B,CAAtC,EAA0E;UAClE2B,UAAU,GAAGH,WAAW,CAACtB,KAAZ,CAAkB0B,KAAlB,CAAwB,CAAxB,CAAnB;UACMC,WAAW,GAAI,gCAA+BN,QAAS,EAA7D;QAEIO,aAAa,GAAG/B,MAAM,CAACgC,IAAP,CAAaC,KAAD,IAAWA,KAAK,CAAC/B,IAAN,KAAeuB,WAAW,CAACvB,IAAlD,CAApB;;QACI,CAAC6B,aAAL,EAAoB;MAClBA,aAAa,GAAG/B,MAAM,CAACgC,IAAP,CAAaC,KAAD,IAAWA,KAAK,CAACH,WAAN,KAAsBA,WAA7C,CAAhB;;;QAEE,CAACC,aAAL,EAAoB;UACdP,QAAQ,KAAK,qBAAjB,EAAwC;QACtCO,aAAa,GAAG/B,MAAM,CAACgC,IAAP,CACbC,KAAD,IAAWA,KAAK,CAAC/B,IAAN,KAAe,qBADZ,CAAhB;;;UAIEsB,QAAQ,KAAK,iBAAjB,EAAoC;QAClCO,aAAa,GAAG/B,MAAM,CAACgC,IAAP,CACbC,KAAD,IAAWA,KAAK,CAAC/B,IAAN,KAAe,iBADZ,CAAhB;;;;QAMA,CAAC6B,aAAL,EAAoB;YACZG,MAAM,GAAG,MAAMlB,OAAO,CAACE,MAAR,CAAeC,MAAf,CAAsBgB,WAAtB,CACnBnB,OAAO,CAACK,IAAR,CAAa;QACXnB,IAAI,EAAEuB,WAAW,CAACvB,IADP;QAEXC,KAAK,EAAEyB,UAFI;QAGXE;OAHF,CADmB,CAArB;MAOAP,WAAW,CAACC,QAAD,CAAX,GAAwBU,MAAM,CAACjB,IAA/B;KARF,MASO,IACLc,aAAa,CAAC7B,IAAd,KAAuBuB,WAAW,CAACvB,IAAnC,IACA6B,aAAa,CAAC5B,KAAd,KAAwByB,UAFnB;;;MAKL;QACAZ,OAAO,CAACoB,GAAR,CAAYC,IAAZ,CAAiB,uBAAjB,EAA0C;UACxCC,YAAY,EAAEP,aAAa,CAAC7B,IADY;UAExCA,IAAI,EAAE6B,aAAa,CAAC7B,IAAd,KAAuBuB,WAAW,CAACvB,IAAnC,IAA2CuB,WAAW,CAACvB,IAFrB;UAGxCC,KAAK,EAAE4B,aAAa,CAAC5B,KAAd,KAAwByB,UAAxB,IAAsCA,UAHL;UAIxCE,WAAW,EAAEC,aAAa,CAACD,WAAd,KAA8BA,WAA9B,IAA6CA;SAJ5D;cAOMI,MAAM,GAAG,MAAMlB,OAAO,CAACE,MAAR,CAAeC,MAAf,CAAsBoB,WAAtB,CACnBvB,OAAO,CAACK,IAAR,CAAa;UACXiB,YAAY,EAAEP,aAAa,CAAC7B,IADjB;UAEXA,IAAI,EAAEuB,WAAW,CAACvB,IAFP;UAGXC,KAAK,EAAEyB,UAHI;UAIXE;SAJF,CADmB,CAArB;QAQAP,WAAW,CAACC,QAAD,CAAX,GAAwBU,MAAM,CAACjB,IAA/B;OArBK,MAsBA;MACLM,WAAW,CAACC,QAAD,CAAX,GAAwBO,aAAxB;;;;SAIGR,WAAP;CAlEK;;ACfA,MAAMiB,OAAO,GAAkBC,CAAf,IACrBf,MAAM,CAACgB,IAAP,CAAYD,CAAZ,CADK;;ACUP,MAAME,aAAa,GAAIC,OAAvB;AAIA,AAAO,MAAMC,aAAa,GAAG,OAC3B7B,OAD2B,EAE3BrD,MAF2B,KAGJ;MACnB,CAACA,MAAM,CAACC,UAAZ,EAAwB;WACf;MACLkF,OAAO,EAAE,MAAyB,EAD7B;MAELC,WAAW,EAAE,MAAuCC,OAAO,CAACC,OAAR;KAFtD;;;QAMIC,uBAAuB,GAAGV,OAAO,CAAC7E,MAAM,CAACmB,MAAR,CAAP,CAAuBqE,MAAvB,CAE7B,CAACC,GAAD,EAAMC,SAAN,KAAoB;IACrB3B,MAAM,CAAC4B,MAAP,CAAcF,GAAd,EAAmBzF,MAAM,CAACmB,MAAP,CAAcuE,SAAd,CAAnB;WACOD,GAAP;GAJ8B,EAK7B,EAL6B,CAAhC;QAOMG,WAAW,GAAG,IAAIC,gBAAJ,CAAc7F,MAAM,CAACC,UAArB,CAApB;QACM6F,QAAa,GAAG,MAAMF,WAAW,CAACG,KAAZ,CAAkBzD,IAAlB,CAAuB;IAAE0D,KAAK,EAAE;GAAhC,CAA5B;QACMC,OAA6C,GAAGlC,MAAM,CAACmC,MAAP,CACpDX,uBADoD,EAGnDY,GAHmD,CAG9CC,KAAD,IAAW;UACRC,MAAM,GAAGP,QAAQ,CAACG,OAAT,CAAiB5B,IAAjB,CACZiC,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,EAAEC;KAAtB,CAAP;GAXkD,EAgBnDC,MAhBmD,CAgB5C5B,aAhB4C,CAAtD;;OAkBK,MAAM,GAAGsB,IAAH,CAAX,IAAuBL,OAAvB,EAAgC;QAC1B;YACIS,EAAO,GAAG,MAAMd,WAAW,CAACc,EAAZ,CAAeG,IAAf,CAAoB;QAAEP,IAAI,EAAEA,IAAI,CAACD,MAAL,CAAYS;OAAxC,CAAtB;MACAR,IAAI,CAACI,EAAL,GAAUA,EAAE,CAACK,OAAb;KAFF,CAGE,OAAOC,GAAP,EAAY;MACZR,OAAO,CAAC7F,KAAR,CAAcqG,GAAd;;;;QAIEC,UAAU,GAAG,IAAIC,GAAJ,CAAQjB,OAAR,CAAnB;;QAEMkB,sBAAsB,GAAIC,WAAD,IAAyB;UAChDhB,KAAK,GAAGb,uBAAuB,CAAC6B,WAAD,CAArC;QACI,CAAChB,KAAL,EAAY,OAAO,IAAP;WACLa,UAAU,CAACI,GAAX,CAAejB,KAAf,CAAP;GAHF;;SAMO;IACLjB,OAAO,EAAGiC,WAAD,IAAyB;YAC1Bd,IAAI,GAAGa,sBAAsB,CAACC,WAAD,CAAnC;UACI,CAACd,IAAL,EAAW,OAAOc,WAAP;aACH,KAAId,IAAI,CAACD,MAAL,CAAYS,EAAG,GAA3B;KAJG;IAML1B,WAAW,EAAE,OAAOgC,WAAP,EAA4BE,IAA5B,KAA6C;MACxDjE,OAAO,CAACoB,GAAR,CAAYC,IAAZ,CAAiB,YAAjB,EAA+B;QAAE0C,WAAF;QAAeE;OAA9C;UACIpH,OAAO,CAACC,GAAR,CAAYoH,OAAhB,EAAyB;YAEnBjB,IAAI,GAAGa,sBAAsB,CAACC,WAAD,CAAnC;UACI,CAACd,IAAD,IAAS,CAACA,IAAI,CAACI,EAAnB,EAAuB;YACjBd,WAAW,CAAC4B,IAAZ,CAAiBpC,WAAjB,CAA6B;QACjC2B,OAAO,EAAET,IAAI,CAACI,EAAL,CAAQI,EADgB;QAEjCQ;OAFI,CAAN;;GAZJ;CAvDK;;ACKP,MAAMtC,eAAa,GAAIC,OAAvB;;AAIA,MAAMwC,eAAe,GAAG,OACtBpE,OADsB,EAEtBrD,MAFsB,KAGG;QACnB0H,YAAY,GAAGxC,aAAa,CAAC7B,OAAD,EAAUrD,MAAV,CAAlC;QAEM2H,kBAAkB,GAAG9C,OAAO,CAAC7E,MAAM,CAACmB,MAAR,CAAP,CAAuBqE,MAAvB,CACzB,CAACC,GAAD,EAAMC,SAAN,KAAoB;IAClB3B,MAAM,CAACmC,MAAP,CAAclG,MAAM,CAACmB,MAAP,CAAcuE,SAAd,CAAd,EAAwCkC,OAAxC,CAAiDC,KAAD,IAAW;MACzDpC,GAAG,CAACqC,GAAJ,CAAQD,KAAR,EAAenC,SAAf;KADF;WAGOD,GAAP;GALuB,EAOzB,IAAIyB,GAAJ,EAPyB,CAA3B;;QAUMa,iBAAiB,GAAIC,YAAD,IAA4B,CACpD,GAAG,IAAIC,GAAJ,CACDD,YAAY,CACT7B,GADH,CACQiB,WAAD,IAAiBO,kBAAkB,CAACN,GAAnB,CAAuBD,WAAvB,CADxB,EAEGR,MAFH,CAEU3B,OAFV,CADC,CADiD,CAAtD;;SAQO;IACLjF,MADK;IAELkI,gBAAgB,EAAGd,WAAD,IAAiBO,kBAAkB,CAACN,GAAnB,CAAuBD,WAAvB,CAF9B;IAGLW,iBAAiB,EAAGC,YAAD,IAAkB,CACnC,GAAG,IAAIC,GAAJ,CACDD,YAAY,CACT7B,GADH,CACQiB,WAAD,IAAiBO,kBAAkB,CAACN,GAAnB,CAAuBD,WAAvB,CADxB,EAEGR,MAFH,CAEU5B,eAFV,CADC,CADgC,CAHhC;IAWLmD,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,CAAClC,GAAnB,CAAwBsC,OAAD,IAAaA,OAAO,CAACZ,KAA5C,CAD+C,CAAjD,CAHG;;UASDS,qBAAqB,IACrBE,uBAAuB,CAACE,QAAxB,CAAiCN,aAAjC,CAFF,EAGE;eACO,IAAP;OAZC;;;UAgBCpI,MAAM,CAACoC,aAAP,IAAwBmG,qBAA5B,EAAmD;cAC3CnG,aAAa,GAAGpC,MAAM,CAACoC,aAA7B;eACOoG,uBAAuB,CAACG,IAAxB,CAA8BC,KAAD,IAClCxG,aAAa,CAACgG,aAAD,CAAb,CAA6BM,QAA7B,CAAsCE,KAAtC,CADK,CAAP;;;aAKK,KAAP;KAtCG;IAyCLC,KAAK,EAAE,MAAMnB;GAzCf;CAxBF;;AAqEA,MAAMoB,mBAAmB,GAAG,IAAI5B,GAAJ,EAA5B;AACA,MAAM6B,YAAY,GAAG,IAAI7B,GAAJ,EAArB;AAEA,AAAO,MAAM8B,iBAAiB,GAAG,CAC/B3F,OAD+B,EAE/BrD,MAF+B,KAGN;QACnBiJ,KAAK,GAAG5F,OAAO,CAAC6F,OAAR,CAAgBC,UAAhB,CAA2BF,KAAzC;QAEMG,mBAAmB,GAAGL,YAAY,CAAC1B,GAAb,CAAiB4B,KAAK,CAACpB,KAAvB,CAA5B;MACIuB,mBAAJ,EAAyB,OAAOA,mBAAP;QAEnBC,eAAe,GAAGP,mBAAmB,CAACzB,GAApB,CAAwB4B,KAAK,CAACpB,KAA9B,CAAxB;MACIwB,eAAJ,EAAqB,OAAOhE,OAAO,CAACC,OAAR,CAAgB+D,eAAhB,CAAP;QAEfC,OAAO,GAAG7B,eAAe,CAACpE,OAAD,EAAUrD,MAAV,CAA/B;EACA8I,mBAAmB,CAAChB,GAApB,CAAwBmB,KAAK,CAACpB,KAA9B,EAAqCyB,OAArC;SAEOA,OAAO,CAACC,IAAR,CAAcC,WAAD,IAAiB;IACnCV,mBAAmB,CAACW,MAApB,CAA2BR,KAAK,CAACpB,KAAjC;IACAkB,YAAY,CAACjB,GAAb,CAAiBmB,KAAK,CAACpB,KAAvB,EAA8B2B,WAA9B;WACOA,WAAP;GAHK,CAAP;CAfK;;AC/FP;AAGA,AAwCA,MAAMxE,eAAa,GAAIC,OAAvB;;AAIA,eAAeyE,eAAf,CACErG,OADF,EAEErD,MAFF,EAGoC;QAC5BwJ,WAAW,GAAG,MAAMR,iBAAiB,CAAC3F,OAAD,EAAUrD,MAAV,CAA3C;QACM2J,WAAW,GAAG5F,MAAM,CAAC6F,MAAP,CAAcJ,WAAd,CAApB;QAEMnH,MAAM,GAAG,MAAMe,cAAc,CAACC,OAAD,EAAUrD,MAAV,CAAnC;QACM6J,YAAY,GAAG9F,MAAM,CAACmC,MAAP,CAAc7D,MAAd,CAArB;QACMyH,UAAU,GAAG/F,MAAM,CAACgB,IAAP,CAAY/E,MAAM,CAACmB,MAAnB,CAAnB;QAEM4I,mBAAmB,GAAGD,UAAU,CACnC3D,GADyB,CACpB6D,GAAD,IAAShK,MAAM,CAACqC,MAAP,CAAcI,MAAd,CAAqBuH,GAArB,EAA0BlH,WADd,EAEzB8D,MAFyB,CAElB3B,OAFkB,EAGzBkB,GAHyB,CAGpB5D,IAAD,IAAUF,MAAM,CAACE,IAAD,CAAN,CAAauE,EAHF,CAA5B;QAKMmD,uBAAuB,GAAGH,UAAU,CACvC3D,GAD6B,CACxB6D,GAAD,IAAShK,MAAM,CAACqC,MAAP,CAAcI,MAAd,CAAqBuH,GAArB,EAA0BjH,SADV,EAE7B6D,MAF6B,CAEtB3B,OAFsB,EAG7BkB,GAH6B,CAGxB5D,IAAD,IAAUF,MAAM,CAACE,IAAD,CAAN,CAAauE,EAHE,CAAhC;QAKMoD,sBAAsB,GAAGJ,UAAU,CACtC3D,GAD4B,CACvB6D,GAAD,IAAShK,MAAM,CAACqC,MAAP,CAAcI,MAAd,CAAqBuH,GAArB,EAA0B/G,QADX,EAE5B2D,MAF4B,CAErB3B,OAFqB,EAG5BkB,GAH4B,CAGvB5D,IAAD,IAAUF,MAAM,CAACE,IAAD,CAAN,CAAauE,EAHC,CAA/B;;QAKMqD,cAAc,GAAG,gBAErB9G,OAFqB,EAEA+G,UAFA,EAEgC;UAC/CC,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B;UAEMjH,OAAO,CAACE,MAAR,CAAegH,MAAf,CAAsBX,MAAtB,CACJvG,OAAO,CAACK,IAAR,CAAa;MACXnB,IAAI,EAAErC,OAAO,CAACC,GAAR,CAAYqK,IADP;MAEXC,QAAQ,EAAEJ,EAAE,CAACK,IAAH,CAAQC,GAFP;SAGRP;KAHL,CADI,CAAN;GALF;;QAcMQ,2BAA2B,GAG/BvH,OAHkC,IAKlC8G,cAAc,CAAC9G,OAAD,EAAU;IACtBvC,MAAM,EAAE;GADI,CALhB;;QASM+J,uBAAuB,GAAG,CAG9BxH,OAH8B,EAI9ByH,OAJ8B,KAM9BX,cAAc,CAAC9G,OAAD,EAAU;IACtBvC,MAAM,EAAE,WADc;IAEtBiK,UAAU,EAAE,SAFU;IAGtBC,UAAU,EAAE3H,OAAO,CAAC6F,OAAR,CAAgBoB,YAAhB,CAA6BW,UAHnB;IAItBC,YAAY,EAAE,IAAIC,IAAJ,EAJQ;IAKtBC,MAAM,EAAE;MACN3K,KAAK,EAAEqK,OADD;MAENlK,OAAO,EAAE;;GAPC,CANhB;;QAiBMyK,qBAAqB,GAAIhI,OAAD,IAC5B8G,cAAc,CAAC9G,OAAD,EAAU;IACtBvC,MAAM,EAAE,WADc;IAEtBiK,UAAU,EAAE,SAFU;IAGtBC,UAAU,EAAE3H,OAAO,CAAC6F,OAAR,CAAgBoB,YAAhB,CAA6BW,UAHnB;IAItBC,YAAY,EAAE,IAAIC,IAAJ,EAJQ;IAKtBC,MAAM,EAAE;MACN3K,KAAK,EAAE,sBADD;MAENG,OAAO,EAAE;;GAPC,CADhB,CA/DkC;;;QA6E5B0K,cAAc,GAAIjJ,MAAD,IACrBA,MAAM,CAACsG,IAAP,CAAarE,KAAD,IAAWyF,mBAAmB,CAACrB,QAApB,CAA6BpE,KAAK,CAACwC,EAAnC,CAAvB,CADF;;QAEMyE,kBAAkB,GAAIlJ,MAAD,IACzBA,MAAM,CAACsG,IAAP,CAAarE,KAAD,IAAW2F,uBAAuB,CAACvB,QAAxB,CAAiCpE,KAAK,CAACwC,EAAvC,CAAvB,CADF;;QAEM0E,iBAAiB,GAAInJ,MAAD,IACxBA,MAAM,CAACsG,IAAP,CAAarE,KAAD,IAAW4F,sBAAsB,CAACxB,QAAvB,CAAgCpE,KAAK,CAACwC,EAAtC,CAAvB,CADF;;QAGM2E,2BAA2B,GAAG,OAClCpI,OADkC,EAElChB,MAAuB,GAAGgB,OAAO,CAAC6F,OAAR,CAAgBoB,YAAhB,CAA6BjI,MAA7B,IAAuC,EAF/B,KAG/B;IACHgB,OAAO,CAACoB,GAAR,CAAYC,IAAZ,CAAiB,6BAAjB,EAAgD;MAC9CrC,MAAM,EAAEA,MAAM,CAAC8D,GAAP,CAAYuF,CAAD,IAAOA,CAAC,IAAIA,CAAC,CAACnJ,IAAzB,CADsC;MAE9C+I,cAAc,EAAEA,cAAc,CAACjJ,MAAD,CAFgB;MAG9CmJ,iBAAiB,EAAEA,iBAAiB,CAACnJ,MAAD;KAHtC;;QAMIiJ,cAAc,CAACjJ,MAAD,CAAlB,EAA4B;MAC1BmE,OAAO,CAAC/B,GAAR,CAAYzE,MAAM,CAACO,qBAAnB,EAA0C,CAACgL,kBAAkB,CAAClJ,MAAD,CAA7D;;UACIrC,MAAM,CAACO,qBAAP,IAAgC,CAACgL,kBAAkB,CAAClJ,MAAD,CAAvD,EAAiE;cACzDwI,uBAAuB,CAC3BxH,OAD2B,EAE3B,8CAF2B,CAA7B;;;;YAMIuH,2BAA2B,CAACvH,OAAD,CAAjC;KATF,MAUO,IAAImI,iBAAiB,CAACnJ,MAAD,CAArB,EAA+B;YAC9BgJ,qBAAqB,CAAChI,OAAD,CAA3B;;GArBJ;;QAyBMsI,MAAI,GAAGC,SAAI,EAAjB;SAEO7H,MAAM,CAAC4B,MAAP,CAAcgE,WAAd,EAA2B;IAChCtH,MADgC;IAEhCoJ,2BAFgC;IAIhCI,MAAM,EAAE,CAACxI,OAAD,EAAUyI,QAAV,KACN,IAAIzG,OAAJ,CAAY,CAACC,OAAD,EAAUyG,MAAV,KAAqB;YACzB1B,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B;MACA9D,OAAO,CAAC/B,GAAR,CAAY,sBAAZ,EAAoC;QAAEqC,EAAE,EAAEuD,EAAE,CAACvD;OAA7C;MACA6E,MAAI,CAAE,GAAEtB,EAAE,CAACvD,EAAG,EAAV,EAAa,MAAOkF,OAAP,IAAmB;QAClCxF,OAAO,CAAC/B,GAAR,CAAY,qBAAZ,EAAmC;UAAEqC,EAAE,EAAEuD,EAAE,CAACvD;SAA5C;;YACI;gBACIgF,QAAQ,EAAd;SADF,CAEE,OAAO9E,GAAP,EAAY;UACZR,OAAO,CAAC/B,GAAR,CAAY,+BAAZ,EAA6C;YAAEqC,EAAE,EAAEuD,EAAE,CAACvD;WAAtD;UACAkF,OAAO;UACPD,MAAM,CAAC/E,GAAD,CAAN;;;;QAGFR,OAAO,CAAC/B,GAAR,CAAY,kBAAZ,EAAgC;UAAEqC,EAAE,EAAEuD,EAAE,CAACvD;SAAzC;QACAkF,OAAO;QACP1G,OAAO;OAZL,CAAJ;KAHF,CAL8B;IAwBhC2G,kBAAkB,EAAE,OAClB5I,OADkB,EAElB6I,WAFkB,EAGlB;MAAEC,GAAG,EAAEC,WAAP;MAAoBC,MAAM,EAAEC;KAHV,KAIf;UACC,CAACJ,WAAL,EAAkB;YAEZK,QAAQ,GAAGlJ,OAAO,CAAC6F,OAAR,CAAgBoB,YAAhB,CAA6BjI,MAA7B,IAAuC,EAAxD;YACMmK,SAAS,GAAG,IAAIvE,GAAJ,CAChBsE,QAAQ,CAACpG,GAAT,CAAc7B,KAAD,IAA0BA,KAAK,CAAC/B,IAA7C,CADgB,CAAlB;YAGMkK,KAAK,GAAG,IAAIxE,GAAJ,EAAd;YACMyE,QAAQ,GAAG,IAAIzE,GAAJ,EAAjB;;YAEM0E,eAAe,GAAI3C,GAAD,IAAiD;cACjE4C,YAAY,GAAG5M,MAAM,CAACqC,MAAP,CAAcI,MAAd,CAAqByJ,WAArB,CAArB;YACI,CAACU,YAAL,EAAmB,OAAOjG,SAAP;eAEZiG,YAAY,CAAC5C,GAAD,CAAZ,IAAqB3H,MAAM,CAACuK,YAAY,CAAC5C,GAAD,CAAb,CAA3B,GACH3H,MAAM,CAACuK,YAAY,CAAC5C,GAAD,CAAb,CADH,GAEHrD,SAFJ;OAJF;;UASIyF,WAAJ,EAAiB;QACfA,WAAW,CAACxE,OAAZ,CAAqBoC,GAAD,IAAS;cACvB,CAACA,GAAL,EAAU;gBACJ1F,KAAK,GAAGqI,eAAe,CAAC3C,GAAD,CAA7B;;cAEE,CAAC1F,KAAD,IACAiI,QAAQ,CAAC5D,IAAT,CAAekE,OAAD,IAA4BA,OAAO,CAAC/F,EAAR,KAAexC,KAAK,CAACwC,EAA/D,CAFF,EAGE;;;;UAGF0F,SAAS,CAACL,GAAV,CAAc7H,KAAK,CAAC/B,IAApB;UACAkK,KAAK,CAACN,GAAN,CAAUnC,GAAV;SAVF;;;UAcEsC,cAAJ,EAAoB;QAClBA,cAAc,CAAC1E,OAAf,CAAwBoC,GAAD,IAAS;cAC1B,CAACA,GAAL,EAAU;gBACJ1F,KAAK,GAAGqI,eAAe,CAAC3C,GAAD,CAA7B;cACI,CAAC1F,KAAL,EAAY;gBACNwI,QAAQ,GAAGP,QAAQ,CAAClI,IAAT,CACdwI,OAAD,IAA4BA,OAAO,CAAC/F,EAAR,KAAexC,KAAK,CAACwC,EADlC,CAAjB;;cAGIgG,QAAJ,EAAc;YACZN,SAAS,CAAC/C,MAAV,CAAiBqD,QAAQ,CAACvK,IAA1B;YACAmK,QAAQ,CAACP,GAAT,CAAanC,GAAb;;SATJ;;;MAcF3G,OAAO,CAACoB,GAAR,CAAYC,IAAZ,CAAiB,oBAAjB,EAAuC;QACrCwH,WADqC;QAErCO,KAAK,EAAE,CAAC,GAAGA,KAAJ,CAF8B;QAGrCC,QAAQ,EAAE,CAAC,GAAGA,QAAJ,CAH2B;QAIrCK,SAAS,EAAER,QAAQ,CAACpG,GAAT,CAAcuF,CAAD,IAAsBA,CAAC,CAACnJ,IAArC,CAJ0B;QAKrCiK,SAAS,EAAE,CAAC,GAAGA,SAAJ;OALb,EAjDG;;UA2DCC,KAAK,CAACO,IAAN,IAAcN,QAAQ,CAACM,IAA3B,EAAiC;cACzB3J,OAAO,CAACE,MAAR,CAAeC,MAAf,CAAsByJ,aAAtB,CACJ5J,OAAO,CAACpC,KAAR,CAAc;UACZoB,MAAM,EAAE,CAAC,GAAGmK,SAAJ;SADV,CADI,CAAN;OA5DC;;;;;;;;MAyEHf,2BAA2B,CACzBpI,OADyB,EAEzB,CAAC,GAAGmJ,SAAJ,EACGrG,GADH,CACQ+G,SAAD,IAAerD,YAAY,CAACxF,IAAb,CAAmBqH,CAAD,IAAOA,CAAC,CAACnJ,IAAF,KAAW2K,SAApC,CADtB;OAGGtG,MAHH,CAGU5B,eAHV,CAFyB,CAA3B,CAzEG;KA5B2B;IA+GhCmI,4BAA4B,EAAG9J,OAAD;;IAG5BoI,2BAA2B,CAACpI,OAAD;GAlHxB,CAAP;;;AAsHF,MAAM+J,mBAAmB,GAAG,IAAIlG,GAAJ,EAA5B;AACA,MAAMmG,YAAY,GAAG,IAAInG,GAAJ,EAArB;AAEA,AAAO,MAAMoG,iBAAiB,GAC5BjK,OAD+B,IAEe;QACxC4F,KAAK,GAAG5F,OAAO,CAAC6F,OAAR,CAAgBC,UAAhB,CAA2BF,KAAzC;;MACI,CAAC/F,WAAW,CAAC+F,KAAK,CAACpB,KAAP,CAAhB,EAA+B;IAC7BrB,OAAO,CAACC,IAAR,CAAawC,KAAK,CAACpB,KAAnB,EAA0B9D,MAAM,CAACgB,IAAP,CAAY7B,WAAZ,CAA1B;WACO,IAAP;;;QAEI8G,GAAG,GAAG3G,OAAO,CAAC6F,OAAR,CAAgBC,UAAhB,CAA2BrC,EAAvC;QAEMyG,mBAAmB,GAAGF,YAAY,CAAChG,GAAb,CAAiB2C,GAAjB,CAA5B;MACIuD,mBAAJ,EAAyB,OAAOA,mBAAP;QAEnBlE,eAAe,GAAG+D,mBAAmB,CAAC/F,GAApB,CAAwB2C,GAAxB,CAAxB;MACIX,eAAJ,EAAqB,OAAOhE,OAAO,CAACC,OAAR,CAAgB+D,eAAhB,CAAP;QAEfC,OAAO,GAAGI,eAAe,CAACrG,OAAD,EAAUH,WAAW,CAAC+F,KAAK,CAACpB,KAAP,CAArB,CAA/B;EACAuF,mBAAmB,CAACtF,GAApB,CAAwBkC,GAAxB,EAA6BV,OAA7B;SAEOA,OAAO,CAACC,IAAR,CAAcI,WAAD,IAAiB;IACnCyD,mBAAmB,CAAC3D,MAApB,CAA2BO,GAA3B;IACAqD,YAAY,CAACvF,GAAb,CAAiBkC,GAAjB,EAAsBL,WAAtB;WACOA,WAAP;GAHK,CAAP;CAnBK;;AClRA,MAAM6D,wBAAwB,GAAG,OAGtCnK,OAHsC,EAItCyI,QAJsC,KAKpB;QACZnC,WAAW,GAAG,MAAM2D,iBAAiB,CAACjK,OAAD,CAA3C;MACI,CAACsG,WAAL,EAAkB;EAElBA,WAAW,CAACkC,MAAZ,CAAmBxI,OAAnB,EAA4B,YAAY;UAChCyI,QAAQ,CAACnC,WAAD,CAAd;GADF;CATK;AAcP,AAAO,MAAM8D,8BAA8B,GAGzC3B,QAH4C,IAOxCzI,OAAD,IAAyB;SACrBmK,wBAAwB,CAACnK,OAAD,EAAWsG,WAAD,IACvCmC,QAAQ,CAACzI,OAAD,EAAUsG,WAAV,CADqB,CAA/B;CARK;;ACnBA,MAAM+D,qBAEZ,GAAG,OAAOrK,OAAP,EAAgBsG,WAAhB,KAAgC;MAC9B,CAACA,WAAW,CAAC3J,MAAZ,CAAmBK,mBAAxB,EAA6C;QAEvCgK,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B;MACID,EAAE,CAACsD,SAAH,CAAaC,MAAb,KAAwB,CAA5B,EAA+B;MAC3BvD,EAAE,CAAC/D,IAAH,CAAQuH,IAAR,KAAiB,KAArB,EAA4B;QAEtBxK,OAAO,CAACE,MAAR,CAAeC,MAAf,CAAsBsK,YAAtB,CACJzK,OAAO,CAACpC,KAAR,CAAc;IACZ0M,SAAS,EAAE,CAACtD,EAAE,CAAC/D,IAAH,CAAQuB,KAAT;GADb,CADI,CAAN;CATK;;ACHA,MAAMkG,UAAU,GAAItN,KAAD,IACxBA,KAAK,CACFuN,IADH,GAEGC,OAFH,CAEW,gCAFX,EAE6C,KAF7C,EAGGA,OAHH,CAGW,qBAHX,EAGkC,CAACC,CAAD,EAAIC,IAAJ,KAAc,GAAEA,IAAI,CAACC,WAAL,EAAmB,IAHrE,EAIGH,OAJH,CAIW,oBAJX,EAIiC,YAJjC;CAMGA,OANH,CAMW,4BANX,EAMyC,IANzC,CADK;;ACKA,MAAMI,YAAY,GAAG,CAC1BhL,OAD0B,EAE1BsG,WAF0B,KAGvB;MACC,CAACA,WAAW,CAAC3J,MAAZ,CAAmBM,SAAxB,EAAmC;QAE7B+J,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B;QACM7J,KAAK,GAAGsN,UAAU,CAAC1D,EAAE,CAAC5J,KAAJ,CAAxB;;MAEI4J,EAAE,CAAC5J,KAAH,KAAaA,KAAjB,EAAwB;IACtB4J,EAAE,CAAC5J,KAAH,GAAWA,KAAX;IACA4C,OAAO,CAACE,MAAR,CAAeC,MAAf,CAAsB8K,MAAtB,CACEjL,OAAO,CAACpC,KAAR,CAAc;MACZR;KADF,CADF;;CAXG;;ACaP,MAAMuE,eAAa,GAAIC,OAAvB;AAIA,AAAO,MAAMsJ,MAAM,GAAG,OACpBlL,OADoB,EAEpBsG,WAFoB,KAGjB;MACC,CAACA,WAAW,CAAC3J,MAAZ,CAAmBQ,MAAxB,EAAgC;QAE1BkD,IAAI,GAAGL,OAAO,CAAC6F,OAAR,CAAgBC,UAA7B;QACMkB,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B,CAJG;;MAOCD,EAAE,CAACK,IAAH,CAAQhH,IAAR,CAAaoD,EAAb,KAAoBpD,IAAI,CAACoD,EAA7B,EAAiC;QAE3B0H,WAAW,GAAGnE,EAAE,CAAC/D,IAAH,CAAQuH,IAAR,KAAiB,KAArC;QAEMY,QAAkB,GAAG,EAA3B;QAEMC,SAAS,GAAG/E,WAAW,CAAC3J,MAAZ,CAAmBQ,MAAnB,CAA0BC,KAA1B,CAAgC4D,IAAhC,CAAsCsK,IAAD,IAAU;QAC3DA,IAAI,CAAC9N,GAAL,KAAa,KAAb,IAAsB2N,WAA1B,EAAuC,OAAO,KAAP;UAEjCxN,KAAK,GAAG2N,IAAI,CAACjO,MAAL,CAAYkO,IAAZ,CAAiBvE,EAAE,CAAC5J,KAApB,CAAd;;QACIO,KAAK,KAAK,IAAd,EAAoB;UACd2N,IAAI,CAAC7N,MAAT,EAAiB;QACf2N,QAAQ,CAACI,IAAT,CAAc;UAAEtM,IAAI,EAAEoM,IAAI,CAAC7N,MAAb;UAAqBH,KAAK,EAAEgO,IAAI,CAAChO;SAA/C;;;aAEK,IAAP;;;QAGEgO,IAAI,CAAC7N,MAAL,IAAe6N,IAAI,CAAC5N,mBAAxB,EAA6C;MAC3C0N,QAAQ,CAACI,IAAT,CAAc;QACZtM,IAAI,EAAEoM,IAAI,CAAC7N,MADC;QAEZ4D,IAAI,EAAEiK,IAAI,CAAC5N,mBAAL,CAAyBC,KAAzB;OAFR;aAIO,KAAP;;;WAGK,KAAP;GAnBgB,CAAlB;QAsBM8N,IAAI,GAAG,IAAI3D,IAAJ,GAAW4D,QAAX,EAAb;QAEMC,cAAc,GAAG,CAAC,MAAM3L,OAAO,CAACE,MAAR,CAAegH,MAAf,CAAsB0E,UAAtB,CAC5B5L,OAAO,CAACK,IAAR,CAAa;IACXwL,GAAG,EAAE7E,EAAE,CAACK,IAAH,CAAQC;GADf,CAD4B,CAAP,EAIpBrH,IAJoB,CAIf6L,UAJe,CAIJ9K,IAJI,CAKpB+K,KAAD,IAAWA,KAAK,CAAC7M,IAAN,KAAgB,GAAErC,OAAO,CAACC,GAAR,CAAYqK,IAAK,UALzB,CAAvB;QAQMnF,OAAO,CAACgK,GAAR,CACJ,CACE,GAAGZ,QAAQ,CAACtI,GAAT,CAAa,CAAC;IAAE5D,IAAF;IAAQ5B,KAAR;IAAe+D;GAAhB,KACdrB,OAAO,CAACE,MAAR,CAAe+L,KAAf,CAAqBC,YAArB,CACElM,OAAO,CAACK,IAAR,CAAa;IACXL,OAAO,EAAG,GAAEnD,OAAO,CAACC,GAAR,CAAYqK,IAAK,IAAGjI,IAAK,EAD1B;IAEXoI,GAAG,EAAEN,EAAE,CAACK,IAAH,CAAQC,GAFF;IAGX6E,KAAK,EAAG7O,KAAK,GAAG,SAAH,GAAe,SAHjB;IAIX8O,UAAU,EAAE9O,KAAK,GAAGgG,SAAH,GAAgBjC,IAAD,CAAqBxD,GAJ1C;IAKXiD,WAAW,EAAExD,KAAK,GAAGA,KAAK,CAACF,KAAT,GAAkBiE,IAAD,CAAqBjE;GAL1D,CADF,CADC,CADL,EAYEuO,cAAc,IACZ3L,OAAO,CAACE,MAAR,CAAegH,MAAf,CAAsBX,MAAtB,CACEvG,OAAO,CAACK,IAAR,CAAa;IACXnB,IAAI,EAAG,GAAErC,OAAO,CAACC,GAAR,CAAYqK,IAAK,UADf;IAEXC,QAAQ,EAAEJ,EAAE,CAACK,IAAH,CAAQC,GAFP;IAGX7J,MAAM,EAAE,WAHG;IAIXiK,UAAU,EAAG2D,SAAS,GAAG,SAAH,GAAe,SAJ1B;IAOX1D,UAAU,EAAE8D,IAPD;IAQX5D,YAAY,EAAE4D,IARH;IASX1D,MAAM,EAAEsD,SAAS,GACbA,SAAS,CAAC/N,KADG,GAEb;MACEF,KAAK,EAAE,oBADT;MAEEG,OAAO,EAAE;;GAbjB,CADF,CAbJ,EA+BE,CAACoO,cAAD,IACE3L,OAAO,CAACE,MAAR,CAAe+L,KAAf,CAAqBC,YAArB,CACElM,OAAO,CAACK,IAAR,CAAa;IACXL,OAAO,EAAG,GAAEnD,OAAO,CAACC,GAAR,CAAYqK,IAAK,UADlB;IAEXG,GAAG,EAAEN,EAAE,CAACK,IAAH,CAAQC,GAFF;IAGX6E,KAAK,EAAGd,SAAS,GAAG,SAAH,GAAe,SAHrB;IAIXe,UAAU,EAAE9I,SAJD;IAKXxC,WAAW,EAAEuK,SAAS,GAClBA,SAAS,CAAC/N,KAAV,CAAgBF,KADE,GAElB;GAPN,CADF,CAhCJ,EA2CEmG,MA3CF,CA2CS5B,eA3CT,CADI,CAAN;CAhDK;;AChBP,qBAAgB0K,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEElC,8BAA8B,CAAC,OAAOpK,OAAP,EAAgBsG,WAAhB,KAAgC;UACvDtE,OAAO,CAACgK,GAAR,CAAY,CAChB3B,qBAAqB,CAACrK,OAAD,EAAUsG,WAAV,CADL,EAEhB0E,YAAY,CAAChL,OAAD,EAAUsG,WAAV,CAFI,EAGhB4E,MAAM,CAAClL,OAAD,EAAUsG,WAAV,CAHU,EAIhBA,WAAW,CAACsC,kBAAZ,CAA+B5I,OAA/B,EAAwC,KAAxC,EAA+C;MAC7C8I,GAAG,EAAE,CAAC,aAAD;KADP,CAJgB,CAAZ,CAAN;GAD4B,CAFhC;CADF;;ACHA,8BAAgBuD,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,+BADF,EAEElC,8BAA8B,CAAC,OAAOpK,OAAP,EAAgBsG,WAAhB,KAAgC;UACvDiG,MAAM,GAAGvM,OAAO,CAAC6F,OAAR,CAAgB0G,MAA/B,CAD6D;;QAIzDA,MAAM,CAAC/B,IAAP,KAAgB,KAApB,EAA2B;UAErBxD,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B;UACMuF,QAAQ,GAAIxM,OAAO,CAAC6F,OAAT,CAAyB4G,kBAA1C;UAEM1H,aAAa,GAAGuB,WAAW,CAACzB,gBAAZ,CAA6B2H,QAAQ,CAAChI,KAAtC,CAAtB;;;QAIIO,aAAa,IAAIuB,WAAW,CAAC3J,MAAZ,CAAmBqC,MAAnB,CAA0BI,MAA1B,CAAiC2F,aAAjC,CAArB,EAAsE;YAC9D;QAAE9E,IAAI,EAAEyM;UAAY,MAAM1M,OAAO,CAACE,MAAR,CAAeyM,KAAf,CAAqBC,WAArB,CAC9B5M,OAAO,CAACpC,KAAR,CAAc;QAAE0C,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAGMuM,4BAA4B,GAAGH,OAAO,CAACpH,IAAR,CAClClG,MAAD,IACEkH,WAAW,CAACzB,gBAAZ,CAA6BzF,MAAM,CAAC6D,IAAP,CAAYuB,KAAzC,MAAoDO,aAApD,IACA3F,MAAM,CAAC+M,KAAP,KAAiB,iBADjB;MAGA/M,MAAM,CAAC6D,IAAP,CAAYuB,KAAZ,KAAsBgI,QAAQ,CAAChI,KALE,CAArC;;UAQI,CAACqI,4BAAL,EAAmC;QACjCvG,WAAW,CAACsC,kBAAZ,CAA+B5I,OAA/B,EAAwC+E,aAAxC,EAAuD;UACrD+D,GAAG,EAAE,CAAC,aAAD,cADgD;UAErDE,MAAM,EAAE,CAAC,UAAD,EAAa,kBAAb;SAFV;;;;QAOAuD,MAAM,CAAC/H,KAAP,KAAiBgI,QAAQ,CAAChI,KAA9B,EAAqC;;QAElB8B,WAAW,CAACd,KAA/B,EAAsC;MACpCc,WAAW,CAACd,KAAZ,CAAkBzD,WAAlB,CACEyK,QAAQ,CAAChI,KADX,EAEG,UAAS8B,WAAW,CAACd,KAAZ,CAAkB1D,OAAlB,CACRyK,MAAM,CAAC/H,KADC,CAER,4BAA2BwC,EAAE,CAAC8F,QAAS,SAAQ9F,EAAE,CAAC5J,KAAM,EAJ5D;;GApC0B,CAFhC;CADF;;ACAA,mCAAgBiP,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,qCADF,EAEElC,8BAA8B,CAAC,OAAOpK,OAAP,EAAgBsG,WAAhB,KAAgC;UACvDiG,MAAM,GAAGvM,OAAO,CAAC6F,OAAR,CAAgB0G,MAA/B;UACMvF,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B;UACMuF,QAAQ,GAAIxM,OAAO,CAAC6F,OAAT,CAAyB4G,kBAA1C;UAEM1H,aAAa,GAAGuB,WAAW,CAACzB,gBAAZ,CAA6B2H,QAAQ,CAAChI,KAAtC,CAAtB;UAEMuI,2BAA2B,GAAGzG,WAAW,CAACxB,gBAAZ,CAClCC,aADkC,EAElCiC,EAAE,CAACgG,mBAF+B,EAGlC;MACE/H,qBAAqB,EAAE;KAJS,CAApC;;QAQIF,aAAa,IAAIuB,WAAW,CAAC3J,MAAZ,CAAmBqC,MAAnB,CAA0BI,MAA1B,CAAiC2F,aAAjC,CAArB,EAAsE;YAC9D;QAAE9E,IAAI,EAAEyM;UAAY,MAAM1M,OAAO,CAACE,MAAR,CAAeyM,KAAf,CAAqBC,WAArB,CAC9B5M,OAAO,CAACpC,KAAR,CAAc;QAAE0C,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAIMuM,4BAA4B,GAAGH,OAAO,CAACpH,IAAR,CAClClG,MAAD,IACEkH,WAAW,CAACzB,gBAAZ,CAA6BzF,MAAM,CAAC6D,IAAP,CAAYuB,KAAzC,MAAoDO,aAApD,IACA3F,MAAM,CAAC+M,KAAP,KAAiB,iBAHgB,CAArC;YAMMc,oBAAoB,GAAGP,OAAO,CAACpH,IAAR,CAC1BlG,MAAD,IACEkH,WAAW,CAACzB,gBAAZ,CAA6BzF,MAAM,CAAC6D,IAAP,CAAYuB,KAAzC,MAAoDO,aAApD,IACA3F,MAAM,CAAC+M,KAAP,KAAiB,UAHQ,CAA7B;YAMMvM,QAAQ,GACZ,CAACmN,2BAAD,IACA,CAACF,4BADD,IAEAI,oBAHF;MAIA3G,WAAW,CAACsC,kBAAZ,CAA+B5I,OAA/B,EAAwC+E,aAAxC,EAAuD;QACrD+D,GAAG,EAAE;QAEH+D,4BAA4B,IAAI,kBAF7B;QAIHjN,QAAQ,IAAI,UAJT,CADgD;;QAQrDoJ,MAAM,EAAE,CACNpJ,QAAQ,IAAI,aADN,EAEN,CAACmN,2BAAD,IACE,CAACF,4BADH,IAEE,WAJI;OARV;;;QAiBEN,MAAM,CAAC/H,KAAP,KAAiBgI,QAAQ,CAAChI,KAA9B,EAAqC;;QAEjC8B,WAAW,CAACd,KAAhB,EAAuB;MACrBc,WAAW,CAACd,KAAZ,CAAkBzD,WAAlB,CACEyK,QAAQ,CAAChI,KADX,EAEG,0BAAyB8B,WAAW,CAACd,KAAZ,CAAkB1D,OAAlB,CACxByK,MAAM,CAAC/H,KADiB,CAExB,2CAA0CwC,EAAE,CAAC8F,QAAS,EAJ1D;;GAxD0B,CAFhC;CADF;;ACAA,8BAAgBT,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,+BADF,EAEElC,8BAA8B,CAAC,OAAOpK,OAAP,EAAgBsG,WAAhB,KAAgC;UACvDU,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B;UACM;MAAEhE,IAAI,EAAEuJ,QAAR;MAAkBL;QAAWnM,OAAO,CAAC6F,OAAT,CAAyBzG,MAA3D;QACI4H,EAAE,CAAC/D,IAAH,CAAQuB,KAAR,KAAkBgI,QAAQ,CAAChI,KAA/B,EAAsC;UAEhCO,aAAa,GAAGuB,WAAW,CAACzB,gBAAZ,CAA6B2H,QAAQ,CAAChI,KAAtC,CAAtB;;QAEIO,aAAa,IAAIuB,WAAW,CAAC3J,MAAZ,CAAmBqC,MAAnB,CAA0BI,MAA1B,CAAiC2F,aAAjC,CAArB,EAAsE;YAC9DgI,2BAA2B,GAAGzG,WAAW,CAACxB,gBAAZ,CAClCC,aADkC,EAElCiC,EAAE,CAACgG,mBAF+B,EAGlC;QACE/H,qBAAqB,EAAE,IADzB;;;OAHkC,CAApC;YASM;QAAEhF,IAAI,EAAEyM;UAAY,MAAM1M,OAAO,CAACE,MAAR,CAAeyM,KAAf,CAAqBC,WAArB,CAC9B5M,OAAO,CAACpC,KAAR,CAAc;QAAE0C,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAGMuM,4BAA4B,GAAGH,OAAO,CAACpH,IAAR,CAClClG,MAAD,IACEkH,WAAW,CAACzB,gBAAZ,CAA6BzF,MAAM,CAAC6D,IAAP,CAAYuB,KAAzC,MAAoDO,aAApD,IACA3F,MAAM,CAAC+M,KAAP,KAAiB,iBAHgB,CAArC;YAMMvM,QAAQ,GACZ,CAACmN,2BAAD,IACA,CAACF,4BADD,IAEAV,KAAK,KAAK,UAHZ;MAIA7F,WAAW,CAACsC,kBAAZ,CAA+B5I,OAA/B,EAAwC+E,aAAxC,EAAuD;QACrD+D,GAAG,EAAE,CACHlJ,QAAQ,IAAI,UADT,EAEHuM,KAAK,KAAK,mBAAV,IAAiC,kBAF9B,CADgD;QAKrDnD,MAAM,EAAE,CACNpJ,QAAQ,IAAI,aADN,EAEN,EAAEmN,2BAA2B,IAAIZ,KAAK,KAAK,mBAA3C,KACE,WAHI,EAINA,KAAK,KAAK,UAAV,IACE,CAACU,4BADH,IAEE,kBANI,EAONV,KAAK,KAAK,mBAAV,IAAiC,UAP3B;OALV;;;UAiBIrK,OAAO,GAAGwE,WAAW,CAACd,KAAZ,CAAkB1D,OAAlB,CAA0B0K,QAAQ,CAAChI,KAAnC,CAAhB;UACM0I,KAAK,GAAGlG,EAAE,CAAC8F,QAAjB;;UAEMrF,OAAO,GAAG,CAAC,MAAM;UACjB0E,KAAK,KAAK,mBAAd,EAAmC;eACzB,OAAMrK,OAAQ,wBAAuBoL,KAAM,EAAnD;;;UAEEf,KAAK,KAAK,UAAd,EAA0B;eAChB,6BAA4BrK,OAAQ,aAAYoL,KAAM,EAA9D;;;aAEM,oBAAmBpL,OAAQ,iBAAgBoL,KAAM,EAAzD;KAPc,GAAhB;;IAUA5G,WAAW,CAACd,KAAZ,CAAkBzD,WAAlB,CAA8BiF,EAAE,CAAC/D,IAAH,CAAQuB,KAAtC,EAA6CiD,OAA7C;GA5D4B,CAFhC;CADF;;ACAA,8BAAgB4E,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,+BADF,EAEElC,8BAA8B,CAAC,OAAOpK,OAAP,EAAgBsG,WAAhB,KAAgC;UACvDiG,MAAM,GAAGvM,OAAO,CAAC6F,OAAR,CAAgB0G,MAA/B;UACMvF,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B;UACMuF,QAAQ,GAAIxM,OAAO,CAAC6F,OAAT,CAAyBzG,MAAzB,CAAgC6D,IAAjD;UAEM8B,aAAa,GAAGuB,WAAW,CAACzB,gBAAZ,CAA6B2H,QAAQ,CAAChI,KAAtC,CAAtB;;QAEIO,aAAa,IAAIuB,WAAW,CAAC3J,MAAZ,CAAmBqC,MAAnB,CAA0BI,MAA1B,CAAiC2F,aAAjC,CAArB,EAAsE;YAC9D;QAAE9E,IAAI,EAAEyM;UAAY,MAAM1M,OAAO,CAACE,MAAR,CAAeyM,KAAf,CAAqBC,WAArB,CAC9B5M,OAAO,CAACpC,KAAR,CAAc;QAAE0C,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAGMuM,4BAA4B,GAAGH,OAAO,CAACpH,IAAR,CAClClG,MAAD,IACEkH,WAAW,CAACzB,gBAAZ,CAA6BzF,MAAM,CAAC6D,IAAP,CAAYuB,KAAzC,MAAoDO,aAApD,IACA3F,MAAM,CAAC+M,KAAP,KAAiB,iBAHgB,CAArC;MAMA7F,WAAW,CAACsC,kBAAZ,CAA+B5I,OAA/B,EAAwC+E,aAAxC,EAAuD;QACrD+D,GAAG,EAAE,CAAC,aAAD,EAAgB,WAAhB,CADgD;QAErDE,MAAM,EAAE,CACN,CAAC6D,4BAAD,IAAiC,kBAD3B,EAEN,UAFM;OAFV;;;QASEvG,WAAW,CAACd,KAAhB,EAAuB;UACjB+G,MAAM,CAAC/H,KAAP,KAAiBgI,QAAQ,CAAChI,KAA9B,EAAqC;QACnC8B,WAAW,CAACd,KAAZ,CAAkBzD,WAAlB,CACEiF,EAAE,CAAC/D,IAAH,CAAQuB,KADV,EAEG,WAAU8B,WAAW,CAACd,KAAZ,CAAkB1D,OAAlB,CACT0K,QAAQ,CAAChI,KADA,CAET,4BAA2BwC,EAAE,CAAC8F,QAAS,EAJ3C;OADF,MAOO;QACLxG,WAAW,CAACd,KAAZ,CAAkBzD,WAAlB,CACEyK,QAAQ,CAAChI,KADX,EAEG,WAAU8B,WAAW,CAACd,KAAZ,CAAkB1D,OAAlB,CACTyK,MAAM,CAAC/H,KADE,CAET,6BAA4BwC,EAAE,CAAC8F,QAAS,EAJ5C;;;GAnCwB,CAFhC;CADF;;ACCA,0BAAgBT,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,0BADF,EAEElC,8BAA8B,CAAC,OAAOpK,OAAP,EAAgBsG,WAAhB,KAAgC;UACvDtE,OAAO,CAACgK,GAAR,CAAY,CAChBhB,YAAY,CAAChL,OAAD,EAAUsG,WAAV,CADI,EAEhBA,WAAW,CAACwD,4BAAZ,CAAyC9J,OAAzC,CAFgB,CAAZ,CAAN;GAD4B,CAFhC;CADF;;ACCA,qBAAgBqM,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEElC,8BAA8B,CAAC,OAAOpK,OAAP,EAAgBsG,WAAhB,KAAgC;UACvDtE,OAAO,CAACgK,GAAR,CAAY,CAChBhB,YAAY,CAAChL,OAAD,EAAUsG,WAAV,CADI,EAEhB4E,MAAM,CAAClL,OAAD,EAAUsG,WAAV,CAFU,CAAZ,CAAN;GAD4B,CAFhC;CADF;;ACFO,MAAM6G,mBAEZ,GAAG,OAAOnN,OAAP,EAAgBsG,WAAhB,EAA6B8G,UAA7B,KAAsD;MACpD,CAACA,UAAL,EAAiB;QACXC,cAAc,GAAG/G,WAAW,CAACtH,MAAZ,CAAmB,iBAAnB,CAAvB;MACI,CAACqO,cAAL,EAAqB;QAEfrG,EAAE,GAAGhH,OAAO,CAAC6F,OAAR,CAAgBoB,YAA3B;MAEI,CAACD,EAAE,CAAChI,MAAH,CAAUgC,IAAV,CAAgBqH,CAAD,IAAOA,CAAC,CAAC5E,EAAF,KAAS4J,cAAc,CAAC5J,EAA9C,CAAL,EAAwD;;MAEpDuD,EAAE,CAACsG,SAAP,EAAkB;UACVC,WAAW,GAAG,MAAMvN,OAAO,CAACE,MAAR,CAAeyM,KAAf,CAAqBa,KAArB,CAA2B;MACnDC,YAAY,EAAE,QADqC;MAEnD7H,KAAK,EAAEoB,EAAE,CAACK,IAAH,CAAQhH,IAAR,CAAauF,KAAb,CAAmBpB,KAFyB;MAGnDnE,IAAI,EAAE2G,EAAE,CAACK,IAAH,CAAQhH,IAAR,CAAanB,IAHgC;MAInDwO,MAAM,EAAE1G,EAAE,CAAC0G,MAJwC;MAKnDC,YAAY,EAAG,GAAE3G,EAAE,CAAC5J,KAAM,MAAK4J,EAAE,CAAC0G,MAAO,GALU;MAMnDE,cAAc,EAAE,EANmC;;KAA3B,CAA1B;IAQA5N,OAAO,CAACoB,GAAR,CAAYC,IAAZ,CAAiB,eAAjB,EAAkCkM,WAAlC;;CApBG;;ACCP,qBAAgBlB,GAAD,IAAsB;EACnCA,GAAG,CAACC,EAAJ,CACE,CAAC,sBAAD,EAAyB,wBAAzB,CADF,EAEE,MAAOtM,OAAP,IAAmB;UACXuM,MAAM,GAAGvM,OAAO,CAAC6F,OAAR,CAAgB0G,MAA/B;QACIA,MAAM,CAAC/B,IAAP,KAAgB,KAApB,EAA2B;UAErBL,wBAAwB,CAACnK,OAAD,EAAU,MAAOsG,WAAP,IAAuB;YACvDA,WAAW,CAAC8B,2BAAZ,CAAwCpI,OAAxC,CAAN;;UAGEA,OAAO,CAAC6F,OAAR,CAAgBgI,MAAhB,KAA2B,SAA3B,IACA7N,OAAO,CAAC6F,OAAR,CAAgB5E,KAAhB,CAAsBwC,EAAtB,MACG6C,WAAW,CAACtH,MAAZ,CAAmB,iBAAnB,KACCsH,WAAW,CAACtH,MAAZ,CAAmB,iBAAnB,EAAsCyE,EAF1C,CAFF,EAKE;cACM0J,mBAAmB,CAACnN,OAAD,EAAUsG,WAAV,EAAuB,IAAvB,CAAzB;;KAT0B,CAA9B;GANJ;CADF;;ACOA,IAAI,CAACzJ,OAAO,CAACC,GAAR,CAAYqK,IAAjB,EAAuBtK,OAAO,CAACC,GAAR,CAAYqK,IAAZ,GAAmB,YAAnB;;;;;;;AAWvB2G,aAAM,CAACC,GAAP,CAAY1B,GAAD,IAAsB;EAC/B2B,aAAa,CAAC3B,GAAD,CAAb;EACA4B,sBAAsB,CAAC5B,GAAD,CAAtB;EACA6B,2BAA2B,CAAC7B,GAAD,CAA3B,CAH+B;;;;;EAa/B8B,sBAAsB,CAAC9B,GAAD,CAAtB;EACA+B,sBAAsB,CAAC/B,GAAD,CAAtB;EACAgC,aAAa,CAAChC,GAAD,CAAb;EACAiC,kBAAkB,CAACjC,GAAD,CAAlB;EACAkC,aAAa,CAAClC,GAAD,CAAb;CAjBF"} \ No newline at end of file diff --git a/dist/teamconfigs/ornikar.d.ts.map b/dist/teamconfigs/ornikar.d.ts.map index ec1d43f2a..167cf2e0c 100644 --- a/dist/teamconfigs/ornikar.d.ts.map +++ b/dist/teamconfigs/ornikar.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ornikar.d.ts","sourceRoot":"","sources":["../../src/teamconfigs/ornikar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAuIpC,CAAC;AAEF,eAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"ornikar.d.ts","sourceRoot":"","sources":["../../src/teamconfigs/ornikar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAyIpC,CAAC;AAEF,eAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/src/teamconfigs/ornikar.ts b/src/teamconfigs/ornikar.ts index 1e524588e..4de9a6dd5 100644 --- a/src/teamconfigs/ornikar.ts +++ b/src/teamconfigs/ornikar.ts @@ -55,6 +55,8 @@ const config: Config<'dev' | 'design'> = { rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`, Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`, damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`, + tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`, + '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`, }, design: { jperriere: `julien${process.env.ORNIKAR_EMAIL_DOMAIN}`,