diff --git a/dist/index-node10-dev.cjs.js b/dist/index-node10-dev.cjs.js index 0144dad54..7e7c3fb10 100644 --- a/dist/index-node10-dev.cjs.js +++ b/dist/index-node10-dev.cjs.js @@ -56,7 +56,6 @@ const config = { /* back */ abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`, arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`, - CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`, rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`, damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`, 'Thierry-girod': `thierry${process.env.ORNIKAR_EMAIL_DOMAIN}`, @@ -67,6 +66,7 @@ const config = { christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`, HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`, LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`, + CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`, Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`, tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`, '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}` @@ -76,6 +76,16 @@ const config = { CoralineColasse: `coraline${process.env.ORNIKAR_EMAIL_DOMAIN}` } }, + teams: { + backends: { + logins: ['abarreir', 'arthurflachs', 'rigma', 'damienorny', 'Thierry-girod', 'darame07', 'Pixy'], + labels: ['teams/backend'] + }, + frontends: { + logins: ['christophehurpeau', 'HugoGarrido', 'LentnerStefan', 'CorentinAndre', 'Mxime', 'tilap', '63m29'], + labels: ['teams/frontend'] + } + }, waitForGroups: { dev: [], design: ['dev'] @@ -123,6 +133,16 @@ const config = { color: '#64DD17' }, + /* teams */ + 'teams/backend': { + name: 'backend', + color: '#6ad8cb' + }, + 'teams/frontend': { + name: 'frontend', + color: '#8a5abc' + }, + /* auto merge */ 'merge/automerge': { name: ':soon: automerge', @@ -187,6 +207,7 @@ const config$1 = { waitForGroups: { dev: [] }, + teams: {}, labels: { list: { // /* ci */ @@ -240,7 +261,7 @@ const config$1 = { } }; -const teamConfigs = { +const orgsConfigs = { ornikar: config, christophehurpeau: config$1 }; // flat requires node 11 @@ -617,12 +638,22 @@ const ExcludesFalsy$1 = Boolean; const initTeamContext = async (context, config) => { const slackPromise = initTeamSlack(context, config); - const githubLoginToGroup = getKeys(config.groups).reduce((acc, groupName) => { + const githubLoginToGroup = new Map(); + getKeys(config.groups).forEach(groupName => { Object.keys(config.groups[groupName]).forEach(login => { - acc.set(login, groupName); + githubLoginToGroup.set(login, groupName); }); - return acc; - }, new Map()); + }); + const githubLoginToTeams = new Map(); + getKeys(config.teams || {}).forEach((acc, teamName) => { + config.teams[teamName].logins.forEach(login => { + if (acc.has(login)) { + acc.get(login).push(teamName); + } else { + acc.set(login, [teamName]); + } + }); + }); const getReviewerGroups = githubLogins => [...new Set(githubLogins.map(githubLogin => githubLoginToGroup.get(githubLogin)).filter(Boolean))]; @@ -630,6 +661,7 @@ const initTeamContext = async (context, config) => { config, getReviewerGroup: githubLogin => githubLoginToGroup.get(githubLogin), getReviewerGroups: githubLogins => [...new Set(githubLogins.map(githubLogin => githubLoginToGroup.get(githubLogin)).filter(ExcludesFalsy$1))], + getTeamsForLogin: githubLogin => githubLoginToTeams.get(githubLogin) || [], reviewShouldWait: (reviewerGroup, requestedReviewers, { includesReviewerGroup, includesWaitForGroups @@ -653,20 +685,20 @@ const initTeamContext = async (context, config) => { }; }; -const teamContextsPromise = new Map(); -const teamContexts = new Map(); -const obtainTeamContext = (context, config) => { +const orgContextsPromise = new Map(); +const orgContexts = new Map(); +const obtainOrgContext = (context, config) => { const owner = context.payload.repository.owner; - const existingTeamContext = teamContexts.get(owner.login); + const existingTeamContext = orgContexts.get(owner.login); if (existingTeamContext) return existingTeamContext; - const existingPromise = teamContextsPromise.get(owner.login); + const existingPromise = orgContextsPromise.get(owner.login); if (existingPromise) return Promise.resolve(existingPromise); const promise = initTeamContext(context, config); - teamContextsPromise.set(owner.login, promise); - return promise.then(teamContext => { - teamContextsPromise.delete(owner.login); - teamContexts.set(owner.login, teamContext); - return teamContext; + orgContextsPromise.set(owner.login, promise); + return promise.then(orgContext => { + orgContextsPromise.delete(owner.login); + orgContexts.set(owner.login, orgContext); + return orgContext; }); }; @@ -674,8 +706,8 @@ const obtainTeamContext = (context, config) => { const ExcludesFalsy$2 = Boolean; async function initRepoContext(context, config) { - const teamContext = await obtainTeamContext(context, config); - const repoContext = Object.create(teamContext); + const orgContext = await obtainOrgContext(context, config); + const repoContext = Object.create(orgContext); const [labels] = await Promise.all([initRepoLabels(context, config)]); const reviewGroupNames = Object.keys(config.groups); const needsReviewLabelIds = reviewGroupNames.map(key => config.labels.review[key].needsReview).filter(Boolean).map(name => labels[name].id); @@ -803,8 +835,8 @@ const obtainRepoContext = context => { const owner = repo.owner; - if (!teamConfigs[owner.login]) { - console.warn(owner.login, Object.keys(teamConfigs)); + if (!orgsConfigs[owner.login]) { + console.warn(owner.login, Object.keys(orgsConfigs)); return null; } @@ -813,7 +845,7 @@ const obtainRepoContext = context => { if (existingRepoContext) return existingRepoContext; const existingPromise = repoContextsPromise.get(key); if (existingPromise) return Promise.resolve(existingPromise); - const promise = initRepoContext(context, teamConfigs[owner.login]); + const promise = initRepoContext(context, orgsConfigs[owner.login]); repoContextsPromise.set(key, promise); return promise.then(repoContext => { repoContextsPromise.delete(key); @@ -1166,8 +1198,23 @@ const updateReviewStatus = async (context, repoContext, reviewGroup, { toDelete.add(key); } }); - } + } // TODO move that elsewhere + + + repoContext.getTeamsForLogin(pr.user.login).forEach(teamName => { + const team = repoContext.config.teams[teamName]; + if (team.labels) { + team.labels.forEach(labelKey => { + const label = repoContext.labels[labelKey]; + + if (label && !prLabels.some(prLabel => prLabel.id === label.id)) { + newLabelNames.add(label.name); + toAdd.add(labelKey); + } + }); + } + }); const newLabelNamesArray = [...newLabelNames]; context.log.info('updateReviewStatus', { reviewGroup, diff --git a/dist/index-node10-dev.cjs.js.map b/dist/index-node10-dev.cjs.js.map index c89022414..209845d5f 100644 --- a/dist/index-node10-dev.cjs.js.map +++ b/dist/index-node10-dev.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"index-node10-dev.cjs.js","sources":["../src/teamconfigs/ornikar.ts","../src/teamconfigs/christophehurpeau.ts","../src/teamconfigs/index.ts","../src/pr-handlers/actions/utils/prOptions.ts","../src/pr-handlers/actions/utils/parseBody.ts","../src/pr-handlers/actions/autoMergeIfPossible.ts","../src/context/initRepoLabels.ts","../src/context/utils.ts","../src/context/initTeamSlack.ts","../src/context/teamContext.ts","../src/context/repoContext.ts","../src/pr-handlers/utils.ts","../src/pr-handlers/actions/autoAssignPRToCreator.ts","../src/pr-handlers/actions/utils/cleanTitle.ts","../src/pr-handlers/actions/utils/updateBody.ts","../src/pr-handlers/actions/editOpenedPR.ts","../src/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/pr-handlers/actions/updateReviewStatus.ts","../src/pr-handlers/actions/autoApproveAndAutoMerge.ts","../src/pr-handlers/opened.ts","../src/pr-handlers/closed.ts","../src/pr-handlers/reviewRequested.ts","../src/pr-handlers/reviewRequestRemoved.ts","../src/pr-handlers/reviewSubmitted.ts","../src/pr-handlers/reviewDismissed.ts","../src/pr-handlers/synchronize.ts","../src/pr-handlers/edited.ts","../src/pr-handlers/actions/updatePrBody.ts","../src/pr-handlers/labelsChanged.ts","../src/pr-handlers/checkrunCompleted.ts","../src/pr-handlers/checksuiteCompleted.ts","../src/pr-handlers/status.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 prDefaultOptions: {\n featureBranch: false,\n autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\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 inBody: true,\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 /* back */\n abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'Thierry-girod': `thierry${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n darame07: `kevin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Pixy: `pierre-alexis${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n /* front */\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${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: '#FFC44C',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#DAE1E6',\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: '#FFC44C',\n },\n 'design/review-requested': {\n name: ':art: design/review-requested',\n color: '#DAE1E6',\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 /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\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 prDefaultOptions: {\n featureBranch: false,\n autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\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 tilap: 'jlavinh@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\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config as ConfigType } from './types';\nimport ornikar from './ornikar';\nimport christophehurpeau from './christophehurpeau';\n\nexport type Config = ConfigType;\n\nexport const teamConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n};\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","export type Options =\n | 'featureBranch'\n | 'autoMergeWithSkipCi'\n | 'autoMerge'\n | 'deleteAfterMerge';\n\nexport const options: Options[] = [\n 'featureBranch',\n 'autoMergeWithSkipCi',\n 'autoMerge',\n 'deleteAfterMerge',\n];\nexport const optionsRegexps: { name: Options; regexp: RegExp }[] = options.map(\n (option) => ({\n name: option,\n regexp: new RegExp(`\\\\[([ xX]?)]\\\\s*`),\n }),\n);\n\nexport const optionsLabels: { name: Options; label: string }[] = [\n { name: 'featureBranch', label: 'This PR is a feature branch' },\n {\n name: 'autoMergeWithSkipCi',\n label: 'Auto merge with `[skip ci]`',\n },\n {\n name: 'autoMerge',\n label:\n 'Auto merge when this PR is ready and has no failed statuses. (Also has a queue per repo to prevent multiple useless \"Update branch\" triggers)',\n },\n {\n name: 'deleteAfterMerge',\n label: 'Automatic branch delete after this PR is merged',\n },\n];\n","import { Options, optionsRegexps } from './prOptions';\n\nconst commentStart = '';\nconst commentEnd = \"\";\n\nconst regexpCols = /^(.*)((.*))(.*)$/is;\nconst regexpReviewflowCol = /^(\\s*<\\/td>]*>)\\s*(.*)\\s*(<\\/td><\\/tr><\\/table>\\s*)\\s*$/is;\n\nconst parseOptions = (\n content: string,\n defaultConfig: Record,\n): Record => {\n return optionsRegexps.reduce(\n (acc, { name, regexp }) => {\n const match = regexp.exec(content);\n acc[name] = !match\n ? defaultConfig[name] || false\n : match[1] === 'x' || match[1] === 'X';\n return acc;\n },\n {} as any,\n ) as Record;\n};\n\nexport const parseBody = (\n description: string,\n defaultConfig: Record,\n) => {\n const match = regexpCols.exec(description);\n if (!match) return null;\n const [, content, reviewFlowCol, reviewflowContent, ending] = match;\n const reviewFlowColMatch = regexpReviewflowCol.exec(reviewFlowCol);\n if (!reviewFlowColMatch) {\n return {\n content,\n ending,\n reviewflowContentCol: reviewflowContent,\n reviewflowContentColPrefix: commentStart,\n reviewflowContentColSuffix: commentEnd,\n options: parseOptions(reviewFlowCol, defaultConfig),\n };\n }\n const [\n ,\n reviewflowContentColPrefix,\n reviewflowContentCol,\n reviewflowContentColSuffix,\n ] = reviewFlowColMatch;\n\n return {\n content,\n ending,\n reviewflowContentCol,\n reviewflowContentColPrefix,\n reviewflowContentColSuffix,\n options: parseOptions(reviewflowContentCol, defaultConfig),\n };\n};\n","/* eslint-disable max-lines */\nimport { Context } from 'probot';\n// eslint-disable-next-line import/no-cycle\nimport { RepoContext } from '../../context/repoContext';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { parseBody } from './utils/parseBody';\n\nconst hasFailedStatusOrChecks = async (\n context: Context,\n repoContext: RepoContext,\n pr: any,\n) => {\n const checks = await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const failedChecks = checks.data.check_runs.filter(\n (check) => check.conclusion === 'failure',\n );\n\n if (failedChecks.length !== 0) {\n context.log.info(`automerge not possible: failed check pr ${pr.id}`, {\n checks: failedChecks.map((check) => check.name),\n });\n return true;\n }\n\n const combinedStatus = await context.github.repos.getCombinedStatusForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n if (combinedStatus.data.state === 'failure') {\n const failedStatuses = combinedStatus.data.statuses.filter(\n (status) => status.state === 'failure' || status.state === 'error',\n );\n\n context.log.info(`automerge not possible: failed status pr ${pr.id}`, {\n statuses: failedStatuses.map((status) => status.context),\n });\n\n return true;\n }\n\n return false;\n};\n\nexport const autoMergeIfPossible = async (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n prLabels: LabelResponse[] = pr.labels,\n): Promise => {\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return false;\n\n const createMergeLockPrFromPr = () => ({\n id: pr.id,\n number: pr.number,\n branch: pr.head.ref,\n });\n\n if (!prLabels.find((l): boolean => l.id === autoMergeLabel.id)) {\n context.log.debug('automerge not possible: no label');\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n }\n\n if (pr.state !== 'open') {\n context.log.debug('automerge not possible: pr is not opened');\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n }\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n context.log.debug('automerge not possible: blocking labels');\n // repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n }\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (lockedPr && lockedPr.number !== pr.number) {\n context.log.info(`automerge not possible: locked pr ${pr.id}`);\n repoContext.pushAutomergeQueue(createMergeLockPrFromPr());\n return false;\n }\n\n repoContext.addMergeLockPr(createMergeLockPrFromPr());\n\n if (pr.mergeable === undefined) {\n const prResult = await context.github.pulls.get(\n context.repo({\n pull_number: pr.number,\n }),\n );\n pr = prResult.data;\n }\n\n if (pr.merged) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n context.log.info(`automerge not possible: already merged pr ${pr.id}`);\n return false;\n }\n\n context.log.info(\n `automerge?: ${pr.id}, mergeable=${pr.mergeable} state=${\n pr.mergeable_state\n }`,\n );\n\n // https://github.com/octokit/octokit.net/issues/1763\n if (\n !(\n pr.mergeable_state === 'clean' ||\n pr.mergeable_state === 'has_hooks' ||\n pr.mergeable_state === 'unstable'\n )\n ) {\n if (!pr.mergeable_state || pr.mergeable_state === 'unknown') {\n context.log.info(`automerge not possible: rescheduling ${pr.id}`);\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n\n if (pr.head.ref.startsWith('renovate/')) {\n if (pr.mergeable_state === 'behind' || pr.mergeable_state === 'dirty') {\n context.log.info(\n `automerge not possible: rebase renovate branch pr ${pr.id}`,\n );\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n\n await context.github.issues.update(\n context.repo({\n number: pr.number,\n body: pr.body.replace(\n '[ ] ',\n '[x] ',\n ),\n }),\n );\n return false;\n }\n\n if (await hasFailedStatusOrChecks(context, repoContext, pr)) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n } else if (pr.mergeable_state === 'blocked') {\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n\n context.log.info(\n `automerge not possible: renovate with mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n if (pr.mergeable_state === 'blocked') {\n if (await hasFailedStatusOrChecks(context, repoContext, pr)) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n } else {\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n }\n\n if (pr.mergeable_state === 'behind') {\n context.log.info('automerge not possible: update branch', {\n head: pr.head.ref,\n base: pr.base.ref,\n });\n\n await context.github.repos.merge({\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n head: pr.base.ref,\n base: pr.head.ref,\n });\n\n return false;\n }\n\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pr.number}`);\n\n const parsedBody = parseBody(pr.body, repoContext.config.prDefaultOptions);\n const options =\n (parsedBody && parsedBody.options) || repoContext.config.prDefaultOptions;\n\n const mergeResult = await context.github.pulls.merge({\n merge_method: options.featureBranch ? 'merge' : 'squash',\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n pull_number: pr.number,\n commit_title: `${pr.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pr.number})`,\n commit_message: '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return Boolean(mergeResult.data.merged);\n } catch (err) {\n context.log.info('could not merge:', err.message);\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\n\nexport interface LabelResponse {\n id: number;\n node_id: string;\n url: string;\n name: string;\n description: string;\n color: string;\n default: boolean;\n}\n\nexport interface Labels {\n [key: string]: LabelResponse;\n}\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const { data: labels } = await context.github.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n const finalLabels: Record = {};\n\n for (const [labelKey, labelConfig] of Object.entries(config.labels.list)) {\n const labelColor = labelConfig.color.slice(1);\n const description = `Generated by review-flow for ${labelKey}`;\n\n let existingLabel = labels.find((label) => label.name === labelConfig.name);\n if (!existingLabel) {\n existingLabel = labels.find((label) => label.description === description);\n }\n if (!existingLabel) {\n if (labelKey === 'design/needs-review') {\n existingLabel = labels.find(\n (label) => label.name === 'needs-design-review',\n );\n }\n if (labelKey === 'design/approved') {\n existingLabel = labels.find(\n (label) => label.name === 'design-reviewed',\n );\n }\n }\n\n if (!existingLabel) {\n const result = await context.github.issues.createLabel(\n context.repo({\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else if (\n existingLabel.name !== labelConfig.name ||\n existingLabel.color !== labelColor // ||\n // TODO: description is never updated\n // existingLabel.description !== description\n ) {\n context.log.info('Needs to update label', {\n current_name: existingLabel.name,\n name: existingLabel.name !== labelConfig.name && labelConfig.name,\n color: existingLabel.color !== labelColor && labelColor,\n description: existingLabel.description !== description && description,\n });\n\n const result = await context.github.issues.updateLabel(\n context.repo({\n current_name: existingLabel.name,\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else {\n finalLabels[labelKey] = existingLabel;\n }\n }\n\n return finalLabels;\n};\n","export const getKeys = (o: T): (keyof T)[] =>\n Object.keys(o) as (keyof T)[];\n","import { WebClient } from '@slack/web-api';\nimport { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { getKeys } from './utils';\n\nexport interface TeamSlack {\n mention: (githubLogin: string) => string;\n postMessage: (githubLogin: string, text: string) => Promise;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const initTeamSlack = async (\n context: Context,\n config: Config,\n): Promise => {\n if (!config.slackToken) {\n return {\n mention: (githubLogin: string) => '',\n postMessage: (githubLogin: string, text: string) => Promise.resolve(),\n };\n }\n\n const githubLoginToSlackEmail = getKeys(config.groups).reduce<{\n [login: string]: string;\n }>((acc, groupName) => {\n Object.assign(acc, config.groups[groupName]);\n return acc;\n }, {});\n\n const slackClient = new WebClient(config.slackToken);\n const allUsers: any = await slackClient.users.list({ limit: 200 });\n const members: [string, { member: any; im: any }][] = Object.values(\n githubLoginToSlackEmail,\n )\n .map((email) => {\n const member = allUsers.members.find(\n (user: any) => user.profile.email === email,\n );\n if (!member) {\n console.warn(`Could not find user ${email}`);\n return;\n }\n return [email, { member, im: undefined }] as [\n string,\n { member: any; im: any }\n ];\n })\n .filter(ExcludesFalsy);\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.im.open({ user: user.member.id });\n user.im = im.channel;\n } catch (err) {\n console.error(err);\n }\n }\n\n const membersMap = new Map(members);\n\n const getUserFromGithubLogin = (githubLogin: string) => {\n const email = githubLoginToSlackEmail[githubLogin];\n if (!email) return null;\n return membersMap.get(email);\n };\n\n return {\n mention: (githubLogin: string) => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (githubLogin: string, text: string) => {\n context.log.info('send slack', { githubLogin, text });\n if (process.env.DRY_RUN) return;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return;\n await slackClient.chat.postMessage({\n channel: user.im.id,\n text,\n });\n },\n };\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { initTeamSlack, TeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface TeamContext {\n config: Config;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => string | undefined;\n getReviewerGroups: (githubLogins: string[]) => string[];\n reviewShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n}\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nconst initTeamContext = async (\n context: Context,\n config: Config,\n): Promise => {\n const slackPromise = initTeamSlack(context, config);\n\n const githubLoginToGroup = getKeys(config.groups).reduce>(\n (acc, groupName) => {\n Object.keys(config.groups[groupName]).forEach((login) => {\n acc.set(login, groupName);\n });\n return acc;\n },\n new Map(),\n );\n\n const getReviewerGroups = (githubLogins: string[]) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(Boolean),\n ),\n ];\n\n return {\n config,\n getReviewerGroup: (githubLogin) => githubLoginToGroup.get(githubLogin),\n getReviewerGroups: (githubLogins) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ],\n\n reviewShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ) => {\n if (!reviewerGroup) return false;\n\n const requestedReviewerGroups = getReviewerGroups(\n requestedReviewers.map((request) => request.login),\n );\n\n // contains another request of a reviewer in the same group\n if (\n includesReviewerGroup &&\n requestedReviewerGroups.includes(reviewerGroup)\n ) {\n return true;\n }\n\n // contains a request from a dependent group\n if (config.waitForGroups && includesWaitForGroups) {\n const waitForGroups = config.waitForGroups;\n return requestedReviewerGroups.some((group) =>\n waitForGroups[reviewerGroup].includes(group),\n );\n }\n\n return false;\n },\n\n slack: await slackPromise,\n };\n};\n\nconst teamContextsPromise = new Map();\nconst teamContexts = new Map();\n\nexport const obtainTeamContext = (\n context: Context,\n config: Config,\n): Promise => {\n const owner = context.payload.repository.owner;\n\n const existingTeamContext = teamContexts.get(owner.login);\n if (existingTeamContext) return existingTeamContext;\n\n const existingPromise = teamContextsPromise.get(owner.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initTeamContext(context, config);\n teamContextsPromise.set(owner.login, promise);\n\n return promise.then((teamContext) => {\n teamContextsPromise.delete(owner.login);\n teamContexts.set(owner.login, teamContext);\n return teamContext;\n });\n};\n","/* eslint-disable max-lines */\n\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../pr-handlers/actions/autoMergeIfPossible';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\nexport interface LockedMergePr {\n id: number;\n number: number;\n branch: string;\n}\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n protectedLabelIds: readonly LabelResponse['id'][];\n\n hasNeedsReview: (labels: LabelResponse[]) => boolean;\n hasRequestedReview: (labels: LabelResponse[]) => boolean;\n hasChangesRequestedReview: (labels: LabelResponse[]) => boolean;\n hasApprovesReview: (labels: LabelResponse[]) => boolean;\n getNeedsReviewGroupNames: (labels: LabelResponse[]) => GroupNames[];\n\n lockPROrPRS(\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise;\n\n getMergeLockedPr(): LockedMergePr;\n addMergeLockPr(pr: LockedMergePr): void;\n removePrFromAutomergeQueue(context: Context, prNumber: number): void;\n reschedule(context: Context, pr: LockedMergePr): void;\n pushAutomergeQueue(pr: LockedMergePr): void;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nasync function initRepoContext(\n context: Context,\n config: Config,\n): Promise> {\n const teamContext = await obtainTeamContext(context, config);\n const repoContext = Object.create(teamContext);\n\n const [labels] = await Promise.all([initRepoLabels(context, config)]);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewGroupNames\n .map((key: GroupNames) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const changesRequestedLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].changesRequested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const protectedLabelIds = [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ];\n\n const labelIdToGroupName = new Map();\n reviewGroupNames.forEach((key) => {\n const reviewGroupLabels = config.labels.review[key] as any;\n Object.keys(reviewGroupLabels).forEach((labelKey: string) => {\n labelIdToGroupName.set(labels[reviewGroupLabels[labelKey]].id, key);\n });\n });\n\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: LabelResponse[]) =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: LabelResponse[]): GroupNames[] =>\n labels\n .filter((label) => needsReviewLabelIds.includes(label.id))\n .map((label) => labelIdToGroupName.get(label.id))\n .filter(ExcludesFalsy);\n\n const lock = Lock();\n let lockMergePr: LockedMergePr | undefined;\n let automergeQueue: LockedMergePr[] = [];\n\n const lockPROrPRS = (\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n console.log('lock: try to lock pr', { prIdOrIds });\n lock(prIdOrIds, async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n console.log('lock: lock acquired', { prIdOrIds });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { prIdOrIds });\n release();\n reject(err);\n return;\n }\n console.log('lock: release pr', { prIdOrIds });\n release();\n resolve();\n });\n });\n\n const reschedule = (context: Context, pr: LockedMergePr) => {\n if (!pr) throw new Error('Cannot reschedule undefined');\n context.log.info('reschedule', pr);\n setTimeout(() => {\n lockPROrPRS('reschedule', () => {\n return lockPROrPRS(String(pr.id), async () => {\n const prResult = await context.github.pulls.get(\n context.repo({\n pull_number: pr.number,\n }),\n );\n await autoMergeIfPossible(context, repoContext, prResult.data);\n });\n });\n }, 1000);\n };\n\n return Object.assign(repoContext, {\n labels,\n protectedLabelIds,\n hasNeedsReview,\n hasRequestedReview,\n hasChangesRequestedReview,\n hasApprovesReview,\n getNeedsReviewGroupNames,\n\n getMergeLockedPr: () => lockMergePr,\n addMergeLockPr: (pr: LockedMergePr): void => {\n console.log('merge lock: lock', pr);\n if (lockMergePr && String(lockMergePr.number) === String(pr.number)) {\n return;\n }\n if (lockMergePr) throw new Error('Already have lock');\n lockMergePr = pr;\n },\n removePrFromAutomergeQueue: (context, prNumber: number | string): void => {\n context.log('merge lock: remove', { prNumber });\n if (lockMergePr && String(lockMergePr.number) === String(prNumber)) {\n lockMergePr = automergeQueue.shift();\n context.log('merge lock: next', { lockMergePr });\n if (lockMergePr) {\n reschedule(context, lockMergePr);\n }\n } else {\n automergeQueue = automergeQueue.filter(\n (value) => String(value.number) !== String(prNumber),\n );\n }\n },\n pushAutomergeQueue: (pr: LockedMergePr): void => {\n console.log('merge lock: push queue', {\n pr,\n lockMergePr,\n automergeQueue,\n });\n if (!automergeQueue.some((p) => p.number === pr.number)) {\n automergeQueue.push(pr);\n }\n },\n reschedule,\n\n lockPROrPRS,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n context: Context,\n): Promise | RepoContext | null => {\n const repo = context.payload.repository;\n if (\n repo.name === 'reviewflow-test' &&\n process.env.NAME !== 'reviewflow-test'\n ) {\n return null;\n }\n const owner = repo.owner;\n if (!teamConfigs[owner.login]) {\n console.warn(owner.login, Object.keys(teamConfigs));\n return null;\n }\n const key = repo.id;\n\n const existingRepoContext = repoContexts.get(key);\n if (existingRepoContext) return existingRepoContext;\n\n const existingPromise = repoContextsPromise.get(key);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initRepoContext(context, teamConfigs[owner.login]);\n repoContextsPromise.set(key, promise);\n\n return promise.then((repoContext) => {\n repoContextsPromise.delete(key);\n repoContexts.set(key, repoContext);\n return repoContext;\n });\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { obtainRepoContext, RepoContext } from '../context/repoContext';\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n) => Promise;\n\nexport type CallbackWithRepoContext = (\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const handlerPullRequestChange = async <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n callback: CallbackWithRepoContext,\n): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n repoContext.lockPROrPRS(String(context.payload.pull_request.id), async () => {\n await callback(repoContext);\n });\n};\n\ntype CallbackContextAndRepoContext = (\n context: Context,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: CallbackContextAndRepoContext,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport const createHandlerPullRequestsChange = (\n getPullRequests: (\n context: Context,\n repoContext: RepoContext,\n ) => { id: string | number }[],\n callback: CallbackContextAndRepoContext,\n) => async (context: Context): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n const prs = getPullRequests(context, repoContext);\n if (prs.length === 0) return;\n return repoContext.lockPROrPRS(prs.map((pr) => String(pr.id)), () =>\n callback(context, repoContext),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoAssignPRToCreator: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext) => {\n if (!repoContext.config.autoAssignToCreator) return;\n\n const pr = context.payload.pull_request;\n if (pr.assignees.length !== 0) return;\n if (pr.user.type === 'Bot') return;\n\n await context.github.issues.addAssignees(\n context.issue({\n assignees: [pr.user.login],\n }),\n );\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(/[\\s-]+\\[?\\s*ONK[- ](\\d+)\\s*]?\\s*$/i, ' ONK-$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 { StatusInfo } from '../../../teamconfigs/types';\nimport { parseBody } from './parseBody';\nimport { Options, optionsLabels } from './prOptions';\n\nconst toMarkdownOptions = (options: Record) => {\n return optionsLabels\n .map(\n ({ name, label }) =>\n `- [${options[name] ? 'x' : ' '}] ${label}`,\n )\n .join('\\n');\n};\n\nconst toMarkdownInfos = (infos: StatusInfo[]) => {\n return infos\n .map((info) => {\n if (info.url) return `[${info.title}](${info.url})`;\n return info.title;\n })\n .join('\\n');\n};\n\ninterface UpdatedBodyWithOptions {\n body: string;\n options?: Record;\n}\n\nexport const updateBody = (\n body: string,\n defaultConfig: Record,\n infos?: StatusInfo[],\n updateOptions?: Partial>,\n): UpdatedBodyWithOptions => {\n const parsed = parseBody(body, defaultConfig);\n if (!parsed) {\n console.info('could not parse body');\n return { body };\n }\n const {\n content,\n ending,\n reviewflowContentCol,\n reviewflowContentColPrefix,\n reviewflowContentColSuffix,\n options,\n } = parsed;\n\n // eslint-disable-next-line no-nested-ternary\n const infosParagraph = !infos\n ? reviewflowContentCol.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*)?#### Options:)?.*$/s,\n '$1',\n )\n : infos.length !== 0\n ? `#### Infos:\\n${toMarkdownInfos(infos)}\\n`\n : '';\n\n const updatedOptions = !updateOptions\n ? options\n : { ...options, ...updateOptions };\n\n return {\n options: updatedOptions,\n body: `${content}${reviewflowContentColPrefix}\n${infosParagraph}#### Options:\n${toMarkdownOptions(updatedOptions)}\n${reviewflowContentColSuffix}${ending || ''}`,\n };\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { StatusError, StatusInfo } from '../../teamconfigs/types';\nimport { cleanTitle } from './utils/cleanTitle';\nimport { updateBody } from './utils/updateBody';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\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 editOpenedPR = async (\n context: Context,\n repoContext: RepoContext,\n): Promise => {\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 title = repoContext.config.trimTitle ? cleanTitle(pr.title) : pr.title;\n\n const isPrFromBot = pr.user.type === 'Bot';\n\n const statuses: Status[] = [];\n\n const errorRule = repoContext.config.parsePR.title.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(pr.title);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n return true;\n }\n\n if (rule.status && rule.statusInfoFromMatch) {\n statuses.push({\n name: rule.status,\n info: rule.statusInfoFromMatch(match),\n });\n return false;\n }\n\n return false;\n });\n\n const date = new Date().toISOString();\n\n const hasLintPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find(\n (check) => check.name === `${process.env.NAME}/lint-pr`,\n );\n\n await Promise.all(\n [\n ...statuses.map(({ name, error, info }) =>\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/${name}`,\n sha: pr.head.sha,\n state: (error ? 'failure' : 'success') as 'failure' | 'success',\n target_url: error ? undefined : (info as StatusInfo).url,\n description: error ? error.title : (info as StatusInfo).title,\n }),\n ),\n ),\n hasLintPrCheck &&\n context.github.checks.create(\n context.repo({\n name: `${process.env.NAME}/lint-pr`,\n head_sha: pr.head.sha,\n status: 'completed' as 'completed',\n conclusion: (errorRule ? 'failure' : 'success') as\n | 'failure'\n | 'success',\n started_at: date,\n completed_at: date,\n output: errorRule\n ? errorRule.error\n : {\n title: '✓ Your PR is valid',\n summary: '',\n },\n }),\n ),\n !hasLintPrCheck &&\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/lint-pr`,\n sha: pr.head.sha,\n state: (errorRule ? 'failure' : 'success') as 'failure' | 'success',\n target_url: undefined,\n description: errorRule\n ? errorRule.error.title\n : '✓ Your PR is valid',\n }),\n ),\n ].filter(ExcludesFalsy),\n );\n\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n\n const prHasFeatureBranchLabel = Boolean(\n featureBranchLabel &&\n pr.labels.find((label): boolean => label.id === featureBranchLabel.id),\n );\n\n const prHasAutoMergeLabel = Boolean(\n automergeLabel &&\n pr.labels.find((label): boolean => label.id === automergeLabel.id),\n );\n\n const defaultOptions = {\n ...repoContext.config.prDefaultOptions,\n autoMerge: prHasAutoMergeLabel,\n featureBranch: prHasFeatureBranchLabel,\n };\n\n const { body, options } = updateBody(pr.body, defaultOptions, statuses\n .filter((status) => status.info && status.info.inBody)\n .map((status) => status.info) as StatusInfo[]);\n\n const hasDiffInTitle = pr.title !== title;\n const hasDiffInBody = pr.body !== body;\n if (hasDiffInTitle || hasDiffInBody) {\n const update: Partial> = {};\n if (hasDiffInTitle) {\n update.title = title;\n pr.title = title;\n }\n if (hasDiffInBody) {\n update.body = body;\n pr.body = body;\n }\n\n await context.github.issues.update(context.issue(update));\n }\n\n if (options && (featureBranchLabel || automergeLabel)) {\n if (featureBranchLabel) {\n if (prHasFeatureBranchLabel && !options.featureBranch) {\n await context.github.issues.removeLabel(\n context.issue({ name: featureBranchLabel.name }),\n );\n }\n if (options.featureBranch && !prHasFeatureBranchLabel) {\n await context.github.issues.addLabels(\n context.issue({ labels: [featureBranchLabel.name] }),\n );\n }\n }\n\n if (automergeLabel) {\n if (prHasAutoMergeLabel && !options.autoMerge) {\n await context.github.issues.removeLabel(\n context.issue({ name: automergeLabel.name }),\n );\n }\n if (options.autoMerge && !prHasAutoMergeLabel) {\n const result = await context.github.issues.addLabels(\n context.issue({ labels: [automergeLabel.name] }),\n );\n await autoMergeIfPossible(\n context,\n repoContext,\n context.payload.pull_request,\n result.data,\n );\n }\n }\n }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { RepoContext } from '../../context/repoContext';\n\nconst addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n pr: any,\n { state, description }: { state: 'failure' | 'success'; description: string },\n): Promise {\n const hasPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find((check) => check.name === process.env.NAME);\n\n context.log.info('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME as string,\n head_sha: pr.head.sha,\n started_at: pr.created_at,\n status: 'completed',\n conclusion: state,\n completed_at: new Date().toISOString(),\n output: {\n title: description,\n summary: '',\n },\n }),\n );\n } else {\n await context.github.repos.createStatus(\n context.repo({\n context: process.env.NAME,\n sha: pr.head.sha,\n state,\n target_url: undefined,\n description,\n }),\n );\n }\n};\n\nconst createFailedStatusCheck = (\n context: Context,\n pr: any,\n description: string,\n): Promise =>\n addStatusCheck(context, pr, {\n state: 'failure',\n description,\n });\n\nexport const updateStatusCheckFromLabels = (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n labels: LabelResponse[] = pr.labels || [],\n): Promise => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n if (pr.requested_reviewers.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${pr.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Changes requested ! Push commits or discuss changes then re-request a review.',\n );\n }\n\n const needsReviewGroupNames = repoContext.getNeedsReviewGroupNames(labels);\n\n if (needsReviewGroupNames.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${needsReviewGroupNames.join(\n ', ',\n )}. Perhaps request someone ?`,\n );\n }\n\n if (!repoContext.hasApprovesReview(labels)) {\n if (repoContext.config.requiresReviewRequest) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Awaiting review... Perhaps request someone ?',\n );\n }\n }\n\n // if (\n // repoContext.config.requiresReviewRequest &&\n // !repoContext.hasRequestedReview(labels)\n // ) {\n // return createFailedStatusCheck(\n // context,\n // pr,\n // 'You need to request someone to review the PR',\n // );\n // return;\n // }\n // return createInProgressStatusCheck(context);\n // } else if (repoContext.hasApprovesReview(labels)) {\n return addStatusCheck(context, pr, {\n state: 'success',\n description: '✓ PR ready to merge !',\n });\n // }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { GroupLabels } from '../../teamconfigs/types';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends Webhooks.WebhookPayloadPullRequest,\n GroupNames extends string = any\n>(\n context: Context,\n repoContext: RepoContext,\n reviewGroup: GroupNames,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n): Promise => {\n context.log.info('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n const pr = context.payload.pull_request;\n let prLabels = pr.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n\n const toAdd = new Set();\n const toDelete = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = repoContext.config.labels.review[reviewGroup];\n if (!reviewConfig) return undefined;\n\n return reviewConfig[key] && labels[reviewConfig[key]]\n ? labels[reviewConfig[key]]\n : undefined;\n };\n\n if (labelsToAdd) {\n labelsToAdd.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (\n !label ||\n prLabels.some((prLabel: LabelResponse) => prLabel.id === label.id)\n ) {\n return;\n }\n newLabelNames.add(label.name);\n toAdd.add(key);\n });\n }\n\n if (labelsToRemove) {\n labelsToRemove.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label) return;\n const existing = prLabels.find(\n (prLabel: LabelResponse) => prLabel.id === label.id,\n );\n if (existing) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n const result = await context.github.issues.replaceLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(context, repoContext, pr, prLabels);\n // }\n\n return prLabels;\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\n\nexport const autoApproveAndAutoMerge = async (\n context: Context,\n repoContext: RepoContext,\n): Promise => {\n // const autoMergeLabel = repoContext.labels['merge/automerge'];\n const codeApprovedLabel = repoContext.labels['code/approved'];\n const prLabels = context.payload.pull_request.labels;\n if (prLabels.find((l): boolean => l.id === codeApprovedLabel.id)) {\n await context.github.pulls.createReview(\n context.issue({ event: 'APPROVE' }),\n );\n }\n\n await autoMergeIfPossible(context, repoContext);\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { autoApproveAndAutoMerge } from './actions/autoApproveAndAutoMerge';\n\nexport default function opened(app: Application): void {\n app.on(\n 'pull_request.opened',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const fromRenovate = context.payload.pull_request.head.ref.startsWith(\n 'renovate/',\n );\n\n await Promise.all([\n autoAssignPRToCreator(context, repoContext),\n editOpenedPR(context, repoContext),\n fromRenovate\n ? autoApproveAndAutoMerge(context, repoContext)\n : updateReviewStatus(context, repoContext, 'dev', {\n add: ['needsReview'],\n remove: ['approved', 'changesRequested'],\n }),\n ]);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseBody } from './actions/utils/parseBody';\n\nexport default function closed(app: Application): void {\n app.on(\n 'pull_request.closed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const repo = context.payload.repository;\n const pr = context.payload.pull_request;\n\n if (pr.merged) {\n const parsedBody =\n pr.head.repo.id === repo.id &&\n parseBody(pr.body, repoContext.config.prDefaultOptions);\n\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(context, pr.number),\n parsedBody && parsedBody.options.deleteAfterMerge\n ? context.github.git\n .deleteRef(context.repo({ ref: `heads/${pr.head.ref}` }))\n .catch(() => {})\n : undefined,\n ]);\n } else {\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(context, pr.number),\n updateReviewStatus(context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewRequested(app: Application): void {\n app.on(\n 'pull_request.review_requested',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\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) ===\n reviewerGroup &&\n review.state === 'REQUEST_CHANGES' &&\n // In case this is a rerequest for review\n review.user.login !== reviewer.login,\n );\n\n if (!hasChangesRequestedInReviews) {\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved', 'changesRequested'],\n });\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${pr.html_url} !\\n> ${pr.title}`,\n );\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewRequestRemoved(app: Application): void {\n app.on(\n 'pull_request.review_request_removed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n const hasApprovedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'APPROVED',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: [\n // if changes requested by the one which requests was removed\n hasChangesRequestedInReviews && 'changesRequested',\n // if was already approved by another member in the group and has no other requests waiting\n approved && 'approved',\n ],\n // remove labels if has no other requests waiting\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n ],\n });\n }\n\n if (sender.login === reviewer.login) return;\n\n if (repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${pr.html_url}`,\n );\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewSubmitted(app: Application): void {\n app.on(\n 'pull_request_review.submitted',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const pr = context.payload.pull_request;\n const { user: reviewer, state } = (context.payload as any).review;\n if (pr.user.login === reviewer.login) return;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged;\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n // TODO reenable this when accepted can notify request review to slack (dev accepted => design requested) and flag to disable for label (approved design ; still waiting for dev ?)\n // includesWaitForGroups: true,\n },\n );\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const newLabels = await updateReviewStatus(\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !(\n hasRequestedReviewsForGroup || state === 'changes_requested'\n ) && 'requested',\n state === 'approved' &&\n !hasChangesRequestedInReviews &&\n 'changesRequested',\n state === 'changes_requested' && 'approved',\n ],\n },\n );\n\n if (approved && !hasChangesRequestedInReviews) {\n merged = await autoMergeIfPossible(\n context,\n repoContext,\n pr,\n newLabels,\n );\n }\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = pr.html_url;\n\n const message = (() => {\n if (state === 'changes_requested') {\n return `:x: ${mention} requests changes on ${prUrl}`;\n }\n if (state === 'approved') {\n return `:clap: :white_check_mark: ${mention} approves ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n return `:speech_balloon: ${mention} commented on ${prUrl}`;\n })();\n\n repoContext.slack.postMessage(pr.user.login, message);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewDismissed(app: Application): void {\n app.on(\n 'pull_request_review.dismissed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\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) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', 'requested'],\n remove: [\n !hasChangesRequestedInReviews && 'changesRequested',\n 'approved',\n ],\n });\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n repoContext.slack.postMessage(\n pr.user.login,\n `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${pr.html_url}`,\n );\n } else {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${pr.html_url}`,\n );\n }\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function synchronize(app: Application): void {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n // old and new sha\n // const { before, after } = context.payload;\n\n await Promise.all([\n editOpenedPR(context, repoContext),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(context, repoContext),\n // call autoMergeIfPossible to re-add to the queue when push is fixed\n autoMergeIfPossible(context, repoContext),\n ]);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function edited(app: Application): void {\n app.on(\n 'pull_request.edited',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const sender = context.payload.sender;\n if (sender.type === 'Bot') {\n return;\n }\n\n await editOpenedPR(context, repoContext);\n await autoMergeIfPossible(context, repoContext);\n },\n ),\n );\n}\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateBody } from './utils/updateBody';\nimport { Options } from './utils/prOptions';\n\nexport const updatePrBody = async <\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n repoContext: RepoContext,\n updateOptions: Partial>,\n): Promise => {\n const prBody = context.payload.pull_request.body;\n const { body } = updateBody(\n prBody,\n repoContext.config.prDefaultOptions,\n undefined,\n updateOptions,\n );\n\n if (body !== prBody) {\n await context.github.pulls.update(context.issue({ body }));\n }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Application, Context } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { updatePrBody } from './actions/updatePrBody';\n\nexport default function labelsChanged(app: Application): void {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n async (context: Context) => {\n const sender = context.payload.sender;\n const fromRenovate =\n sender.type === 'Bot' && sender.login === 'renovate[bot]';\n context.payload.pull_request.head.ref.startsWith('renovate/');\n\n if (sender.type === 'Bot' && !fromRenovate) {\n return;\n }\n\n await handlerPullRequestChange(context, async (repoContext) => {\n const label = (context.payload as any).label;\n if (fromRenovate) {\n const codeApprovedLabel = repoContext.labels['code/approved'];\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (context.payload.action === 'labeled') {\n if (codeApprovedLabel && label.id === codeApprovedLabel.id) {\n // const { data: reviews } = await context.github.pulls.listReviews(\n // context.issue({ per_page: 1 }),\n // );\n // if (reviews.length !== 0) {\n await context.github.pulls.createReview(\n context.issue({ event: 'APPROVE' }),\n );\n await updateStatusCheckFromLabels(\n context,\n repoContext,\n context.payload.pull_request,\n );\n await updatePrBody(context, repoContext, {\n autoMergeWithSkipCi: true,\n });\n // }\n } else if (autoMergeLabel && label.id === autoMergeLabel.id) {\n await updatePrBody(context, repoContext, {\n autoMerge: true,\n });\n }\n }\n return;\n }\n\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.github.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.github.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(context, repoContext);\n\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n\n if (\n (featureBranchLabel && label.id === automergeLabel.id) ||\n (automergeLabel && label.id === automergeLabel.id)\n ) {\n const option: 'featureBranch' | 'autoMerge' =\n featureBranchLabel && label.id === featureBranchLabel.id\n ? 'featureBranch'\n : 'autoMerge';\n await updatePrBody(context, repoContext, {\n [option]: context.payload.action === 'labeled',\n });\n } else if (context.payload.action === 'labeled') {\n if (\n repoContext.labels['merge/automerge'] &&\n label.id === repoContext.labels['merge/automerge'].id\n ) {\n await autoMergeIfPossible(context, repoContext);\n }\n }\n });\n },\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function checkrunCompleted(app: Application): void {\n app.on(\n 'check_run.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_run.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_run.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function checksuiteCompleted(app: Application): void {\n app.on(\n 'check_suite.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_suite.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_suite.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n}\n","import Webhooks from '@octokit/webhooks';\nimport { Application, Context } from 'probot';\nimport { LockedMergePr } from '../context/repoContext';\nimport { createHandlerPullRequestsChange } from './utils';\n\nconst isSameBranch = (\n context: Context,\n lockedPr: LockedMergePr,\n): boolean => {\n if (!lockedPr) return false;\n return !!context.payload.branches.find((b) => b.name === lockedPr.branch);\n};\n\nexport default function status(app: Application): void {\n app.on(\n 'status',\n createHandlerPullRequestsChange(\n (context, repoContext): LockedMergePr[] => {\n const lockedPr = repoContext.getMergeLockedPr();\n if (!lockedPr) return [];\n\n if (isSameBranch(context, lockedPr)) {\n return [lockedPr];\n }\n\n return [];\n },\n (context, repoContext): void => {\n const lockedPr = repoContext.getMergeLockedPr();\n // check if changed\n if (isSameBranch(context, lockedPr)) {\n repoContext.reschedule(context, lockedPr);\n }\n },\n ),\n );\n}\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\nimport closedHandler from './pr-handlers/closed';\nimport reviewRequestedHandler from './pr-handlers/reviewRequested';\nimport reviewRequestRemovedHandler from './pr-handlers/reviewRequestRemoved';\nimport reviewSubmittedHandler from './pr-handlers/reviewSubmitted';\nimport reviewDismissedHandler from './pr-handlers/reviewDismissed';\nimport synchromizeHandler from './pr-handlers/synchronize';\nimport editedHandler from './pr-handlers/edited';\nimport labelsChanged from './pr-handlers/labelsChanged';\nimport checkrunCompleted from './pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './pr-handlers/checksuiteCompleted';\nimport status from './pr-handlers/status';\n\nif (!process.env.NAME) process.env.NAME = 'reviewflow';\n\n// const getConfig = require('probot-config')\n// const { MongoClient } = require('mongodb');\n\n// const connect = MongoClient.connect(process.env.MONGO_URL);\n// const db = connect.then(client => client.db(process.env.MONGO_DB));\n\n// let config = await getConfig(context, 'reviewflow.yml');\n\n// eslint-disable-next-line import/no-commonjs\nProbot.run((app: Application) => {\n openedHandler(app);\n closedHandler(app);\n reviewRequestedHandler(app);\n reviewRequestRemovedHandler(app);\n\n // app.on('pull_request.closed', async context => {\n\n // });\n\n // app.on('pull_request.reopened', async context => {\n\n // });\n\n reviewSubmittedHandler(app);\n reviewDismissedHandler(app);\n labelsChanged(app);\n synchromizeHandler(app);\n editedHandler(app);\n\n checkrunCompleted(app);\n checksuiteCompleted(app);\n status(app);\n});\n"],"names":["config","slackToken","process","env","ORNIKAR_SLACK_TOKEN","autoAssignToCreator","trimTitle","requiresReviewRequest","prDefaultOptions","featureBranch","autoMergeWithSkipCi","autoMerge","deleteAfterMerge","parsePR","title","regExp","error","summary","bot","status","statusInfoFromMatch","match","issue","inBody","url","groups","dev","abarreir","ORNIKAR_EMAIL_DOMAIN","arthurflachs","CorentinAndre","rigma","damienorny","darame07","Pixy","christophehurpeau","HugoGarrido","LentnerStefan","Mxime","tilap","design","jperriere","CoralineColasse","waitForGroups","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","teamConfigs","ornikar","options","optionsRegexps","map","option","regexp","RegExp","optionsLabels","label","commentStart","commentEnd","regexpCols","regexpReviewflowCol","parseOptions","content","defaultConfig","reduce","acc","exec","parseBody","description","reviewFlowCol","reviewflowContent","ending","reviewFlowColMatch","reviewflowContentCol","reviewflowContentColPrefix","reviewflowContentColSuffix","hasFailedStatusOrChecks","context","repoContext","pr","checks","github","listForRef","repo","ref","head","sha","per_page","failedChecks","data","check_runs","filter","check","conclusion","length","log","info","id","combinedStatus","repos","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","payload","pull_request","prLabels","autoMergeLabel","createMergeLockPrFromPr","number","branch","find","l","debug","removePrFromAutomergeQueue","hasNeedsReview","hasRequestedReview","lockedPr","getMergeLockedPr","pushAutomergeQueue","addMergeLockPr","mergeable","undefined","prResult","pulls","get","pull_number","merged","mergeable_state","reschedule","startsWith","issues","update","body","replace","base","merge","owner","login","parsedBody","mergeResult","merge_method","commit_title","commit_message","Boolean","err","message","initRepoLabels","listLabelsForRepo","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","existingLabel","result","createLabel","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","initTeamSlack","mention","postMessage","Promise","resolve","githubLoginToSlackEmail","groupName","assign","slackClient","WebClient","allUsers","users","limit","members","values","email","member","user","profile","console","warn","im","open","channel","membersMap","Map","getUserFromGithubLogin","githubLogin","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","some","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","create","all","reviewGroupNames","needsReviewLabelIds","key","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","protectedLabelIds","labelIdToGroupName","reviewGroupLabels","lock","Lock","lockMergePr","automergeQueue","lockPROrPRS","prIdOrIds","callback","reject","createReleaseCallback","release","Error","setTimeout","String","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","prNumber","shift","value","p","push","repoContextsPromise","repoContexts","obtainRepoContext","NAME","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","createHandlerPullRequestsChange","getPullRequests","prs","autoAssignPRToCreator","assignees","type","addAssignees","cleanTitle","trim","s","arg1","toLowerCase","toMarkdownOptions","join","toMarkdownInfos","infos","updateBody","updateOptions","parsed","infosParagraph","updatedOptions","editOpenedPR","isPrFromBot","errorRule","rule","date","Date","toISOString","hasLintPrCheck","createStatus","target_url","head_sha","started_at","completed_at","output","featureBranchLabel","automergeLabel","prHasFeatureBranchLabel","prHasAutoMergeLabel","defaultOptions","hasDiffInTitle","hasDiffInBody","removeLabel","addLabels","addStatusCheck","hasPrCheck","created_at","createFailedStatusCheck","updateStatusCheckFromLabels","requested_reviewers","rr","needsReviewGroupNames","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","newLabelNamesArray","oldLabels","size","replaceLabels","autoApproveAndAutoMerge","codeApprovedLabel","createReview","event","opened","app","on","fromRenovate","closed","git","deleteRef","catch","reviewRequested","sender","reviewer","requested_reviewer","reviews","listReviews","hasChangesRequestedInReviews","html_url","reviewRequestRemoved","hasRequestedReviewsForGroup","hasApprovedInReviews","reviewSubmitted","newLabels","prUrl","reviewDismissed","synchronize","edited","updatePrBody","prBody","labelsChanged","action","checkrunCompleted","check_run","pull_requests","checksuiteCompleted","check_suite","isSameBranch","branches","b","Probot","run","openedHandler","closedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","synchromizeHandler","editedHandler"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index-node10-dev.cjs.js","sources":["../src/orgsConfigs/ornikar.ts","../src/orgsConfigs/christophehurpeau.ts","../src/orgsConfigs/index.ts","../src/pr-handlers/actions/utils/prOptions.ts","../src/pr-handlers/actions/utils/parseBody.ts","../src/pr-handlers/actions/autoMergeIfPossible.ts","../src/context/initRepoLabels.ts","../src/context/utils.ts","../src/context/initTeamSlack.ts","../src/context/orgContext.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/utils/updateBody.ts","../src/pr-handlers/actions/editOpenedPR.ts","../src/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/pr-handlers/actions/updateReviewStatus.ts","../src/pr-handlers/actions/autoApproveAndAutoMerge.ts","../src/pr-handlers/opened.ts","../src/pr-handlers/closed.ts","../src/pr-handlers/reviewRequested.ts","../src/pr-handlers/reviewRequestRemoved.ts","../src/pr-handlers/reviewSubmitted.ts","../src/pr-handlers/reviewDismissed.ts","../src/pr-handlers/synchronize.ts","../src/pr-handlers/edited.ts","../src/pr-handlers/actions/updatePrBody.ts","../src/pr-handlers/labelsChanged.ts","../src/pr-handlers/checkrunCompleted.ts","../src/pr-handlers/checksuiteCompleted.ts","../src/pr-handlers/status.ts","../src/index.ts"],"sourcesContent":["import { Config } from './types';\n\nconst config: Config<'dev' | 'design', 'frontends' | 'backends'> = {\n slackToken: process.env.ORNIKAR_SLACK_TOKEN,\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: true,\n prDefaultOptions: {\n featureBranch: false,\n autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\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 inBody: true,\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 /* back */\n abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'Thierry-girod': `thierry${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n darame07: `kevin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Pixy: `pierre-alexis${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n /* front */\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${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\n teams: {\n backends: {\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'rigma',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'tilap',\n '63m29',\n ],\n labels: ['teams/frontend'],\n },\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: '#FFC44C',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#DAE1E6',\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: '#FFC44C',\n },\n 'design/review-requested': {\n name: ':art: design/review-requested',\n color: '#DAE1E6',\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 /* teams */\n\n 'teams/backend': {\n name: 'backend',\n color: '#6ad8cb',\n },\n 'teams/frontend': {\n name: 'frontend',\n color: '#8a5abc',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\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', never> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prDefaultOptions: {\n featureBranch: false,\n autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\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 tilap: 'jlavinh@gmail.com',\n },\n },\n waitForGroups: {\n dev: [],\n },\n teams: {},\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\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config as ConfigType } from './types';\nimport ornikar from './ornikar';\nimport christophehurpeau from './christophehurpeau';\n\nexport type Config<\n GroupNames extends string = any,\n TeamNames extends string = any\n> = ConfigType;\n\nexport const orgsConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n};\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","export type Options =\n | 'featureBranch'\n | 'autoMergeWithSkipCi'\n | 'autoMerge'\n | 'deleteAfterMerge';\n\nexport const options: Options[] = [\n 'featureBranch',\n 'autoMergeWithSkipCi',\n 'autoMerge',\n 'deleteAfterMerge',\n];\nexport const optionsRegexps: { name: Options; regexp: RegExp }[] = options.map(\n (option) => ({\n name: option,\n regexp: new RegExp(`\\\\[([ xX]?)]\\\\s*`),\n }),\n);\n\nexport const optionsLabels: { name: Options; label: string }[] = [\n { name: 'featureBranch', label: 'This PR is a feature branch' },\n {\n name: 'autoMergeWithSkipCi',\n label: 'Auto merge with `[skip ci]`',\n },\n {\n name: 'autoMerge',\n label:\n 'Auto merge when this PR is ready and has no failed statuses. (Also has a queue per repo to prevent multiple useless \"Update branch\" triggers)',\n },\n {\n name: 'deleteAfterMerge',\n label: 'Automatic branch delete after this PR is merged',\n },\n];\n","import { Options, optionsRegexps } from './prOptions';\n\nconst commentStart = '';\nconst commentEnd = \"\";\n\nconst regexpCols = /^(.*)((.*))(.*)$/is;\nconst regexpReviewflowCol = /^(\\s*<\\/td>]*>)\\s*(.*)\\s*(<\\/td><\\/tr><\\/table>\\s*)\\s*$/is;\n\nconst parseOptions = (\n content: string,\n defaultConfig: Record,\n): Record => {\n return optionsRegexps.reduce(\n (acc, { name, regexp }) => {\n const match = regexp.exec(content);\n acc[name] = !match\n ? defaultConfig[name] || false\n : match[1] === 'x' || match[1] === 'X';\n return acc;\n },\n {} as any,\n ) as Record;\n};\n\nexport const parseBody = (\n description: string,\n defaultConfig: Record,\n) => {\n const match = regexpCols.exec(description);\n if (!match) return null;\n const [, content, reviewFlowCol, reviewflowContent, ending] = match;\n const reviewFlowColMatch = regexpReviewflowCol.exec(reviewFlowCol);\n if (!reviewFlowColMatch) {\n return {\n content,\n ending,\n reviewflowContentCol: reviewflowContent,\n reviewflowContentColPrefix: commentStart,\n reviewflowContentColSuffix: commentEnd,\n options: parseOptions(reviewFlowCol, defaultConfig),\n };\n }\n const [\n ,\n reviewflowContentColPrefix,\n reviewflowContentCol,\n reviewflowContentColSuffix,\n ] = reviewFlowColMatch;\n\n return {\n content,\n ending,\n reviewflowContentCol,\n reviewflowContentColPrefix,\n reviewflowContentColSuffix,\n options: parseOptions(reviewflowContentCol, defaultConfig),\n };\n};\n","/* eslint-disable max-lines */\nimport { Context } from 'probot';\n// eslint-disable-next-line import/no-cycle\nimport { RepoContext } from '../../context/repoContext';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { parseBody } from './utils/parseBody';\n\nconst hasFailedStatusOrChecks = async (\n context: Context,\n repoContext: RepoContext,\n pr: any,\n) => {\n const checks = await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const failedChecks = checks.data.check_runs.filter(\n (check) => check.conclusion === 'failure',\n );\n\n if (failedChecks.length !== 0) {\n context.log.info(`automerge not possible: failed check pr ${pr.id}`, {\n checks: failedChecks.map((check) => check.name),\n });\n return true;\n }\n\n const combinedStatus = await context.github.repos.getCombinedStatusForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n if (combinedStatus.data.state === 'failure') {\n const failedStatuses = combinedStatus.data.statuses.filter(\n (status) => status.state === 'failure' || status.state === 'error',\n );\n\n context.log.info(`automerge not possible: failed status pr ${pr.id}`, {\n statuses: failedStatuses.map((status) => status.context),\n });\n\n return true;\n }\n\n return false;\n};\n\nexport const autoMergeIfPossible = async (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n prLabels: LabelResponse[] = pr.labels,\n): Promise => {\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return false;\n\n const createMergeLockPrFromPr = () => ({\n id: pr.id,\n number: pr.number,\n branch: pr.head.ref,\n });\n\n if (!prLabels.find((l): boolean => l.id === autoMergeLabel.id)) {\n context.log.debug('automerge not possible: no label');\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n }\n\n if (pr.state !== 'open') {\n context.log.debug('automerge not possible: pr is not opened');\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n }\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n context.log.debug('automerge not possible: blocking labels');\n // repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n }\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (lockedPr && lockedPr.number !== pr.number) {\n context.log.info(`automerge not possible: locked pr ${pr.id}`);\n repoContext.pushAutomergeQueue(createMergeLockPrFromPr());\n return false;\n }\n\n repoContext.addMergeLockPr(createMergeLockPrFromPr());\n\n if (pr.mergeable === undefined) {\n const prResult = await context.github.pulls.get(\n context.repo({\n pull_number: pr.number,\n }),\n );\n pr = prResult.data;\n }\n\n if (pr.merged) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n context.log.info(`automerge not possible: already merged pr ${pr.id}`);\n return false;\n }\n\n context.log.info(\n `automerge?: ${pr.id}, mergeable=${pr.mergeable} state=${\n pr.mergeable_state\n }`,\n );\n\n // https://github.com/octokit/octokit.net/issues/1763\n if (\n !(\n pr.mergeable_state === 'clean' ||\n pr.mergeable_state === 'has_hooks' ||\n pr.mergeable_state === 'unstable'\n )\n ) {\n if (!pr.mergeable_state || pr.mergeable_state === 'unknown') {\n context.log.info(`automerge not possible: rescheduling ${pr.id}`);\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n\n if (pr.head.ref.startsWith('renovate/')) {\n if (pr.mergeable_state === 'behind' || pr.mergeable_state === 'dirty') {\n context.log.info(\n `automerge not possible: rebase renovate branch pr ${pr.id}`,\n );\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n\n await context.github.issues.update(\n context.repo({\n number: pr.number,\n body: pr.body.replace(\n '[ ] ',\n '[x] ',\n ),\n }),\n );\n return false;\n }\n\n if (await hasFailedStatusOrChecks(context, repoContext, pr)) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n } else if (pr.mergeable_state === 'blocked') {\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n\n context.log.info(\n `automerge not possible: renovate with mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n if (pr.mergeable_state === 'blocked') {\n if (await hasFailedStatusOrChecks(context, repoContext, pr)) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n } else {\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n }\n\n if (pr.mergeable_state === 'behind') {\n context.log.info('automerge not possible: update branch', {\n head: pr.head.ref,\n base: pr.base.ref,\n });\n\n await context.github.repos.merge({\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n head: pr.base.ref,\n base: pr.head.ref,\n });\n\n return false;\n }\n\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pr.number}`);\n\n const parsedBody = parseBody(pr.body, repoContext.config.prDefaultOptions);\n const options =\n (parsedBody && parsedBody.options) || repoContext.config.prDefaultOptions;\n\n const mergeResult = await context.github.pulls.merge({\n merge_method: options.featureBranch ? 'merge' : 'squash',\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n pull_number: pr.number,\n commit_title: `${pr.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pr.number})`,\n commit_message: '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return Boolean(mergeResult.data.merged);\n } catch (err) {\n context.log.info('could not merge:', err.message);\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n};\n","import { Context } from 'probot';\nimport { Config } from '../orgsConfigs';\n\nexport interface LabelResponse {\n id: number;\n node_id: string;\n url: string;\n name: string;\n description: string;\n color: string;\n default: boolean;\n}\n\nexport interface Labels {\n [key: string]: LabelResponse;\n}\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const { data: labels } = await context.github.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n const finalLabels: Record = {};\n\n for (const [labelKey, labelConfig] of Object.entries(config.labels.list)) {\n const labelColor = labelConfig.color.slice(1);\n const description = `Generated by review-flow for ${labelKey}`;\n\n let existingLabel = labels.find((label) => label.name === labelConfig.name);\n if (!existingLabel) {\n existingLabel = labels.find((label) => label.description === description);\n }\n if (!existingLabel) {\n if (labelKey === 'design/needs-review') {\n existingLabel = labels.find(\n (label) => label.name === 'needs-design-review',\n );\n }\n if (labelKey === 'design/approved') {\n existingLabel = labels.find(\n (label) => label.name === 'design-reviewed',\n );\n }\n }\n\n if (!existingLabel) {\n const result = await context.github.issues.createLabel(\n context.repo({\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else if (\n existingLabel.name !== labelConfig.name ||\n existingLabel.color !== labelColor // ||\n // TODO: description is never updated\n // existingLabel.description !== description\n ) {\n context.log.info('Needs to update label', {\n current_name: existingLabel.name,\n name: existingLabel.name !== labelConfig.name && labelConfig.name,\n color: existingLabel.color !== labelColor && labelColor,\n description: existingLabel.description !== description && description,\n });\n\n const result = await context.github.issues.updateLabel(\n context.repo({\n current_name: existingLabel.name,\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else {\n finalLabels[labelKey] = existingLabel;\n }\n }\n\n return finalLabels;\n};\n","export const getKeys = (o: T): (keyof T)[] =>\n Object.keys(o) as (keyof T)[];\n","import { WebClient } from '@slack/web-api';\nimport { Context } from 'probot';\nimport { Config } from '../orgsConfigs';\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 '../orgsConfigs';\nimport { initTeamSlack, TeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface OrgContext<\n GroupNames extends string = any,\n TeamNames extends string = any\n> {\n config: Config;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => string | undefined;\n getReviewerGroups: (githubLogins: string[]) => string[];\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\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 = new Map();\n getKeys(config.groups).forEach((groupName) => {\n Object.keys(config.groups[groupName]).forEach((login) => {\n githubLoginToGroup.set(login, groupName);\n });\n });\n\n const githubLoginToTeams = new Map();\n getKeys(config.teams || {}).forEach((acc, teamName) => {\n (config.teams as NonNullable)[teamName].logins.forEach(\n (login) => {\n if (acc.has(login)) {\n acc.get(login).push(teamName);\n } else {\n acc.set(login, [teamName]);\n }\n },\n );\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 getTeamsForLogin: (githubLogin) =>\n githubLoginToTeams.get(githubLogin) || [],\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 orgContextsPromise = new Map();\nconst orgContexts = new Map();\n\nexport const obtainOrgContext = (\n context: Context,\n config: Config,\n): Promise => {\n const owner = context.payload.repository.owner;\n\n const existingTeamContext = orgContexts.get(owner.login);\n if (existingTeamContext) return existingTeamContext;\n\n const existingPromise = orgContextsPromise.get(owner.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initTeamContext(context, config);\n orgContextsPromise.set(owner.login, promise);\n\n return promise.then((orgContext) => {\n orgContextsPromise.delete(owner.login);\n orgContexts.set(owner.login, orgContext);\n return orgContext;\n });\n};\n","/* eslint-disable max-lines */\n\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { orgsConfigs, Config } from '../orgsConfigs';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../pr-handlers/actions/autoMergeIfPossible';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainOrgContext, OrgContext } from './orgContext';\n\nexport interface LockedMergePr {\n id: number;\n number: number;\n branch: string;\n}\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n protectedLabelIds: readonly LabelResponse['id'][];\n\n hasNeedsReview: (labels: LabelResponse[]) => boolean;\n hasRequestedReview: (labels: LabelResponse[]) => boolean;\n hasChangesRequestedReview: (labels: LabelResponse[]) => boolean;\n hasApprovesReview: (labels: LabelResponse[]) => boolean;\n getNeedsReviewGroupNames: (labels: LabelResponse[]) => GroupNames[];\n\n lockPROrPRS(\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise;\n\n getMergeLockedPr(): LockedMergePr;\n addMergeLockPr(pr: LockedMergePr): void;\n removePrFromAutomergeQueue(context: Context, prNumber: number): void;\n reschedule(context: Context, pr: LockedMergePr): void;\n pushAutomergeQueue(pr: LockedMergePr): void;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport type RepoContext = OrgContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nasync function initRepoContext(\n context: Context,\n config: Config,\n): Promise> {\n const orgContext = await obtainOrgContext(context, config);\n const repoContext = Object.create(orgContext);\n\n const [labels] = await Promise.all([initRepoLabels(context, config)]);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewGroupNames\n .map((key: GroupNames) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const changesRequestedLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].changesRequested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const protectedLabelIds = [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ];\n\n const labelIdToGroupName = new Map();\n reviewGroupNames.forEach((key) => {\n const reviewGroupLabels = config.labels.review[key] as any;\n Object.keys(reviewGroupLabels).forEach((labelKey: string) => {\n labelIdToGroupName.set(labels[reviewGroupLabels[labelKey]].id, key);\n });\n });\n\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: LabelResponse[]) =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: LabelResponse[]): GroupNames[] =>\n labels\n .filter((label) => needsReviewLabelIds.includes(label.id))\n .map((label) => labelIdToGroupName.get(label.id))\n .filter(ExcludesFalsy);\n\n const lock = Lock();\n let lockMergePr: LockedMergePr | undefined;\n let automergeQueue: LockedMergePr[] = [];\n\n const lockPROrPRS = (\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n console.log('lock: try to lock pr', { prIdOrIds });\n lock(prIdOrIds, async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n console.log('lock: lock acquired', { prIdOrIds });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { prIdOrIds });\n release();\n reject(err);\n return;\n }\n console.log('lock: release pr', { prIdOrIds });\n release();\n resolve();\n });\n });\n\n const reschedule = (context: Context, pr: LockedMergePr) => {\n if (!pr) throw new Error('Cannot reschedule undefined');\n context.log.info('reschedule', pr);\n setTimeout(() => {\n lockPROrPRS('reschedule', () => {\n return lockPROrPRS(String(pr.id), async () => {\n const prResult = await context.github.pulls.get(\n context.repo({\n pull_number: pr.number,\n }),\n );\n await autoMergeIfPossible(context, repoContext, prResult.data);\n });\n });\n }, 1000);\n };\n\n return Object.assign(repoContext, {\n labels,\n protectedLabelIds,\n hasNeedsReview,\n hasRequestedReview,\n hasChangesRequestedReview,\n hasApprovesReview,\n getNeedsReviewGroupNames,\n\n getMergeLockedPr: () => lockMergePr,\n addMergeLockPr: (pr: LockedMergePr): void => {\n console.log('merge lock: lock', pr);\n if (lockMergePr && String(lockMergePr.number) === String(pr.number)) {\n return;\n }\n if (lockMergePr) throw new Error('Already have lock');\n lockMergePr = pr;\n },\n removePrFromAutomergeQueue: (context, prNumber: number | string): void => {\n context.log('merge lock: remove', { prNumber });\n if (lockMergePr && String(lockMergePr.number) === String(prNumber)) {\n lockMergePr = automergeQueue.shift();\n context.log('merge lock: next', { lockMergePr });\n if (lockMergePr) {\n reschedule(context, lockMergePr);\n }\n } else {\n automergeQueue = automergeQueue.filter(\n (value) => String(value.number) !== String(prNumber),\n );\n }\n },\n pushAutomergeQueue: (pr: LockedMergePr): void => {\n console.log('merge lock: push queue', {\n pr,\n lockMergePr,\n automergeQueue,\n });\n if (!automergeQueue.some((p) => p.number === pr.number)) {\n automergeQueue.push(pr);\n }\n },\n reschedule,\n\n lockPROrPRS,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n context: Context,\n): Promise | RepoContext | null => {\n const repo = context.payload.repository;\n if (\n repo.name === 'reviewflow-test' &&\n process.env.NAME !== 'reviewflow-test'\n ) {\n return null;\n }\n const owner = repo.owner;\n if (!orgsConfigs[owner.login]) {\n console.warn(owner.login, Object.keys(orgsConfigs));\n return null;\n }\n const key = repo.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, orgsConfigs[owner.login]);\n repoContextsPromise.set(key, promise);\n\n return promise.then((repoContext) => {\n repoContextsPromise.delete(key);\n repoContexts.set(key, repoContext);\n return repoContext;\n });\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { obtainRepoContext, RepoContext } from '../context/repoContext';\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n) => Promise;\n\nexport type CallbackWithRepoContext = (\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const handlerPullRequestChange = async <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n callback: CallbackWithRepoContext,\n): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n repoContext.lockPROrPRS(String(context.payload.pull_request.id), async () => {\n await callback(repoContext);\n });\n};\n\ntype CallbackContextAndRepoContext = (\n context: Context,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: CallbackContextAndRepoContext,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport const createHandlerPullRequestsChange = (\n getPullRequests: (\n context: Context,\n repoContext: RepoContext,\n ) => { id: string | number }[],\n callback: CallbackContextAndRepoContext,\n) => async (context: Context): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n const prs = getPullRequests(context, repoContext);\n if (prs.length === 0) return;\n return repoContext.lockPROrPRS(prs.map((pr) => String(pr.id)), () =>\n callback(context, repoContext),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoAssignPRToCreator: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext) => {\n if (!repoContext.config.autoAssignToCreator) return;\n\n const pr = context.payload.pull_request;\n if (pr.assignees.length !== 0) return;\n if (pr.user.type === 'Bot') return;\n\n await context.github.issues.addAssignees(\n context.issue({\n assignees: [pr.user.login],\n }),\n );\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(/[\\s-]+\\[?\\s*ONK[- ](\\d+)\\s*]?\\s*$/i, ' ONK-$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 { StatusInfo } from '../../../orgsConfigs/types';\nimport { parseBody } from './parseBody';\nimport { Options, optionsLabels } from './prOptions';\n\nconst toMarkdownOptions = (options: Record) => {\n return optionsLabels\n .map(\n ({ name, label }) =>\n `- [${options[name] ? 'x' : ' '}] ${label}`,\n )\n .join('\\n');\n};\n\nconst toMarkdownInfos = (infos: StatusInfo[]) => {\n return infos\n .map((info) => {\n if (info.url) return `[${info.title}](${info.url})`;\n return info.title;\n })\n .join('\\n');\n};\n\ninterface UpdatedBodyWithOptions {\n body: string;\n options?: Record;\n}\n\nexport const updateBody = (\n body: string,\n defaultConfig: Record,\n infos?: StatusInfo[],\n updateOptions?: Partial>,\n): UpdatedBodyWithOptions => {\n const parsed = parseBody(body, defaultConfig);\n if (!parsed) {\n console.info('could not parse body');\n return { body };\n }\n const {\n content,\n ending,\n reviewflowContentCol,\n reviewflowContentColPrefix,\n reviewflowContentColSuffix,\n options,\n } = parsed;\n\n // eslint-disable-next-line no-nested-ternary\n const infosParagraph = !infos\n ? reviewflowContentCol.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*)?#### Options:)?.*$/s,\n '$1',\n )\n : infos.length !== 0\n ? `#### Infos:\\n${toMarkdownInfos(infos)}\\n`\n : '';\n\n const updatedOptions = !updateOptions\n ? options\n : { ...options, ...updateOptions };\n\n return {\n options: updatedOptions,\n body: `${content}${reviewflowContentColPrefix}\n${infosParagraph}#### Options:\n${toMarkdownOptions(updatedOptions)}\n${reviewflowContentColSuffix}${ending || ''}`,\n };\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { StatusError, StatusInfo } from '../../orgsConfigs/types';\nimport { cleanTitle } from './utils/cleanTitle';\nimport { updateBody } from './utils/updateBody';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\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 editOpenedPR = async (\n context: Context,\n repoContext: RepoContext,\n): Promise => {\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 title = repoContext.config.trimTitle ? cleanTitle(pr.title) : pr.title;\n\n const isPrFromBot = pr.user.type === 'Bot';\n\n const statuses: Status[] = [];\n\n const errorRule = repoContext.config.parsePR.title.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(pr.title);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n return true;\n }\n\n if (rule.status && rule.statusInfoFromMatch) {\n statuses.push({\n name: rule.status,\n info: rule.statusInfoFromMatch(match),\n });\n return false;\n }\n\n return false;\n });\n\n const date = new Date().toISOString();\n\n const hasLintPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find(\n (check) => check.name === `${process.env.NAME}/lint-pr`,\n );\n\n await Promise.all(\n [\n ...statuses.map(({ name, error, info }) =>\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/${name}`,\n sha: pr.head.sha,\n state: (error ? 'failure' : 'success') as 'failure' | 'success',\n target_url: error ? undefined : (info as StatusInfo).url,\n description: error ? error.title : (info as StatusInfo).title,\n }),\n ),\n ),\n hasLintPrCheck &&\n context.github.checks.create(\n context.repo({\n name: `${process.env.NAME}/lint-pr`,\n head_sha: pr.head.sha,\n status: 'completed' as 'completed',\n conclusion: (errorRule ? 'failure' : 'success') as\n | 'failure'\n | 'success',\n started_at: date,\n completed_at: date,\n output: errorRule\n ? errorRule.error\n : {\n title: '✓ Your PR is valid',\n summary: '',\n },\n }),\n ),\n !hasLintPrCheck &&\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/lint-pr`,\n sha: pr.head.sha,\n state: (errorRule ? 'failure' : 'success') as 'failure' | 'success',\n target_url: undefined,\n description: errorRule\n ? errorRule.error.title\n : '✓ Your PR is valid',\n }),\n ),\n ].filter(ExcludesFalsy),\n );\n\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n\n const prHasFeatureBranchLabel = Boolean(\n featureBranchLabel &&\n pr.labels.find((label): boolean => label.id === featureBranchLabel.id),\n );\n\n const prHasAutoMergeLabel = Boolean(\n automergeLabel &&\n pr.labels.find((label): boolean => label.id === automergeLabel.id),\n );\n\n const defaultOptions = {\n ...repoContext.config.prDefaultOptions,\n autoMerge: prHasAutoMergeLabel,\n featureBranch: prHasFeatureBranchLabel,\n };\n\n const { body, options } = updateBody(pr.body, defaultOptions, statuses\n .filter((status) => status.info && status.info.inBody)\n .map((status) => status.info) as StatusInfo[]);\n\n const hasDiffInTitle = pr.title !== title;\n const hasDiffInBody = pr.body !== body;\n if (hasDiffInTitle || hasDiffInBody) {\n const update: Partial> = {};\n if (hasDiffInTitle) {\n update.title = title;\n pr.title = title;\n }\n if (hasDiffInBody) {\n update.body = body;\n pr.body = body;\n }\n\n await context.github.issues.update(context.issue(update));\n }\n\n if (options && (featureBranchLabel || automergeLabel)) {\n if (featureBranchLabel) {\n if (prHasFeatureBranchLabel && !options.featureBranch) {\n await context.github.issues.removeLabel(\n context.issue({ name: featureBranchLabel.name }),\n );\n }\n if (options.featureBranch && !prHasFeatureBranchLabel) {\n await context.github.issues.addLabels(\n context.issue({ labels: [featureBranchLabel.name] }),\n );\n }\n }\n\n if (automergeLabel) {\n if (prHasAutoMergeLabel && !options.autoMerge) {\n await context.github.issues.removeLabel(\n context.issue({ name: automergeLabel.name }),\n );\n }\n if (options.autoMerge && !prHasAutoMergeLabel) {\n const result = await context.github.issues.addLabels(\n context.issue({ labels: [automergeLabel.name] }),\n );\n await autoMergeIfPossible(\n context,\n repoContext,\n context.payload.pull_request,\n result.data,\n );\n }\n }\n }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { RepoContext } from '../../context/repoContext';\n\nconst addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n pr: any,\n { state, description }: { state: 'failure' | 'success'; description: string },\n): Promise {\n const hasPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find((check) => check.name === process.env.NAME);\n\n context.log.info('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME as string,\n head_sha: pr.head.sha,\n started_at: pr.created_at,\n status: 'completed',\n conclusion: state,\n completed_at: new Date().toISOString(),\n output: {\n title: description,\n summary: '',\n },\n }),\n );\n } else {\n await context.github.repos.createStatus(\n context.repo({\n context: process.env.NAME,\n sha: pr.head.sha,\n state,\n target_url: undefined,\n description,\n }),\n );\n }\n};\n\nconst createFailedStatusCheck = (\n context: Context,\n pr: any,\n description: string,\n): Promise =>\n addStatusCheck(context, pr, {\n state: 'failure',\n description,\n });\n\nexport const updateStatusCheckFromLabels = (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n labels: LabelResponse[] = pr.labels || [],\n): Promise => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n if (pr.requested_reviewers.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${pr.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Changes requested ! Push commits or discuss changes then re-request a review.',\n );\n }\n\n const needsReviewGroupNames = repoContext.getNeedsReviewGroupNames(labels);\n\n if (needsReviewGroupNames.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${needsReviewGroupNames.join(\n ', ',\n )}. Perhaps request someone ?`,\n );\n }\n\n if (!repoContext.hasApprovesReview(labels)) {\n if (repoContext.config.requiresReviewRequest) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Awaiting review... Perhaps request someone ?',\n );\n }\n }\n\n // if (\n // repoContext.config.requiresReviewRequest &&\n // !repoContext.hasRequestedReview(labels)\n // ) {\n // return createFailedStatusCheck(\n // context,\n // pr,\n // 'You need to request someone to review the PR',\n // );\n // return;\n // }\n // return createInProgressStatusCheck(context);\n // } else if (repoContext.hasApprovesReview(labels)) {\n return addStatusCheck(context, pr, {\n state: 'success',\n description: '✓ PR ready to merge !',\n });\n // }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { GroupLabels } from '../../orgsConfigs/types';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends Webhooks.WebhookPayloadPullRequest,\n GroupNames extends string = any\n>(\n context: Context,\n repoContext: RepoContext,\n reviewGroup: GroupNames,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n): Promise => {\n context.log.info('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n const pr = context.payload.pull_request;\n let prLabels: LabelResponse[] = pr.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n\n const toAdd = new Set();\n const toDelete = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = repoContext.config.labels.review[reviewGroup];\n if (!reviewConfig) return undefined;\n\n return reviewConfig[key] && labels[reviewConfig[key]]\n ? labels[reviewConfig[key]]\n : undefined;\n };\n\n if (labelsToAdd) {\n labelsToAdd.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label || prLabels.some((prLabel) => prLabel.id === label.id)) {\n return;\n }\n newLabelNames.add(label.name);\n toAdd.add(key);\n });\n }\n\n if (labelsToRemove) {\n labelsToRemove.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label) return;\n const existing = prLabels.find((prLabel) => prLabel.id === label.id);\n if (existing) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n // TODO move that elsewhere\n\n repoContext.getTeamsForLogin(pr.user.login).forEach((teamName) => {\n const team = repoContext.config.teams[teamName];\n if (team.labels) {\n team.labels.forEach((labelKey) => {\n const label = repoContext.labels[labelKey];\n if (label && !prLabels.some((prLabel) => prLabel.id === label.id)) {\n newLabelNames.add(label.name);\n toAdd.add(labelKey);\n }\n });\n }\n });\n\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n const result = await context.github.issues.replaceLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(context, repoContext, pr, prLabels);\n // }\n\n return prLabels;\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\n\nexport const autoApproveAndAutoMerge = async (\n context: Context,\n repoContext: RepoContext,\n): Promise => {\n // const autoMergeLabel = repoContext.labels['merge/automerge'];\n const codeApprovedLabel = repoContext.labels['code/approved'];\n const prLabels = context.payload.pull_request.labels;\n if (prLabels.find((l): boolean => l.id === codeApprovedLabel.id)) {\n await context.github.pulls.createReview(\n context.issue({ event: 'APPROVE' }),\n );\n }\n\n await autoMergeIfPossible(context, repoContext);\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { autoApproveAndAutoMerge } from './actions/autoApproveAndAutoMerge';\n\nexport default function opened(app: Application): void {\n app.on(\n 'pull_request.opened',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const fromRenovate = context.payload.pull_request.head.ref.startsWith(\n 'renovate/',\n );\n\n await Promise.all([\n autoAssignPRToCreator(context, repoContext),\n editOpenedPR(context, repoContext),\n fromRenovate\n ? autoApproveAndAutoMerge(context, repoContext)\n : updateReviewStatus(context, repoContext, 'dev', {\n add: ['needsReview'],\n remove: ['approved', 'changesRequested'],\n }),\n ]);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseBody } from './actions/utils/parseBody';\n\nexport default function closed(app: Application): void {\n app.on(\n 'pull_request.closed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const repo = context.payload.repository;\n const pr = context.payload.pull_request;\n\n if (pr.merged) {\n const parsedBody =\n pr.head.repo.id === repo.id &&\n parseBody(pr.body, repoContext.config.prDefaultOptions);\n\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(context, pr.number),\n parsedBody && parsedBody.options.deleteAfterMerge\n ? context.github.git\n .deleteRef(context.repo({ ref: `heads/${pr.head.ref}` }))\n .catch(() => {})\n : undefined,\n ]);\n } else {\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(context, pr.number),\n updateReviewStatus(context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewRequested(app: Application): void {\n app.on(\n 'pull_request.review_requested',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\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) ===\n reviewerGroup &&\n review.state === 'REQUEST_CHANGES' &&\n // In case this is a rerequest for review\n review.user.login !== reviewer.login,\n );\n\n if (!hasChangesRequestedInReviews) {\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved', 'changesRequested'],\n });\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${pr.html_url} !\\n> ${pr.title}`,\n );\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewRequestRemoved(app: Application): void {\n app.on(\n 'pull_request.review_request_removed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n const hasApprovedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'APPROVED',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: [\n // if changes requested by the one which requests was removed\n hasChangesRequestedInReviews && 'changesRequested',\n // if was already approved by another member in the group and has no other requests waiting\n approved && 'approved',\n ],\n // remove labels if has no other requests waiting\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n ],\n });\n }\n\n if (sender.login === reviewer.login) return;\n\n if (repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${pr.html_url}`,\n );\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewSubmitted(app: Application): void {\n app.on(\n 'pull_request_review.submitted',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const pr = context.payload.pull_request;\n const { user: reviewer, state } = (context.payload as any).review;\n if (pr.user.login === reviewer.login) return;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged;\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n // TODO reenable this when accepted can notify request review to slack (dev accepted => design requested) and flag to disable for label (approved design ; still waiting for dev ?)\n // includesWaitForGroups: true,\n },\n );\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const newLabels = await updateReviewStatus(\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !(\n hasRequestedReviewsForGroup || state === 'changes_requested'\n ) && 'requested',\n state === 'approved' &&\n !hasChangesRequestedInReviews &&\n 'changesRequested',\n state === 'changes_requested' && 'approved',\n ],\n },\n );\n\n if (approved && !hasChangesRequestedInReviews) {\n merged = await autoMergeIfPossible(\n context,\n repoContext,\n pr,\n newLabels,\n );\n }\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = pr.html_url;\n\n const message = (() => {\n if (state === 'changes_requested') {\n return `:x: ${mention} requests changes on ${prUrl}`;\n }\n if (state === 'approved') {\n return `:clap: :white_check_mark: ${mention} approves ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n return `:speech_balloon: ${mention} commented on ${prUrl}`;\n })();\n\n repoContext.slack.postMessage(pr.user.login, message);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewDismissed(app: Application): void {\n app.on(\n 'pull_request_review.dismissed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\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) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', 'requested'],\n remove: [\n !hasChangesRequestedInReviews && 'changesRequested',\n 'approved',\n ],\n });\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n repoContext.slack.postMessage(\n pr.user.login,\n `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${pr.html_url}`,\n );\n } else {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${pr.html_url}`,\n );\n }\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function synchronize(app: Application): void {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n // old and new sha\n // const { before, after } = context.payload;\n\n await Promise.all([\n editOpenedPR(context, repoContext),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(context, repoContext),\n // call autoMergeIfPossible to re-add to the queue when push is fixed\n autoMergeIfPossible(context, repoContext),\n ]);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function edited(app: Application): void {\n app.on(\n 'pull_request.edited',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const sender = context.payload.sender;\n if (sender.type === 'Bot') {\n return;\n }\n\n await editOpenedPR(context, repoContext);\n await autoMergeIfPossible(context, repoContext);\n },\n ),\n );\n}\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateBody } from './utils/updateBody';\nimport { Options } from './utils/prOptions';\n\nexport const updatePrBody = async <\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n repoContext: RepoContext,\n updateOptions: Partial>,\n): Promise => {\n const prBody = context.payload.pull_request.body;\n const { body } = updateBody(\n prBody,\n repoContext.config.prDefaultOptions,\n undefined,\n updateOptions,\n );\n\n if (body !== prBody) {\n await context.github.pulls.update(context.issue({ body }));\n }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Application, Context } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { updatePrBody } from './actions/updatePrBody';\n\nexport default function labelsChanged(app: Application): void {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n async (context: Context) => {\n const sender = context.payload.sender;\n const fromRenovate =\n sender.type === 'Bot' && sender.login === 'renovate[bot]';\n context.payload.pull_request.head.ref.startsWith('renovate/');\n\n if (sender.type === 'Bot' && !fromRenovate) {\n return;\n }\n\n await handlerPullRequestChange(context, async (repoContext) => {\n const label = (context.payload as any).label;\n if (fromRenovate) {\n const codeApprovedLabel = repoContext.labels['code/approved'];\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (context.payload.action === 'labeled') {\n if (codeApprovedLabel && label.id === codeApprovedLabel.id) {\n // const { data: reviews } = await context.github.pulls.listReviews(\n // context.issue({ per_page: 1 }),\n // );\n // if (reviews.length !== 0) {\n await context.github.pulls.createReview(\n context.issue({ event: 'APPROVE' }),\n );\n await updateStatusCheckFromLabels(\n context,\n repoContext,\n context.payload.pull_request,\n );\n await updatePrBody(context, repoContext, {\n autoMergeWithSkipCi: true,\n });\n // }\n } else if (autoMergeLabel && label.id === autoMergeLabel.id) {\n await updatePrBody(context, repoContext, {\n autoMerge: true,\n });\n }\n }\n return;\n }\n\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.github.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.github.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(context, repoContext);\n\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n\n if (\n (featureBranchLabel && label.id === automergeLabel.id) ||\n (automergeLabel && label.id === automergeLabel.id)\n ) {\n const option: 'featureBranch' | 'autoMerge' =\n featureBranchLabel && label.id === featureBranchLabel.id\n ? 'featureBranch'\n : 'autoMerge';\n await updatePrBody(context, repoContext, {\n [option]: context.payload.action === 'labeled',\n });\n } else if (context.payload.action === 'labeled') {\n if (\n repoContext.labels['merge/automerge'] &&\n label.id === repoContext.labels['merge/automerge'].id\n ) {\n await autoMergeIfPossible(context, repoContext);\n }\n }\n });\n },\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function checkrunCompleted(app: Application): void {\n app.on(\n 'check_run.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_run.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_run.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function checksuiteCompleted(app: Application): void {\n app.on(\n 'check_suite.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_suite.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_suite.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n}\n","import Webhooks from '@octokit/webhooks';\nimport { Application, Context } from 'probot';\nimport { LockedMergePr } from '../context/repoContext';\nimport { createHandlerPullRequestsChange } from './utils';\n\nconst isSameBranch = (\n context: Context,\n lockedPr: LockedMergePr,\n): boolean => {\n if (!lockedPr) return false;\n return !!context.payload.branches.find((b) => b.name === lockedPr.branch);\n};\n\nexport default function status(app: Application): void {\n app.on(\n 'status',\n createHandlerPullRequestsChange(\n (context, repoContext): LockedMergePr[] => {\n const lockedPr = repoContext.getMergeLockedPr();\n if (!lockedPr) return [];\n\n if (isSameBranch(context, lockedPr)) {\n return [lockedPr];\n }\n\n return [];\n },\n (context, repoContext): void => {\n const lockedPr = repoContext.getMergeLockedPr();\n // check if changed\n if (isSameBranch(context, lockedPr)) {\n repoContext.reschedule(context, lockedPr);\n }\n },\n ),\n );\n}\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\nimport closedHandler from './pr-handlers/closed';\nimport reviewRequestedHandler from './pr-handlers/reviewRequested';\nimport reviewRequestRemovedHandler from './pr-handlers/reviewRequestRemoved';\nimport reviewSubmittedHandler from './pr-handlers/reviewSubmitted';\nimport reviewDismissedHandler from './pr-handlers/reviewDismissed';\nimport synchromizeHandler from './pr-handlers/synchronize';\nimport editedHandler from './pr-handlers/edited';\nimport labelsChanged from './pr-handlers/labelsChanged';\nimport checkrunCompleted from './pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './pr-handlers/checksuiteCompleted';\nimport status from './pr-handlers/status';\n\nif (!process.env.NAME) process.env.NAME = 'reviewflow';\n\n// const getConfig = require('probot-config')\n// const { MongoClient } = require('mongodb');\n\n// const connect = MongoClient.connect(process.env.MONGO_URL);\n// const db = connect.then(client => client.db(process.env.MONGO_DB));\n\n// let config = await getConfig(context, 'reviewflow.yml');\n\n// eslint-disable-next-line import/no-commonjs\nProbot.run((app: Application) => {\n openedHandler(app);\n closedHandler(app);\n reviewRequestedHandler(app);\n reviewRequestRemovedHandler(app);\n\n // app.on('pull_request.closed', async context => {\n\n // });\n\n // app.on('pull_request.reopened', async context => {\n\n // });\n\n reviewSubmittedHandler(app);\n reviewDismissedHandler(app);\n labelsChanged(app);\n synchromizeHandler(app);\n editedHandler(app);\n\n checkrunCompleted(app);\n checksuiteCompleted(app);\n status(app);\n});\n"],"names":["config","slackToken","process","env","ORNIKAR_SLACK_TOKEN","autoAssignToCreator","trimTitle","requiresReviewRequest","prDefaultOptions","featureBranch","autoMergeWithSkipCi","autoMerge","deleteAfterMerge","parsePR","title","regExp","error","summary","bot","status","statusInfoFromMatch","match","issue","inBody","url","groups","dev","abarreir","ORNIKAR_EMAIL_DOMAIN","arthurflachs","rigma","damienorny","darame07","Pixy","christophehurpeau","HugoGarrido","LentnerStefan","CorentinAndre","Mxime","tilap","design","jperriere","CoralineColasse","teams","backends","logins","labels","frontends","waitForGroups","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","orgsConfigs","ornikar","options","optionsRegexps","map","option","regexp","RegExp","optionsLabels","label","commentStart","commentEnd","regexpCols","regexpReviewflowCol","parseOptions","content","defaultConfig","reduce","acc","exec","parseBody","description","reviewFlowCol","reviewflowContent","ending","reviewFlowColMatch","reviewflowContentCol","reviewflowContentColPrefix","reviewflowContentColSuffix","hasFailedStatusOrChecks","context","repoContext","pr","checks","github","listForRef","repo","ref","head","sha","per_page","failedChecks","data","check_runs","filter","check","conclusion","length","log","info","id","combinedStatus","repos","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","payload","pull_request","prLabels","autoMergeLabel","createMergeLockPrFromPr","number","branch","find","l","debug","removePrFromAutomergeQueue","hasNeedsReview","hasRequestedReview","lockedPr","getMergeLockedPr","pushAutomergeQueue","addMergeLockPr","mergeable","undefined","prResult","pulls","get","pull_number","merged","mergeable_state","reschedule","startsWith","issues","update","body","replace","base","merge","owner","login","parsedBody","mergeResult","merge_method","commit_title","commit_message","Boolean","err","message","initRepoLabels","listLabelsForRepo","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","existingLabel","result","createLabel","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","initTeamSlack","mention","postMessage","Promise","resolve","githubLoginToSlackEmail","groupName","assign","slackClient","WebClient","allUsers","users","limit","members","values","email","member","user","profile","console","warn","im","open","channel","membersMap","Map","getUserFromGithubLogin","githubLogin","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","set","githubLoginToTeams","teamName","has","push","getReviewerGroups","githubLogins","Set","getReviewerGroup","getTeamsForLogin","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","some","group","slack","orgContextsPromise","orgContexts","obtainOrgContext","repository","existingTeamContext","existingPromise","promise","then","orgContext","delete","initRepoContext","create","all","reviewGroupNames","needsReviewLabelIds","key","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","protectedLabelIds","labelIdToGroupName","reviewGroupLabels","lock","Lock","lockMergePr","automergeQueue","lockPROrPRS","prIdOrIds","callback","reject","createReleaseCallback","release","Error","setTimeout","String","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","prNumber","shift","value","p","repoContextsPromise","repoContexts","obtainRepoContext","NAME","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","createHandlerPullRequestsChange","getPullRequests","prs","autoAssignPRToCreator","assignees","type","addAssignees","cleanTitle","trim","s","arg1","toLowerCase","toMarkdownOptions","join","toMarkdownInfos","infos","updateBody","updateOptions","parsed","infosParagraph","updatedOptions","editOpenedPR","isPrFromBot","errorRule","rule","date","Date","toISOString","hasLintPrCheck","createStatus","target_url","head_sha","started_at","completed_at","output","featureBranchLabel","automergeLabel","prHasFeatureBranchLabel","prHasAutoMergeLabel","defaultOptions","hasDiffInTitle","hasDiffInBody","removeLabel","addLabels","addStatusCheck","hasPrCheck","created_at","createFailedStatusCheck","updateStatusCheckFromLabels","requested_reviewers","rr","needsReviewGroupNames","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","team","newLabelNamesArray","oldLabels","size","replaceLabels","autoApproveAndAutoMerge","codeApprovedLabel","createReview","event","opened","app","on","fromRenovate","closed","git","deleteRef","catch","reviewRequested","sender","reviewer","requested_reviewer","reviews","listReviews","hasChangesRequestedInReviews","html_url","reviewRequestRemoved","hasRequestedReviewsForGroup","hasApprovedInReviews","reviewSubmitted","newLabels","prUrl","reviewDismissed","synchronize","edited","updatePrBody","prBody","labelsChanged","action","checkrunCompleted","check_run","pull_requests","checksuiteCompleted","check_suite","isSameBranch","branches","b","Probot","run","openedHandler","closedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","synchromizeHandler","editedHandler"],"mappings":";;;;;;;AAEA,MAAMA,MAA0D,GAAG;EACjEC,UAAU,EAAEC,OAAO,CAACC,GAAR,CAAYC,mBADyC;EAEjEC,mBAAmB,EAAE,IAF4C;EAGjEC,SAAS,EAAE,IAHsD;EAIjEC,qBAAqB,EAAE,IAJ0C;EAKjEC,gBAAgB,EAAE;IAChBC,aAAa,EAAE,KADC;IAEhBC,mBAAmB,EAAE,KAFL;IAGhBC,SAAS,EAAE,KAHK;IAIhBC,gBAAgB,EAAE;GAT6C;EAWjEC,OAAO,EAAE;IACPC,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,MAAM,EAAE,IADH;UAELC,GAAG,EAAG,wCAAuCF,KAAM,EAF9C;UAGLR,KAAK,EAAG,eAAcQ,KAAM,EAHvB;UAILL,OAAO,EAAG,IAAGK,KAAM,0CAAyCA,KAAM;SAJpE;;KA3BC;GAZwD;EAkDjEG,MAAM,EAAE;IACNC,GAAG,EAAE;;MAEHC,QAAQ,EAAG,YAAWzB,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAFpD;MAGHC,YAAY,EAAG,SAAQ3B,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAHrD;MAIHE,KAAK,EAAG,SAAQ5B,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAJ9C;MAKHG,UAAU,EAAG,cAAa7B,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EALxD;uBAMe,UAAS1B,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EANzD;MAOHI,QAAQ,EAAG,QAAO9B,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAPhD;MAQHK,IAAI,EAAG,gBAAe/B,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EARpD;;;MAUHM,iBAAiB,EAAG,aAAYhC,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAV9D;MAWHO,WAAW,EAAG,OAAMjC,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAXlD;MAYHQ,aAAa,EAAG,SAAQlC,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAZtD;MAaHS,aAAa,EAAG,WAAUnC,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAbxD;MAcHU,KAAK,EAAG,SAAQpC,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAd9C;MAeHW,KAAK,EAAG,gBAAerC,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAfrD;eAgBO,WAAU1B,OAAO,CAACC,GAAR,CAAYyB,oBAAqB;KAjBjD;IAmBNY,MAAM,EAAE;MACNC,SAAS,EAAG,SAAQvC,OAAO,CAACC,GAAR,CAAYyB,oBAAqB,EAD/C;MAENc,eAAe,EAAG,WAAUxC,OAAO,CAACC,GAAR,CAAYyB,oBAAqB;;GAvEA;EA2EjEe,KAAK,EAAE;IACLC,QAAQ,EAAE;MACRC,MAAM,EAAE,CACN,UADM,EAEN,cAFM,EAGN,OAHM,EAIN,YAJM,EAKN,eALM,EAMN,UANM,EAON,MAPM,CADA;MAURC,MAAM,EAAE,CAAC,eAAD;KAXL;IAcLC,SAAS,EAAE;MACTF,MAAM,EAAE,CACN,mBADM,EAEN,aAFM,EAGN,eAHM,EAIN,eAJM,EAKN,OALM,EAMN,OANM,EAON,OAPM,CADC;MAUTC,MAAM,EAAE,CAAC,gBAAD;;GAnGqD;EAuGjEE,aAAa,EAAE;IACbtB,GAAG,EAAE,EADQ;IAEbc,MAAM,EAAE,CAAC,KAAD;GAzGuD;EA2GjEM,MAAM,EAAE;IACNG,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;;;uBA4Ca;QACfD,IAAI,EAAE,SADS;QAEfC,KAAK,EAAE;OA9CL;wBAgDc;QAChBD,IAAI,EAAE,UADU;QAEhBC,KAAK,EAAE;OAlDL;;;yBAsDe;QACjBD,IAAI,EAAE,kBADW;QAEjBC,KAAK,EAAE;OAxDL;;;wBA4Dc;QAChBD,IAAI,EAAE,gBADU;QAEhBC,KAAK,EAAE;;KA/DL;IAmENC,MAAM,EAAE;MACNC,EAAE,EAAE;QACFC,UAAU,EAAE,gBADV;QAEFC,SAAS,EAAE,YAFT;QAGFC,MAAM,EAAE;OAJJ;MAMN9B,GAAG,EAAE;QACH+B,WAAW,EAAE,mBADV;QAEHC,SAAS,EAAE,uBAFR;QAGHC,gBAAgB,EAAE,wBAHf;QAIHC,QAAQ,EAAE;OAVN;MAYNpB,MAAM,EAAE;QACNiB,WAAW,EAAE,qBADP;QAENC,SAAS,EAAE,yBAFL;QAGNC,gBAAgB,EAAE,0BAHZ;QAINC,QAAQ,EAAE;;;;CA9LlB;;ACAA,MAAM5D,QAA4B,GAAG;EACnCK,mBAAmB,EAAE,IADc;EAEnCC,SAAS,EAAE,IAFwB;EAGnCC,qBAAqB,EAAE,KAHY;EAInCC,gBAAgB,EAAE;IAChBC,aAAa,EAAE,KADC;IAEhBC,mBAAmB,EAAE,KAFL;IAGhBC,SAAS,EAAE,KAHK;IAIhBC,gBAAgB,EAAE;GARe;EAUnCC,OAAO,EAAE;IACPC,KAAK,EAAE,CACL;MACEC,MAAM;gGADR;MAIEC,KAAK,EAAE;QACLF,KAAK,EAAE,8CADF;QAELG,OAAO,EACL;;KARD;GAX0B;EAwBnCQ,MAAM,EAAE;IACNC,GAAG,EAAE;MACHQ,iBAAiB,EAAE,wBADhB;0BAEiB,yCAFjB;MAGHK,KAAK,EAAE;;GA5BwB;EA+BnCS,aAAa,EAAE;IACbtB,GAAG,EAAE;GAhC4B;EAkCnCiB,KAAK,EAAE,EAlC4B;EAmCnCG,MAAM,EAAE;IACNG,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;;;wBA+Bc;QAChBD,IAAI,EAAE,gBADU;QAEhBC,KAAK,EAAE;;KAlCL;IAsCNC,MAAM,EAAE;MACNC,EAAE,EAAE;QACFC,UAAU,EAAE,gBADV;QAEFC,SAAS,EAAE,YAFT;QAGFC,MAAM,EAAE;OAJJ;MAMN9B,GAAG,EAAE;QACH+B,WAAW,EAAE,mBADV;QAEHC,SAAS,EAAE,uBAFR;QAGHC,gBAAgB,EAAE,wBAHf;QAIHC,QAAQ,EAAE;;;;CAnFlB;;ACOO,MAAMC,WAAwC,GAAG;WACtDC,MADsD;qBAEtD5B;CAFK;;;;;;;ACHA,MAAM6B,OAAkB,GAAG,CAChC,eADgC,EAEhC,qBAFgC,EAGhC,WAHgC,EAIhC,kBAJgC,CAA3B;AAMP,AAAO,MAAMC,cAAmD,GAAGD,OAAO,CAACE,GAAR,CAChEC,MAAD,KAAa;EACXhB,IAAI,EAAEgB,MADK;EAEXC,MAAM,EAAE,IAAIC,MAAJ,CAAY,mCAAkCF,MAAO,MAArD;CAFV,CADiE,CAA5D;AAOP,AAAO,MAAMG,aAAiD,GAAG,CAC/D;EAAEnB,IAAI,EAAE,eAAR;EAAyBoB,KAAK,EAAE;CAD+B,EAE/D;EACEpB,IAAI,EAAE,qBADR;EAEEoB,KAAK,EAAE;CAJsD,EAM/D;EACEpB,IAAI,EAAE,WADR;EAEEoB,KAAK,EACH;CAT2D,EAW/D;EACEpB,IAAI,EAAE,kBADR;EAEEoB,KAAK,EAAE;CAbsD,CAA1D;;ACjBP,MAAMC,YAAY,GAAG,iCAArB;AACA,MAAMC,UAAU,GAAG,8CAAnB;AAEA,MAAMC,UAAU,GAAG,uGAAnB;AACA,MAAMC,mBAAmB,GAAG,qJAA5B;;AAEA,MAAMC,YAAY,GAAG,CACnBC,OADmB,EAEnBC,aAFmB,KAGU;SACtBb,cAAc,CAACc,MAAf,CACL,CAACC,GAAD,EAAM;IAAE7B,IAAF;IAAQiB;GAAd,KAA2B;UACnB9C,KAAK,GAAG8C,MAAM,CAACa,IAAP,CAAYJ,OAAZ,CAAd;IACAG,GAAG,CAAC7B,IAAD,CAAH,GAAY,CAAC7B,KAAD,GACRwD,aAAa,CAAC3B,IAAD,CAAb,IAAuB,KADf,GAER7B,KAAK,CAAC,CAAD,CAAL,KAAa,GAAb,IAAoBA,KAAK,CAAC,CAAD,CAAL,KAAa,GAFrC;WAGO0D,GAAP;GANG,EAQL,EARK,CAAP;CAJF;;AAgBA,AAAO,MAAME,SAAS,GAAG,CACvBC,WADuB,EAEvBL,aAFuB,KAGpB;QACGxD,KAAK,GAAGoD,UAAU,CAACO,IAAX,CAAgBE,WAAhB,CAAd;MACI,CAAC7D,KAAL,EAAY,OAAO,IAAP;QACN,GAAGuD,OAAH,EAAYO,aAAZ,EAA2BC,iBAA3B,EAA8CC,MAA9C,IAAwDhE,KAA9D;QACMiE,kBAAkB,GAAGZ,mBAAmB,CAACM,IAApB,CAAyBG,aAAzB,CAA3B;;MACI,CAACG,kBAAL,EAAyB;WAChB;MACLV,OADK;MAELS,MAFK;MAGLE,oBAAoB,EAAEH,iBAHjB;MAILI,0BAA0B,EAAEjB,YAJvB;MAKLkB,0BAA0B,EAAEjB,UALvB;MAMLT,OAAO,EAAEY,YAAY,CAACQ,aAAD,EAAgBN,aAAhB;KANvB;;;QASI,GAEJW,0BAFI,EAGJD,oBAHI,EAIJE,0BAJI,IAKFH,kBALJ;SAOO;IACLV,OADK;IAELS,MAFK;IAGLE,oBAHK;IAILC,0BAJK;IAKLC,0BALK;IAML1B,OAAO,EAAEY,YAAY,CAACY,oBAAD,EAAuBV,aAAvB;GANvB;CAzBK;;ACxBP;AAEA;AAKA,MAAMa,uBAAuB,GAAG,OAC9BC,OAD8B,EAE9BC,WAF8B,EAG9BC,EAH8B,KAI3B;QACGC,MAAM,GAAG,MAAMH,OAAO,CAACI,MAAR,CAAeD,MAAf,CAAsBE,UAAtB,CACnBL,OAAO,CAACM,IAAR,CAAa;IACXC,GAAG,EAAEL,EAAE,CAACM,IAAH,CAAQC,GADF;IAEXC,QAAQ,EAAE;GAFZ,CADmB,CAArB;QAOMC,YAAY,GAAGR,MAAM,CAACS,IAAP,CAAYC,UAAZ,CAAuBC,MAAvB,CAClBC,KAAD,IAAWA,KAAK,CAACC,UAAN,KAAqB,SADb,CAArB;;MAIIL,YAAY,CAACM,MAAb,KAAwB,CAA5B,EAA+B;IAC7BjB,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAkB,2CAA0CjB,EAAE,CAACkB,EAAG,EAAlE,EAAqE;MACnEjB,MAAM,EAAEQ,YAAY,CAACrC,GAAb,CAAkByC,KAAD,IAAWA,KAAK,CAACxD,IAAlC;KADV;WAGO,IAAP;;;QAGI8D,cAAc,GAAG,MAAMrB,OAAO,CAACI,MAAR,CAAekB,KAAf,CAAqBC,uBAArB,CAC3BvB,OAAO,CAACM,IAAR,CAAa;IACXC,GAAG,EAAEL,EAAE,CAACM,IAAH,CAAQC,GADF;IAEXC,QAAQ,EAAE;GAFZ,CAD2B,CAA7B;;MAOIW,cAAc,CAACT,IAAf,CAAoBY,KAApB,KAA8B,SAAlC,EAA6C;UACrCC,cAAc,GAAGJ,cAAc,CAACT,IAAf,CAAoBc,QAApB,CAA6BZ,MAA7B,CACpBtF,MAAD,IAAYA,MAAM,CAACgG,KAAP,KAAiB,SAAjB,IAA8BhG,MAAM,CAACgG,KAAP,KAAiB,OADtC,CAAvB;IAIAxB,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAkB,4CAA2CjB,EAAE,CAACkB,EAAG,EAAnE,EAAsE;MACpEM,QAAQ,EAAED,cAAc,CAACnD,GAAf,CAAoB9C,MAAD,IAAYA,MAAM,CAACwE,OAAtC;KADZ;WAIO,IAAP;;;SAGK,KAAP;CA1CF;;AA6CA,AAAO,MAAM2B,mBAAmB,GAAG,OACjC3B,OADiC,EAEjCC,WAFiC,EAGjCC,EAAO,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAHO,EAIjCC,QAAyB,GAAG5B,EAAE,CAAC/C,MAJE,KAKZ;QACf4E,cAAc,GAAG9B,WAAW,CAAC9C,MAAZ,CAAmB,iBAAnB,CAAvB;MACI,CAAC4E,cAAL,EAAqB,OAAO,KAAP;;QAEfC,uBAAuB,GAAG,OAAO;IACrCZ,EAAE,EAAElB,EAAE,CAACkB,EAD8B;IAErCa,MAAM,EAAE/B,EAAE,CAAC+B,MAF0B;IAGrCC,MAAM,EAAEhC,EAAE,CAACM,IAAH,CAAQD;GAHc,CAAhC;;MAMI,CAACuB,QAAQ,CAACK,IAAT,CAAeC,CAAD,IAAgBA,CAAC,CAAChB,EAAF,KAASW,cAAc,CAACX,EAAtD,CAAL,EAAgE;IAC9DpB,OAAO,CAACkB,GAAR,CAAYmB,KAAZ,CAAkB,kCAAlB;IACApC,WAAW,CAACqC,0BAAZ,CAAuCtC,OAAvC,EAAgDE,EAAE,CAAC+B,MAAnD;WACO,KAAP;;;MAGE/B,EAAE,CAACsB,KAAH,KAAa,MAAjB,EAAyB;IACvBxB,OAAO,CAACkB,GAAR,CAAYmB,KAAZ,CAAkB,0CAAlB;IACApC,WAAW,CAACqC,0BAAZ,CAAuCtC,OAAvC,EAAgDE,EAAE,CAAC+B,MAAnD;;;MAIAhC,WAAW,CAACsC,cAAZ,CAA2BT,QAA3B,KACA7B,WAAW,CAACuC,kBAAZ,CAA+BV,QAA/B,CAFF,EAGE;IACA9B,OAAO,CAACkB,GAAR,CAAYmB,KAAZ,CAAkB,yCAAlB,EADA;;WAGO,KAAP;;;QAGII,QAAQ,GAAGxC,WAAW,CAACyC,gBAAZ,EAAjB;;MACID,QAAQ,IAAIA,QAAQ,CAACR,MAAT,KAAoB/B,EAAE,CAAC+B,MAAvC,EAA+C;IAC7CjC,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAkB,qCAAoCjB,EAAE,CAACkB,EAAG,EAA5D;IACAnB,WAAW,CAAC0C,kBAAZ,CAA+BX,uBAAuB,EAAtD;WACO,KAAP;;;EAGF/B,WAAW,CAAC2C,cAAZ,CAA2BZ,uBAAuB,EAAlD;;MAEI9B,EAAE,CAAC2C,SAAH,KAAiBC,SAArB,EAAgC;UACxBC,QAAQ,GAAG,MAAM/C,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqBC,GAArB,CACrBjD,OAAO,CAACM,IAAR,CAAa;MACX4C,WAAW,EAAEhD,EAAE,CAAC+B;KADlB,CADqB,CAAvB;IAKA/B,EAAE,GAAG6C,QAAQ,CAACnC,IAAd;;;MAGEV,EAAE,CAACiD,MAAP,EAAe;IACblD,WAAW,CAACqC,0BAAZ,CAAuCtC,OAAvC,EAAgDE,EAAE,CAAC+B,MAAnD;IACAjC,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAkB,6CAA4CjB,EAAE,CAACkB,EAAG,EAApE;WACO,KAAP;;;EAGFpB,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CACG,eAAcjB,EAAE,CAACkB,EAAG,eAAclB,EAAE,CAAC2C,SAAU,UAC9C3C,EAAE,CAACkD,eACJ,EAHH,EAtDqB;;MA8DnB,EACElD,EAAE,CAACkD,eAAH,KAAuB,OAAvB,IACAlD,EAAE,CAACkD,eAAH,KAAuB,WADvB,IAEAlD,EAAE,CAACkD,eAAH,KAAuB,UAHzB,CADF,EAME;QACI,CAAClD,EAAE,CAACkD,eAAJ,IAAuBlD,EAAE,CAACkD,eAAH,KAAuB,SAAlD,EAA6D;MAC3DpD,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAkB,wCAAuCjB,EAAE,CAACkB,EAAG,EAA/D,EAD2D;;MAG3DnB,WAAW,CAACoD,UAAZ,CAAuBrD,OAAvB,EAAgCgC,uBAAuB,EAAvD;aACO,KAAP;;;QAGE9B,EAAE,CAACM,IAAH,CAAQD,GAAR,CAAY+C,UAAZ,CAAuB,WAAvB,CAAJ,EAAyC;UACnCpD,EAAE,CAACkD,eAAH,KAAuB,QAAvB,IAAmClD,EAAE,CAACkD,eAAH,KAAuB,OAA9D,EAAuE;QACrEpD,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CACG,qDAAoDjB,EAAE,CAACkB,EAAG,EAD7D,EADqE;;cAM/DpB,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBC,MAAtB,CACJxD,OAAO,CAACM,IAAR,CAAa;UACX2B,MAAM,EAAE/B,EAAE,CAAC+B,MADA;UAEXwB,IAAI,EAAEvD,EAAE,CAACuD,IAAH,CAAQC,OAAR,CACJ,8BADI,EAEJ,8BAFI;SAFR,CADI,CAAN;eASO,KAAP;;;UAGE,MAAM3D,uBAAuB,CAACC,OAAD,EAAUC,WAAV,EAAuBC,EAAvB,CAAjC,EAA6D;QAC3DD,WAAW,CAACqC,0BAAZ,CAAuCtC,OAAvC,EAAgDE,EAAE,CAAC+B,MAAnD;eACO,KAAP;OAFF,MAGO,IAAI/B,EAAE,CAACkD,eAAH,KAAuB,SAA3B,EAAsC;;eAEpC,KAAP;;;MAGFpD,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CACG,yDACCjB,EAAE,CAACkD,eACJ,EAHH;aAKO,KAAP;;;QAGElD,EAAE,CAACkD,eAAH,KAAuB,SAA3B,EAAsC;UAChC,MAAMrD,uBAAuB,CAACC,OAAD,EAAUC,WAAV,EAAuBC,EAAvB,CAAjC,EAA6D;QAC3DD,WAAW,CAACqC,0BAAZ,CAAuCtC,OAAvC,EAAgDE,EAAE,CAAC+B,MAAnD;eACO,KAAP;OAFF,MAGO;;eAEE,KAAP;;;;QAIA/B,EAAE,CAACkD,eAAH,KAAuB,QAA3B,EAAqC;MACnCpD,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAiB,uCAAjB,EAA0D;QACxDX,IAAI,EAAEN,EAAE,CAACM,IAAH,CAAQD,GAD0C;QAExDoD,IAAI,EAAEzD,EAAE,CAACyD,IAAH,CAAQpD;OAFhB;YAKMP,OAAO,CAACI,MAAR,CAAekB,KAAf,CAAqBsC,KAArB,CAA2B;QAC/BC,KAAK,EAAE3D,EAAE,CAACM,IAAH,CAAQF,IAAR,CAAauD,KAAb,CAAmBC,KADK;QAE/BxD,IAAI,EAAEJ,EAAE,CAACM,IAAH,CAAQF,IAAR,CAAa/C,IAFY;QAG/BiD,IAAI,EAAEN,EAAE,CAACyD,IAAH,CAAQpD,GAHiB;QAI/BoD,IAAI,EAAEzD,EAAE,CAACM,IAAH,CAAQD;OAJV,CAAN;aAOO,KAAP;;;IAGFN,WAAW,CAACqC,0BAAZ,CAAuCtC,OAAvC,EAAgDE,EAAE,CAAC+B,MAAnD;IACAjC,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CACG,yDACCjB,EAAE,CAACkD,eACJ,EAHH;WAKO,KAAP;;;MAGE;IACFpD,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAkB,iBAAgBjB,EAAE,CAAC+B,MAAO,EAA5C;UAEM8B,UAAU,GAAGzE,SAAS,CAACY,EAAE,CAACuD,IAAJ,EAAUxD,WAAW,CAAC5F,MAAZ,CAAmBQ,gBAA7B,CAA5B;UACMuD,OAAO,GACV2F,UAAU,IAAIA,UAAU,CAAC3F,OAA1B,IAAsC6B,WAAW,CAAC5F,MAAZ,CAAmBQ,gBAD3D;UAGMmJ,WAAW,GAAG,MAAMhE,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqBY,KAArB,CAA2B;MACnDK,YAAY,EAAE7F,OAAO,CAACtD,aAAR,GAAwB,OAAxB,GAAkC,QADG;MAEnD+I,KAAK,EAAE3D,EAAE,CAACM,IAAH,CAAQF,IAAR,CAAauD,KAAb,CAAmBC,KAFyB;MAGnDxD,IAAI,EAAEJ,EAAE,CAACM,IAAH,CAAQF,IAAR,CAAa/C,IAHgC;MAInD2F,WAAW,EAAEhD,EAAE,CAAC+B,MAJmC;MAKnDiC,YAAY,EAAG,GAAEhE,EAAE,CAAC/E,KAAM,GACxBiD,OAAO,CAACrD,mBAAR,GAA8B,YAA9B,GAA6C,EAC9C,MAAKmF,EAAE,CAAC+B,MAAO,GAPmC;MAQnDkC,cAAc,EAAE,EARmC;;KAA3B,CAA1B;IAUAnE,OAAO,CAACkB,GAAR,CAAYmB,KAAZ,CAAkB,eAAlB,EAAmC2B,WAAW,CAACpD,IAA/C;IACAX,WAAW,CAACqC,0BAAZ,CAAuCtC,OAAvC,EAAgDE,EAAE,CAAC+B,MAAnD;WACOmC,OAAO,CAACJ,WAAW,CAACpD,IAAZ,CAAiBuC,MAAlB,CAAd;GAnBF,CAoBE,OAAOkB,GAAP,EAAY;IACZrE,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAiB,kBAAjB,EAAqCkD,GAAG,CAACC,OAAzC;IACArE,WAAW,CAACoD,UAAZ,CAAuBrD,OAAvB,EAAgCgC,uBAAuB,EAAvD;WACO,KAAP;;CA7KG;;ACnCA,MAAMuC,cAAc,GAAG,OAC5BvE,OAD4B,EAE5B3F,MAF4B,KAGR;QACd;IAAEuG,IAAI,EAAEzD;MAAW,MAAM6C,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBiB,iBAAtB,CAC7BxE,OAAO,CAACM,IAAR,CAAa;IAAEI,QAAQ,EAAE;GAAzB,CAD6B,CAA/B;QAGM+D,WAA0C,GAAG,EAAnD;;OAEK,MAAM,CAACC,QAAD,EAAWC,WAAX,CAAX,IAAsCC,MAAM,CAACC,OAAP,CAAexK,MAAM,CAAC8C,MAAP,CAAcG,IAA7B,CAAtC,EAA0E;UAClEwH,UAAU,GAAGH,WAAW,CAACnH,KAAZ,CAAkBuH,KAAlB,CAAwB,CAAxB,CAAnB;UACMxF,WAAW,GAAI,gCAA+BmF,QAAS,EAA7D;QAEIM,aAAa,GAAG7H,MAAM,CAACgF,IAAP,CAAaxD,KAAD,IAAWA,KAAK,CAACpB,IAAN,KAAeoH,WAAW,CAACpH,IAAlD,CAApB;;QACI,CAACyH,aAAL,EAAoB;MAClBA,aAAa,GAAG7H,MAAM,CAACgF,IAAP,CAAaxD,KAAD,IAAWA,KAAK,CAACY,WAAN,KAAsBA,WAA7C,CAAhB;;;QAEE,CAACyF,aAAL,EAAoB;UACdN,QAAQ,KAAK,qBAAjB,EAAwC;QACtCM,aAAa,GAAG7H,MAAM,CAACgF,IAAP,CACbxD,KAAD,IAAWA,KAAK,CAACpB,IAAN,KAAe,qBADZ,CAAhB;;;UAIEmH,QAAQ,KAAK,iBAAjB,EAAoC;QAClCM,aAAa,GAAG7H,MAAM,CAACgF,IAAP,CACbxD,KAAD,IAAWA,KAAK,CAACpB,IAAN,KAAe,iBADZ,CAAhB;;;;QAMA,CAACyH,aAAL,EAAoB;YACZC,MAAM,GAAG,MAAMjF,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsB2B,WAAtB,CACnBlF,OAAO,CAACM,IAAR,CAAa;QACX/C,IAAI,EAAEoH,WAAW,CAACpH,IADP;QAEXC,KAAK,EAAEsH,UAFI;QAGXvF;OAHF,CADmB,CAArB;MAOAkF,WAAW,CAACC,QAAD,CAAX,GAAwBO,MAAM,CAACrE,IAA/B;KARF,MASO,IACLoE,aAAa,CAACzH,IAAd,KAAuBoH,WAAW,CAACpH,IAAnC,IACAyH,aAAa,CAACxH,KAAd,KAAwBsH,UAFnB;;;MAKL;QACA9E,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAiB,uBAAjB,EAA0C;UACxCgE,YAAY,EAAEH,aAAa,CAACzH,IADY;UAExCA,IAAI,EAAEyH,aAAa,CAACzH,IAAd,KAAuBoH,WAAW,CAACpH,IAAnC,IAA2CoH,WAAW,CAACpH,IAFrB;UAGxCC,KAAK,EAAEwH,aAAa,CAACxH,KAAd,KAAwBsH,UAAxB,IAAsCA,UAHL;UAIxCvF,WAAW,EAAEyF,aAAa,CAACzF,WAAd,KAA8BA,WAA9B,IAA6CA;SAJ5D;cAOM0F,MAAM,GAAG,MAAMjF,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsB6B,WAAtB,CACnBpF,OAAO,CAACM,IAAR,CAAa;UACX6E,YAAY,EAAEH,aAAa,CAACzH,IADjB;UAEXA,IAAI,EAAEoH,WAAW,CAACpH,IAFP;UAGXC,KAAK,EAAEsH,UAHI;UAIXvF;SAJF,CADmB,CAArB;QAQAkF,WAAW,CAACC,QAAD,CAAX,GAAwBO,MAAM,CAACrE,IAA/B;OArBK,MAsBA;MACL6D,WAAW,CAACC,QAAD,CAAX,GAAwBM,aAAxB;;;;SAIGP,WAAP;CAlEK;;ACjBA,MAAMY,OAAO,GAAkBC,CAAf,IACrBV,MAAM,CAACW,IAAP,CAAYD,CAAZ,CADK;;ACUP,MAAME,aAAa,GAAIpB,OAAvB;AAIA,AAAO,MAAMqB,aAAa,GAAG,OAC3BzF,OAD2B,EAE3B3F,MAF2B,KAGJ;MACnB,CAACA,MAAM,CAACC,UAAZ,EAAwB;WACf;MACLoL,OAAO,EAAE,MAAyB,EAD7B;MAELC,WAAW,EAAE,MAAuCC,OAAO,CAACC,OAAR;KAFtD;;;QAMIC,uBAAuB,GAAGT,OAAO,CAAChL,MAAM,CAACyB,MAAR,CAAP,CAAuBqD,MAAvB,CAE7B,CAACC,GAAD,EAAM2G,SAAN,KAAoB;IACrBnB,MAAM,CAACoB,MAAP,CAAc5G,GAAd,EAAmB/E,MAAM,CAACyB,MAAP,CAAciK,SAAd,CAAnB;WACO3G,GAAP;GAJ8B,EAK7B,EAL6B,CAAhC;QAOM6G,WAAW,GAAG,IAAIC,gBAAJ,CAAc7L,MAAM,CAACC,UAArB,CAApB;QACM6L,QAAa,GAAG,MAAMF,WAAW,CAACG,KAAZ,CAAkB9I,IAAlB,CAAuB;IAAE+I,KAAK,EAAE;GAAhC,CAA5B;QACMC,OAA6C,GAAG1B,MAAM,CAAC2B,MAAP,CACpDT,uBADoD,EAGnDxH,GAHmD,CAG9CkI,KAAD,IAAW;UACRC,MAAM,GAAGN,QAAQ,CAACG,OAAT,CAAiBnE,IAAjB,CACZuE,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,EAAEhE;KAAtB,CAAP;GAXkD,EAgBnDhC,MAhBmD,CAgB5C0E,aAhB4C,CAAtD;;OAkBK,MAAM,GAAGkB,IAAH,CAAX,IAAuBJ,OAAvB,EAAgC;QAC1B;YACIQ,EAAO,GAAG,MAAMb,WAAW,CAACa,EAAZ,CAAeC,IAAf,CAAoB;QAAEL,IAAI,EAAEA,IAAI,CAACD,MAAL,CAAYrF;OAAxC,CAAtB;MACAsF,IAAI,CAACI,EAAL,GAAUA,EAAE,CAACE,OAAb;KAFF,CAGE,OAAO3C,GAAP,EAAY;MACZuC,OAAO,CAACvL,KAAR,CAAcgJ,GAAd;;;;QAIE4C,UAAU,GAAG,IAAIC,GAAJ,CAAQZ,OAAR,CAAnB;;QAEMa,sBAAsB,GAAIC,WAAD,IAAyB;UAChDZ,KAAK,GAAGV,uBAAuB,CAACsB,WAAD,CAArC;QACI,CAACZ,KAAL,EAAY,OAAO,IAAP;WACLS,UAAU,CAAChE,GAAX,CAAeuD,KAAf,CAAP;GAHF;;SAMO;IACLd,OAAO,EAAG0B,WAAD,IAAyB;YAC1BV,IAAI,GAAGS,sBAAsB,CAACC,WAAD,CAAnC;UACI,CAACV,IAAL,EAAW,OAAOU,WAAP;aACH,KAAIV,IAAI,CAACD,MAAL,CAAYrF,EAAG,GAA3B;KAJG;IAMLuE,WAAW,EAAE,OAAOyB,WAAP,EAA4BC,IAA5B,KAA6C;MACxDrH,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAiB,YAAjB,EAA+B;QAAEiG,WAAF;QAAeC;OAA9C;UACI9M,OAAO,CAACC,GAAR,CAAY8M,OAAhB,EAAyB;YAEnBZ,IAAI,GAAGS,sBAAsB,CAACC,WAAD,CAAnC;UACI,CAACV,IAAD,IAAS,CAACA,IAAI,CAACI,EAAnB,EAAuB;YACjBb,WAAW,CAACsB,IAAZ,CAAiB5B,WAAjB,CAA6B;QACjCqB,OAAO,EAAEN,IAAI,CAACI,EAAL,CAAQ1F,EADgB;QAEjCiG;OAFI,CAAN;;GAZJ;CAvDK;;ACSP,MAAM7B,eAAa,GAAIpB,OAAvB;;AAIA,MAAMoD,eAAe,GAAG,OACtBxH,OADsB,EAEtB3F,MAFsB,KAGE;QAClBoN,YAAY,GAAGhC,aAAa,CAACzF,OAAD,EAAU3F,MAAV,CAAlC;QAEMqN,kBAAkB,GAAG,IAAIR,GAAJ,EAA3B;EACA7B,OAAO,CAAChL,MAAM,CAACyB,MAAR,CAAP,CAAuB6L,OAAvB,CAAgC5B,SAAD,IAAe;IAC5CnB,MAAM,CAACW,IAAP,CAAYlL,MAAM,CAACyB,MAAP,CAAciK,SAAd,CAAZ,EAAsC4B,OAAtC,CAA+C7D,KAAD,IAAW;MACvD4D,kBAAkB,CAACE,GAAnB,CAAuB9D,KAAvB,EAA8BiC,SAA9B;KADF;GADF;QAMM8B,kBAAkB,GAAG,IAAIX,GAAJ,EAA3B;EACA7B,OAAO,CAAChL,MAAM,CAAC2C,KAAP,IAAgB,EAAjB,CAAP,CAA4B2K,OAA5B,CAAoC,CAACvI,GAAD,EAAM0I,QAAN,KAAmB;IACpDzN,MAAM,CAAC2C,KAAR,CAAmD8K,QAAnD,EAA6D5K,MAA7D,CAAoEyK,OAApE,CACG7D,KAAD,IAAW;UACL1E,GAAG,CAAC2I,GAAJ,CAAQjE,KAAR,CAAJ,EAAoB;QAClB1E,GAAG,CAAC6D,GAAJ,CAAQa,KAAR,EAAekE,IAAf,CAAoBF,QAApB;OADF,MAEO;QACL1I,GAAG,CAACwI,GAAJ,CAAQ9D,KAAR,EAAe,CAACgE,QAAD,CAAf;;KALN;GADF;;QAYMG,iBAAiB,GAAIC,YAAD,IAA4B,CACpD,GAAG,IAAIC,GAAJ,CACDD,YAAY,CACT5J,GADH,CACQ8I,WAAD,IAAiBM,kBAAkB,CAACzE,GAAnB,CAAuBmE,WAAvB,CADxB,EAEGtG,MAFH,CAEUsD,OAFV,CADC,CADiD,CAAtD;;SAQO;IACL/J,MADK;IAEL+N,gBAAgB,EAAGhB,WAAD,IAAiBM,kBAAkB,CAACzE,GAAnB,CAAuBmE,WAAvB,CAF9B;IAGLa,iBAAiB,EAAGC,YAAD,IAAkB,CACnC,GAAG,IAAIC,GAAJ,CACDD,YAAY,CACT5J,GADH,CACQ8I,WAAD,IAAiBM,kBAAkB,CAACzE,GAAnB,CAAuBmE,WAAvB,CADxB,EAEGtG,MAFH,CAEU0E,eAFV,CADC,CADgC,CAHhC;IAWL6C,gBAAgB,EAAGjB,WAAD,IAChBS,kBAAkB,CAAC5E,GAAnB,CAAuBmE,WAAvB,KAAuC,EAZpC;IAcLkB,gBAAgB,EAAE,CAChBC,aADgB,EAEhBC,kBAFgB,EAGhB;MAAEC,qBAAF;MAAyBC;KAHT,KAIb;UACC,CAACH,aAAL,EAAoB,OAAO,KAAP;YAEdI,uBAAuB,GAAGV,iBAAiB,CAC/CO,kBAAkB,CAAClK,GAAnB,CAAwBsK,OAAD,IAAaA,OAAO,CAAC9E,KAA5C,CAD+C,CAAjD,CAHG;;UASD2E,qBAAqB,IACrBE,uBAAuB,CAACE,QAAxB,CAAiCN,aAAjC,CAFF,EAGE;eACO,IAAP;OAZC;;;UAgBClO,MAAM,CAACgD,aAAP,IAAwBqL,qBAA5B,EAAmD;cAC3CrL,aAAa,GAAGhD,MAAM,CAACgD,aAA7B;eACOsL,uBAAuB,CAACG,IAAxB,CAA8BC,KAAD,IAClC1L,aAAa,CAACkL,aAAD,CAAb,CAA6BM,QAA7B,CAAsCE,KAAtC,CADK,CAAP;;;aAKK,KAAP;KAzCG;IA4CLC,KAAK,EAAE,MAAMvB;GA5Cf;CAlCF;;AAkFA,MAAMwB,kBAAkB,GAAG,IAAI/B,GAAJ,EAA3B;AACA,MAAMgC,WAAW,GAAG,IAAIhC,GAAJ,EAApB;AAEA,AAAO,MAAMiC,gBAAgB,GAAG,CAC9BnJ,OAD8B,EAE9B3F,MAF8B,KAGN;QAClBwJ,KAAK,GAAG7D,OAAO,CAAC4B,OAAR,CAAgBwH,UAAhB,CAA2BvF,KAAzC;QAEMwF,mBAAmB,GAAGH,WAAW,CAACjG,GAAZ,CAAgBY,KAAK,CAACC,KAAtB,CAA5B;MACIuF,mBAAJ,EAAyB,OAAOA,mBAAP;QAEnBC,eAAe,GAAGL,kBAAkB,CAAChG,GAAnB,CAAuBY,KAAK,CAACC,KAA7B,CAAxB;MACIwF,eAAJ,EAAqB,OAAO1D,OAAO,CAACC,OAAR,CAAgByD,eAAhB,CAAP;QAEfC,OAAO,GAAG/B,eAAe,CAACxH,OAAD,EAAU3F,MAAV,CAA/B;EACA4O,kBAAkB,CAACrB,GAAnB,CAAuB/D,KAAK,CAACC,KAA7B,EAAoCyF,OAApC;SAEOA,OAAO,CAACC,IAAR,CAAcC,UAAD,IAAgB;IAClCR,kBAAkB,CAACS,MAAnB,CAA0B7F,KAAK,CAACC,KAAhC;IACAoF,WAAW,CAACtB,GAAZ,CAAgB/D,KAAK,CAACC,KAAtB,EAA6B2F,UAA7B;WACOA,UAAP;GAHK,CAAP;CAfK;;AChHP;AAEA,AAoCA,MAAMjE,eAAa,GAAIpB,OAAvB;;AASA,eAAeuF,eAAf,CACE3J,OADF,EAEE3F,MAFF,EAGoC;QAC5BoP,UAAU,GAAG,MAAMN,gBAAgB,CAACnJ,OAAD,EAAU3F,MAAV,CAAzC;QACM4F,WAAW,GAAG2E,MAAM,CAACgF,MAAP,CAAcH,UAAd,CAApB;QAEM,CAACtM,MAAD,IAAW,MAAMyI,OAAO,CAACiE,GAAR,CAAY,CAACtF,cAAc,CAACvE,OAAD,EAAU3F,MAAV,CAAf,CAAZ,CAAvB;QAEMyP,gBAAgB,GAAGlF,MAAM,CAACW,IAAP,CAAYlL,MAAM,CAACyB,MAAnB,CAAzB;QAEMiO,mBAAmB,GAAGD,gBAAgB,CACzCxL,GADyB,CACpB0L,GAAD,IAAqB3P,MAAM,CAAC8C,MAAP,CAAcM,MAAd,CAAqBuM,GAArB,EAA0BlM,WAD1B,EAEzBgD,MAFyB,CAElBsD,OAFkB,EAGzB9F,GAHyB,CAGpBf,IAAD,IAAUJ,MAAM,CAACI,IAAD,CAAN,CAAa6D,EAHF,CAA5B;QAKM6I,uBAAuB,GAAGH,gBAAgB,CAC7CxL,GAD6B,CACxB0L,GAAD,IAAS3P,MAAM,CAAC8C,MAAP,CAAcM,MAAd,CAAqBuM,GAArB,EAA0BjM,SADV,EAE7B+C,MAF6B,CAEtBsD,OAFsB,EAG7B9F,GAH6B,CAGxBf,IAAD,IAAUJ,MAAM,CAACI,IAAD,CAAN,CAAa6D,EAHE,CAAhC;QAKM8I,wBAAwB,GAAGJ,gBAAgB,CAC9CxL,GAD8B,CACzB0L,GAAD,IAAS3P,MAAM,CAAC8C,MAAP,CAAcM,MAAd,CAAqBuM,GAArB,EAA0BhM,gBADT,EAE9B8C,MAF8B,CAEvBsD,OAFuB,EAG9B9F,GAH8B,CAGzBf,IAAD,IAAUJ,MAAM,CAACI,IAAD,CAAN,CAAa6D,EAHG,CAAjC;QAKM+I,sBAAsB,GAAGL,gBAAgB,CAC5CxL,GAD4B,CACvB0L,GAAD,IAAS3P,MAAM,CAAC8C,MAAP,CAAcM,MAAd,CAAqBuM,GAArB,EAA0B/L,QADX,EAE5B6C,MAF4B,CAErBsD,OAFqB,EAG5B9F,GAH4B,CAGvBf,IAAD,IAAUJ,MAAM,CAACI,IAAD,CAAN,CAAa6D,EAHC,CAA/B;QAKMgJ,iBAAiB,GAAG,CACxB,GAAGH,uBADqB,EAExB,GAAGC,wBAFqB,EAGxB,GAAGC,sBAHqB,CAA1B;QAMME,kBAAkB,GAAG,IAAInD,GAAJ,EAA3B;EACA4C,gBAAgB,CAACnC,OAAjB,CAA0BqC,GAAD,IAAS;UAC1BM,iBAAiB,GAAGjQ,MAAM,CAAC8C,MAAP,CAAcM,MAAd,CAAqBuM,GAArB,CAA1B;IACApF,MAAM,CAACW,IAAP,CAAY+E,iBAAZ,EAA+B3C,OAA/B,CAAwCjD,QAAD,IAAsB;MAC3D2F,kBAAkB,CAACzC,GAAnB,CAAuBzK,MAAM,CAACmN,iBAAiB,CAAC5F,QAAD,CAAlB,CAAN,CAAoCtD,EAA3D,EAA+D4I,GAA/D;KADF;GAFF,EAnCkC;;QA2D5BO,MAAI,GAAGC,SAAI,EAAjB;MACIC,WAAJ;MACIC,cAA+B,GAAG,EAAtC;;QAEMC,WAAW,GAAG,CAClBC,SADkB,EAElBC,QAFkB,KAIlB,IAAIjF,OAAJ,CAAY,CAACC,OAAD,EAAUiF,MAAV,KAAqB;IAC/BlE,OAAO,CAAC1F,GAAR,CAAY,sBAAZ,EAAoC;MAAE0J;KAAtC;IACAL,MAAI,CAACK,SAAD,EAAY,MAAOG,qBAAP,IAAiC;YACzCC,OAAO,GAAGD,qBAAqB,CAAC,MAAM,EAAP,CAArC;MACAnE,OAAO,CAAC1F,GAAR,CAAY,qBAAZ,EAAmC;QAAE0J;OAArC;;UACI;cACIC,QAAQ,EAAd;OADF,CAEE,OAAOxG,GAAP,EAAY;QACZuC,OAAO,CAAC1F,GAAR,CAAY,+BAAZ,EAA6C;UAAE0J;SAA/C;QACAI,OAAO;QACPF,MAAM,CAACzG,GAAD,CAAN;;;;MAGFuC,OAAO,CAAC1F,GAAR,CAAY,kBAAZ,EAAgC;QAAE0J;OAAlC;MACAI,OAAO;MACPnF,OAAO;KAbL,CAAJ;GAFF,CAJF;;QAuBMxC,UAAU,GAAG,CAACrD,OAAD,EAAwBE,EAAxB,KAA8C;QAC3D,CAACA,EAAL,EAAS,MAAM,IAAI+K,KAAJ,CAAU,6BAAV,CAAN;IACTjL,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAiB,YAAjB,EAA+BjB,EAA/B;IACAgL,UAAU,CAAC,MAAM;MACfP,WAAW,CAAC,YAAD,EAAe,MAAM;eACvBA,WAAW,CAACQ,MAAM,CAACjL,EAAE,CAACkB,EAAJ,CAAP,EAAgB,YAAY;gBACtC2B,QAAQ,GAAG,MAAM/C,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqBC,GAArB,CACrBjD,OAAO,CAACM,IAAR,CAAa;YACX4C,WAAW,EAAEhD,EAAE,CAAC+B;WADlB,CADqB,CAAvB;gBAKMN,mBAAmB,CAAC3B,OAAD,EAAUC,WAAV,EAAuB8C,QAAQ,CAACnC,IAAhC,CAAzB;SANgB,CAAlB;OADS,CAAX;KADQ,EAWP,IAXO,CAAV;GAHF;;SAiBOgE,MAAM,CAACoB,MAAP,CAAc/F,WAAd,EAA2B;IAChC9C,MADgC;IAEhCiN,iBAFgC;IAGhC7H,cAAc,EA9DQpF,MAAD,IACrBA,MAAM,CAAC2L,IAAP,CAAanK,KAAD,IAAWoL,mBAAmB,CAAClB,QAApB,CAA6BlK,KAAK,CAACyC,EAAnC,CAAvB,CA0DgC;IAIhCoB,kBAAkB,EA7DQrF,MAAD,IACzBA,MAAM,CAAC2L,IAAP,CAAanK,KAAD,IAAWsL,uBAAuB,CAACpB,QAAxB,CAAiClK,KAAK,CAACyC,EAAvC,CAAvB,CAwDgC;IAKhCgK,yBAAyB,EA5DQjO,MAAD,IAChCA,MAAM,CAAC2L,IAAP,CAAanK,KAAD,IAAWuL,wBAAwB,CAACrB,QAAzB,CAAkClK,KAAK,CAACyC,EAAxC,CAAvB,CAsDgC;IAMhCiK,iBAAiB,EA3DQlO,MAAD,IACxBA,MAAM,CAAC2L,IAAP,CAAanK,KAAD,IAAWwL,sBAAsB,CAACtB,QAAvB,CAAgClK,KAAK,CAACyC,EAAtC,CAAvB,CAoDgC;IAOhCkK,wBAAwB,EAzDQnO,MAAD,IAC/BA,MAAM,CACH2D,MADH,CACWnC,KAAD,IAAWoL,mBAAmB,CAAClB,QAApB,CAA6BlK,KAAK,CAACyC,EAAnC,CADrB,EAEG9C,GAFH,CAEQK,KAAD,IAAW0L,kBAAkB,CAACpH,GAAnB,CAAuBtE,KAAK,CAACyC,EAA7B,CAFlB,EAGGN,MAHH,CAGU0E,eAHV,CAiDgC;IAShC9C,gBAAgB,EAAE,MAAM+H,WATQ;IAUhC7H,cAAc,EAAG1C,EAAD,IAA6B;MAC3C0G,OAAO,CAAC1F,GAAR,CAAY,kBAAZ,EAAgChB,EAAhC;;UACIuK,WAAW,IAAIU,MAAM,CAACV,WAAW,CAACxI,MAAb,CAAN,KAA+BkJ,MAAM,CAACjL,EAAE,CAAC+B,MAAJ,CAAxD,EAAqE;;;;UAGjEwI,WAAJ,EAAiB,MAAM,IAAIQ,KAAJ,CAAU,mBAAV,CAAN;MACjBR,WAAW,GAAGvK,EAAd;KAhB8B;IAkBhCoC,0BAA0B,EAAE,CAACtC,OAAD,EAAUuL,QAAV,KAA8C;MACxEvL,OAAO,CAACkB,GAAR,CAAY,oBAAZ,EAAkC;QAAEqK;OAApC;;UACId,WAAW,IAAIU,MAAM,CAACV,WAAW,CAACxI,MAAb,CAAN,KAA+BkJ,MAAM,CAACI,QAAD,CAAxD,EAAoE;QAClEd,WAAW,GAAGC,cAAc,CAACc,KAAf,EAAd;QACAxL,OAAO,CAACkB,GAAR,CAAY,kBAAZ,EAAgC;UAAEuJ;SAAlC;;YACIA,WAAJ,EAAiB;UACfpH,UAAU,CAACrD,OAAD,EAAUyK,WAAV,CAAV;;OAJJ,MAMO;QACLC,cAAc,GAAGA,cAAc,CAAC5J,MAAf,CACd2K,KAAD,IAAWN,MAAM,CAACM,KAAK,CAACxJ,MAAP,CAAN,KAAyBkJ,MAAM,CAACI,QAAD,CAD3B,CAAjB;;KA3B4B;IAgChC5I,kBAAkB,EAAGzC,EAAD,IAA6B;MAC/C0G,OAAO,CAAC1F,GAAR,CAAY,wBAAZ,EAAsC;QACpChB,EADoC;QAEpCuK,WAFoC;QAGpCC;OAHF;;UAKI,CAACA,cAAc,CAAC5B,IAAf,CAAqB4C,CAAD,IAAOA,CAAC,CAACzJ,MAAF,KAAa/B,EAAE,CAAC+B,MAA3C,CAAL,EAAyD;QACvDyI,cAAc,CAAC1C,IAAf,CAAoB9H,EAApB;;KAvC4B;IA0ChCmD,UA1CgC;IA4ChCsH;GA5CK,CAAP;;;AAgDF,MAAMgB,mBAAmB,GAAG,IAAIzE,GAAJ,EAA5B;AACA,MAAM0E,YAAY,GAAG,IAAI1E,GAAJ,EAArB;AAEA,AAAO,MAAM2E,iBAAiB,GAC5B7L,OAD+B,IAEe;QACxCM,IAAI,GAAGN,OAAO,CAAC4B,OAAR,CAAgBwH,UAA7B;;MAEE9I,IAAI,CAAC/C,IAAL,KAAc,iBAAd,IACAhD,OAAO,CAACC,GAAR,CAAYsR,IAAZ,KAAqB,iBAFvB,EAGE;WACO,IAAP;;;QAEIjI,KAAK,GAAGvD,IAAI,CAACuD,KAAnB;;MACI,CAAC3F,WAAW,CAAC2F,KAAK,CAACC,KAAP,CAAhB,EAA+B;IAC7B8C,OAAO,CAACC,IAAR,CAAahD,KAAK,CAACC,KAAnB,EAA0Bc,MAAM,CAACW,IAAP,CAAYrH,WAAZ,CAA1B;WACO,IAAP;;;QAEI8L,GAAG,GAAG1J,IAAI,CAACc,EAAjB;QAEM2K,mBAAmB,GAAGH,YAAY,CAAC3I,GAAb,CAAiB+G,GAAjB,CAA5B;MACI+B,mBAAJ,EAAyB,OAAOA,mBAAP;QAEnBzC,eAAe,GAAGqC,mBAAmB,CAAC1I,GAApB,CAAwB+G,GAAxB,CAAxB;MACIV,eAAJ,EAAqB,OAAO1D,OAAO,CAACC,OAAR,CAAgByD,eAAhB,CAAP;QAEfC,OAAO,GAAGI,eAAe,CAAC3J,OAAD,EAAU9B,WAAW,CAAC2F,KAAK,CAACC,KAAP,CAArB,CAA/B;EACA6H,mBAAmB,CAAC/D,GAApB,CAAwBoC,GAAxB,EAA6BT,OAA7B;SAEOA,OAAO,CAACC,IAAR,CAAcvJ,WAAD,IAAiB;IACnC0L,mBAAmB,CAACjC,MAApB,CAA2BM,GAA3B;IACA4B,YAAY,CAAChE,GAAb,CAAiBoC,GAAjB,EAAsB/J,WAAtB;WACOA,WAAP;GAHK,CAAP;CA1BK;;AC/LA,MAAM+L,wBAAwB,GAAG,OAGtChM,OAHsC,EAItC6K,QAJsC,KAKpB;QACZ5K,WAAW,GAAG,MAAM4L,iBAAiB,CAAC7L,OAAD,CAA3C;MACI,CAACC,WAAL,EAAkB;EAElBA,WAAW,CAAC0K,WAAZ,CAAwBQ,MAAM,CAACnL,OAAO,CAAC4B,OAAR,CAAgBC,YAAhB,CAA6BT,EAA9B,CAA9B,EAAiE,YAAY;UACrEyJ,QAAQ,CAAC5K,WAAD,CAAd;GADF;CATK;AAmBP,AAAO,MAAMgM,8BAA8B,GAGzCpB,QAH4C,IAIxC7K,OAAD,IAAyB;SACrBgM,wBAAwB,CAAChM,OAAD,EAAWC,WAAD,IACvC4K,QAAQ,CAAC7K,OAAD,EAAUC,WAAV,CADqB,CAA/B;CALK;AAUP,AAAO,MAAMiM,+BAA+B,GAAG,CAC7CC,eAD6C,EAK7CtB,QAL6C,KAM1C,MAAO7K,OAAP,IAA8C;QAC3CC,WAAW,GAAG,MAAM4L,iBAAiB,CAAC7L,OAAD,CAA3C;MACI,CAACC,WAAL,EAAkB;QAEZmM,GAAG,GAAGD,eAAe,CAACnM,OAAD,EAAUC,WAAV,CAA3B;MACImM,GAAG,CAACnL,MAAJ,KAAe,CAAnB,EAAsB;SACfhB,WAAW,CAAC0K,WAAZ,CAAwByB,GAAG,CAAC9N,GAAJ,CAAS4B,EAAD,IAAQiL,MAAM,CAACjL,EAAE,CAACkB,EAAJ,CAAtB,CAAxB,EAAwD,MAC7DyJ,QAAQ,CAAC7K,OAAD,EAAUC,WAAV,CADH,CAAP;CAZK;;ACvCA,MAAMoM,qBAEZ,GAAG,OAAOrM,OAAP,EAAgBC,WAAhB,KAAgC;MAC9B,CAACA,WAAW,CAAC5F,MAAZ,CAAmBK,mBAAxB,EAA6C;QAEvCwF,EAAE,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAA3B;MACI3B,EAAE,CAACoM,SAAH,CAAarL,MAAb,KAAwB,CAA5B,EAA+B;MAC3Bf,EAAE,CAACwG,IAAH,CAAQ6F,IAAR,KAAiB,KAArB,EAA4B;QAEtBvM,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBiJ,YAAtB,CACJxM,OAAO,CAACrE,KAAR,CAAc;IACZ2Q,SAAS,EAAE,CAACpM,EAAE,CAACwG,IAAH,CAAQ5C,KAAT;GADb,CADI,CAAN;CATK;;ACHA,MAAM2I,UAAU,GAAItR,KAAD,IACxBA,KAAK,CACFuR,IADH,GAEGhJ,OAFH,CAEW,oCAFX,EAEiD,SAFjD,EAGGA,OAHH,CAGW,qBAHX,EAGkC,CAACiJ,CAAD,EAAIC,IAAJ,KAAc,GAAEA,IAAI,CAACC,WAAL,EAAmB,IAHrE,EAIGnJ,OAJH,CAIW,oBAJX,EAIiC,YAJjC;CAMGA,OANH,CAMW,4BANX,EAMyC,IANzC,CADK;;ACIP,MAAMoJ,iBAAiB,GAAI1O,OAAD,IAAuC;SACxDM,aAAa,CACjBJ,GADI,CAEH,CAAC;IAAEf,IAAF;IAAQoB;GAAT,KACG,MAAKP,OAAO,CAACb,IAAD,CAAP,GAAgB,GAAhB,GAAsB,GAAI,qBAAoBA,IAAK,OAAMoB,KAAM,EAHpE,EAKJoO,IALI,CAKC,IALD,CAAP;CADF;;AASA,MAAMC,eAAe,GAAIC,KAAD,IAAyB;SACxCA,KAAK,CACT3O,GADI,CACC6C,IAAD,IAAU;QACTA,IAAI,CAACtF,GAAT,EAAc,OAAQ,IAAGsF,IAAI,CAAChG,KAAM,KAAIgG,IAAI,CAACtF,GAAI,GAAnC;WACPsF,IAAI,CAAChG,KAAZ;GAHG,EAKJ4R,IALI,CAKC,IALD,CAAP;CADF;;AAcA,AAAO,MAAMG,UAAU,GAAG,CACxBzJ,IADwB,EAExBvE,aAFwB,EAGxB+N,KAHwB,EAIxBE,aAJwB,KAKG;QACrBC,MAAM,GAAG9N,SAAS,CAACmE,IAAD,EAAOvE,aAAP,CAAxB;;MACI,CAACkO,MAAL,EAAa;IACXxG,OAAO,CAACzF,IAAR,CAAa,sBAAb;WACO;MAAEsC;KAAT;;;QAEI;IACJxE,OADI;IAEJS,MAFI;IAGJE,oBAHI;IAIJC,0BAJI;IAKJC,0BALI;IAMJ1B;MACEgP,MAPJ,CAN2B;;QAgBrBC,cAAc,GAAG,CAACJ,KAAD,GACnBrN,oBAAoB,CAAC8D,OAArB;8CAAA,EAGE,IAHF,CADmB,GAMnBuJ,KAAK,CAAChM,MAAN,KAAiB,CAAjB,GACC,gBAAe+L,eAAe,CAACC,KAAD,CAAQ,IADvC,GAEA,EARJ;QAUMK,cAAc,GAAG,CAACH,aAAD,GACnB/O,OADmB,GAEnB,EAAE,GAAGA,OAAL;OAAiB+O;GAFrB;SAIO;IACL/O,OAAO,EAAEkP,cADJ;IAEL7J,IAAI,EAAG,GAAExE,OAAQ,GAAEY,0BAA2B;EAChDwN,cAAe;EACfP,iBAAiB,CAACQ,cAAD,CAAiB;EAClCxN,0BAA2B,GAAEJ,MAAM,IAAI,EAAG;GAL1C;CAnCK;;ACLP,MAAM8F,eAAa,GAAIpB,OAAvB;AAIA,AAAO,MAAMmJ,YAAY,GAAG,OAC1BvN,OAD0B,EAE1BC,WAF0B,KAGR;QACZK,IAAI,GAAGN,OAAO,CAAC4B,OAAR,CAAgBwH,UAA7B;QACMlJ,EAAE,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAA3B,CAFkB;;MAKd3B,EAAE,CAACM,IAAH,CAAQF,IAAR,CAAac,EAAb,KAAoBd,IAAI,CAACc,EAA7B,EAAiC;QAE3BjG,KAAK,GAAG8E,WAAW,CAAC5F,MAAZ,CAAmBM,SAAnB,GAA+B8R,UAAU,CAACvM,EAAE,CAAC/E,KAAJ,CAAzC,GAAsD+E,EAAE,CAAC/E,KAAvE;QAEMqS,WAAW,GAAGtN,EAAE,CAACwG,IAAH,CAAQ6F,IAAR,KAAiB,KAArC;QAEM7K,QAAkB,GAAG,EAA3B;QAEM+L,SAAS,GAAGxN,WAAW,CAAC5F,MAAZ,CAAmBa,OAAnB,CAA2BC,KAA3B,CAAiCgH,IAAjC,CAAuCuL,IAAD,IAAU;QAC5DA,IAAI,CAACnS,GAAL,KAAa,KAAb,IAAsBiS,WAA1B,EAAuC,OAAO,KAAP;UAEjC9R,KAAK,GAAGgS,IAAI,CAACtS,MAAL,CAAYiE,IAAZ,CAAiBa,EAAE,CAAC/E,KAApB,CAAd;;QACIO,KAAK,KAAK,IAAd,EAAoB;UACdgS,IAAI,CAAClS,MAAT,EAAiB;QACfkG,QAAQ,CAACsG,IAAT,CAAc;UAAEzK,IAAI,EAAEmQ,IAAI,CAAClS,MAAb;UAAqBH,KAAK,EAAEqS,IAAI,CAACrS;SAA/C;;;aAEK,IAAP;;;QAGEqS,IAAI,CAAClS,MAAL,IAAekS,IAAI,CAACjS,mBAAxB,EAA6C;MAC3CiG,QAAQ,CAACsG,IAAT,CAAc;QACZzK,IAAI,EAAEmQ,IAAI,CAAClS,MADC;QAEZ2F,IAAI,EAAEuM,IAAI,CAACjS,mBAAL,CAAyBC,KAAzB;OAFR;aAIO,KAAP;;;WAGK,KAAP;GAnBgB,CAAlB;QAsBMiS,IAAI,GAAG,IAAIC,IAAJ,GAAWC,WAAX,EAAb;QAEMC,cAAc,GAAG,CAAC,MAAM9N,OAAO,CAACI,MAAR,CAAeD,MAAf,CAAsBE,UAAtB,CAC5BL,OAAO,CAACM,IAAR,CAAa;IACXC,GAAG,EAAEL,EAAE,CAACM,IAAH,CAAQC;GADf,CAD4B,CAAP,EAIpBG,IAJoB,CAIfC,UAJe,CAIJsB,IAJI,CAKpBpB,KAAD,IAAWA,KAAK,CAACxD,IAAN,KAAgB,GAAEhD,OAAO,CAACC,GAAR,CAAYsR,IAAK,UALzB,CAAvB;QAQMlG,OAAO,CAACiE,GAAR,CACJ,CACE,GAAGnI,QAAQ,CAACpD,GAAT,CAAa,CAAC;IAAEf,IAAF;IAAQlC,KAAR;IAAe8F;GAAhB,KACdnB,OAAO,CAACI,MAAR,CAAekB,KAAf,CAAqByM,YAArB,CACE/N,OAAO,CAACM,IAAR,CAAa;IACXN,OAAO,EAAG,GAAEzF,OAAO,CAACC,GAAR,CAAYsR,IAAK,IAAGvO,IAAK,EAD1B;IAEXkD,GAAG,EAAEP,EAAE,CAACM,IAAH,CAAQC,GAFF;IAGXe,KAAK,EAAGnG,KAAK,GAAG,SAAH,GAAe,SAHjB;IAIX2S,UAAU,EAAE3S,KAAK,GAAGyH,SAAH,GAAgB3B,IAAD,CAAqBtF,GAJ1C;IAKX0D,WAAW,EAAElE,KAAK,GAAGA,KAAK,CAACF,KAAT,GAAkBgG,IAAD,CAAqBhG;GAL1D,CADF,CADC,CADL,EAYE2S,cAAc,IACZ9N,OAAO,CAACI,MAAR,CAAeD,MAAf,CAAsByJ,MAAtB,CACE5J,OAAO,CAACM,IAAR,CAAa;IACX/C,IAAI,EAAG,GAAEhD,OAAO,CAACC,GAAR,CAAYsR,IAAK,UADf;IAEXmC,QAAQ,EAAE/N,EAAE,CAACM,IAAH,CAAQC,GAFP;IAGXjF,MAAM,EAAE,WAHG;IAIXwF,UAAU,EAAGyM,SAAS,GAAG,SAAH,GAAe,SAJ1B;IAOXS,UAAU,EAAEP,IAPD;IAQXQ,YAAY,EAAER,IARH;IASXS,MAAM,EAAEX,SAAS,GACbA,SAAS,CAACpS,KADG,GAEb;MACEF,KAAK,EAAE,oBADT;MAEEG,OAAO,EAAE;;GAbjB,CADF,CAbJ,EA+BE,CAACwS,cAAD,IACE9N,OAAO,CAACI,MAAR,CAAekB,KAAf,CAAqByM,YAArB,CACE/N,OAAO,CAACM,IAAR,CAAa;IACXN,OAAO,EAAG,GAAEzF,OAAO,CAACC,GAAR,CAAYsR,IAAK,UADlB;IAEXrL,GAAG,EAAEP,EAAE,CAACM,IAAH,CAAQC,GAFF;IAGXe,KAAK,EAAGiM,SAAS,GAAG,SAAH,GAAe,SAHrB;IAIXO,UAAU,EAAElL,SAJD;IAKXvD,WAAW,EAAEkO,SAAS,GAClBA,SAAS,CAACpS,KAAV,CAAgBF,KADE,GAElB;GAPN,CADF,CAhCJ,EA2CE2F,MA3CF,CA2CS0E,eA3CT,CADI,CAAN;QA+CM6I,kBAAkB,GAAGpO,WAAW,CAAC9C,MAAZ,CAAmB,gBAAnB,CAA3B;QACMmR,cAAc,GAAGrO,WAAW,CAAC9C,MAAZ,CAAmB,iBAAnB,CAAvB;QAEMoR,uBAAuB,GAAGnK,OAAO,CACrCiK,kBAAkB,IAChBnO,EAAE,CAAC/C,MAAH,CAAUgF,IAAV,CAAgBxD,KAAD,IAAoBA,KAAK,CAACyC,EAAN,KAAaiN,kBAAkB,CAACjN,EAAnE,CAFmC,CAAvC;QAKMoN,mBAAmB,GAAGpK,OAAO,CACjCkK,cAAc,IACZpO,EAAE,CAAC/C,MAAH,CAAUgF,IAAV,CAAgBxD,KAAD,IAAoBA,KAAK,CAACyC,EAAN,KAAakN,cAAc,CAAClN,EAA/D,CAF+B,CAAnC;QAKMqN,cAAc,GAAG,EACrB,GAAGxO,WAAW,CAAC5F,MAAZ,CAAmBQ,gBADD;IAErBG,SAAS,EAAEwT,mBAFU;IAGrB1T,aAAa,EAAEyT;GAHjB;QAMM;IAAE9K,IAAF;IAAQrF;MAAY8O,UAAU,CAAChN,EAAE,CAACuD,IAAJ,EAAUgL,cAAV,EAA0B/M,QAAQ,CACnEZ,MAD2D,CACnDtF,MAAD,IAAYA,MAAM,CAAC2F,IAAP,IAAe3F,MAAM,CAAC2F,IAAP,CAAYvF,MADa,EAE3D0C,GAF2D,CAEtD9C,MAAD,IAAYA,MAAM,CAAC2F,IAFoC,CAA1B,CAApC;QAIMuN,cAAc,GAAGxO,EAAE,CAAC/E,KAAH,KAAaA,KAApC;QACMwT,aAAa,GAAGzO,EAAE,CAACuD,IAAH,KAAYA,IAAlC;;MACIiL,cAAc,IAAIC,aAAtB,EAAqC;UAC7BnL,MAAiD,GAAG,EAA1D;;QACIkL,cAAJ,EAAoB;MAClBlL,MAAM,CAACrI,KAAP,GAAeA,KAAf;MACA+E,EAAE,CAAC/E,KAAH,GAAWA,KAAX;;;QAEEwT,aAAJ,EAAmB;MACjBnL,MAAM,CAACC,IAAP,GAAcA,IAAd;MACAvD,EAAE,CAACuD,IAAH,GAAUA,IAAV;;;UAGIzD,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBC,MAAtB,CAA6BxD,OAAO,CAACrE,KAAR,CAAc6H,MAAd,CAA7B,CAAN;;;MAGEpF,OAAO,KAAKiQ,kBAAkB,IAAIC,cAA3B,CAAX,EAAuD;QACjDD,kBAAJ,EAAwB;UAClBE,uBAAuB,IAAI,CAACnQ,OAAO,CAACtD,aAAxC,EAAuD;cAC/CkF,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBqL,WAAtB,CACJ5O,OAAO,CAACrE,KAAR,CAAc;UAAE4B,IAAI,EAAE8Q,kBAAkB,CAAC9Q;SAAzC,CADI,CAAN;;;UAIEa,OAAO,CAACtD,aAAR,IAAyB,CAACyT,uBAA9B,EAAuD;cAC/CvO,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBsL,SAAtB,CACJ7O,OAAO,CAACrE,KAAR,CAAc;UAAEwB,MAAM,EAAE,CAACkR,kBAAkB,CAAC9Q,IAApB;SAAxB,CADI,CAAN;;;;QAMA+Q,cAAJ,EAAoB;UACdE,mBAAmB,IAAI,CAACpQ,OAAO,CAACpD,SAApC,EAA+C;cACvCgF,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBqL,WAAtB,CACJ5O,OAAO,CAACrE,KAAR,CAAc;UAAE4B,IAAI,EAAE+Q,cAAc,CAAC/Q;SAArC,CADI,CAAN;;;UAIEa,OAAO,CAACpD,SAAR,IAAqB,CAACwT,mBAA1B,EAA+C;cACvCvJ,MAAM,GAAG,MAAMjF,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBsL,SAAtB,CACnB7O,OAAO,CAACrE,KAAR,CAAc;UAAEwB,MAAM,EAAE,CAACmR,cAAc,CAAC/Q,IAAhB;SAAxB,CADmB,CAArB;cAGMoE,mBAAmB,CACvB3B,OADuB,EAEvBC,WAFuB,EAGvBD,OAAO,CAAC4B,OAAR,CAAgBC,YAHO,EAIvBoD,MAAM,CAACrE,IAJgB,CAAzB;;;;CA9JD;;ACrBP,MAAMkO,cAAc,GAAG,gBAGrB9O,OAHqB,EAIrBE,EAJqB,EAKrB;EAAEsB,KAAF;EAASjC;CALY,EAMN;QACTwP,UAAU,GAAG,CAAC,MAAM/O,OAAO,CAACI,MAAR,CAAeD,MAAf,CAAsBE,UAAtB,CACxBL,OAAO,CAACM,IAAR,CAAa;IACXC,GAAG,EAAEL,EAAE,CAACM,IAAH,CAAQC;GADf,CADwB,CAAP,EAIhBG,IAJgB,CAIXC,UAJW,CAIAsB,IAJA,CAIMpB,KAAD,IAAWA,KAAK,CAACxD,IAAN,KAAehD,OAAO,CAACC,GAAR,CAAYsR,IAJ3C,CAAnB;EAMA9L,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAiB,kBAAjB,EAAqC;IAAE4N,UAAF;IAAcvN,KAAd;IAAqBjC;GAA1D;;MAEIwP,UAAJ,EAAgB;UACR/O,OAAO,CAACI,MAAR,CAAeD,MAAf,CAAsByJ,MAAtB,CACJ5J,OAAO,CAACM,IAAR,CAAa;MACX/C,IAAI,EAAEhD,OAAO,CAACC,GAAR,CAAYsR,IADP;MAEXmC,QAAQ,EAAE/N,EAAE,CAACM,IAAH,CAAQC,GAFP;MAGXyN,UAAU,EAAEhO,EAAE,CAAC8O,UAHJ;MAIXxT,MAAM,EAAE,WAJG;MAKXwF,UAAU,EAAEQ,KALD;MAMX2M,YAAY,EAAE,IAAIP,IAAJ,GAAWC,WAAX,EANH;MAOXO,MAAM,EAAE;QACNjT,KAAK,EAAEoE,WADD;QAENjE,OAAO,EAAE;;KATb,CADI,CAAN;GADF,MAeO;UACC0E,OAAO,CAACI,MAAR,CAAekB,KAAf,CAAqByM,YAArB,CACJ/N,OAAO,CAACM,IAAR,CAAa;MACXN,OAAO,EAAEzF,OAAO,CAACC,GAAR,CAAYsR,IADV;MAEXrL,GAAG,EAAEP,EAAE,CAACM,IAAH,CAAQC,GAFF;MAGXe,KAHW;MAIXwM,UAAU,EAAElL,SAJD;MAKXvD;KALF,CADI,CAAN;;CA/BJ;;AA2CA,MAAM0P,uBAAuB,GAAG,CAC9BjP,OAD8B,EAE9BE,EAF8B,EAG9BX,WAH8B,KAK9BuP,cAAc,CAAC9O,OAAD,EAAUE,EAAV,EAAc;EAC1BsB,KAAK,EAAE,SADmB;EAE1BjC;CAFY,CALhB;;AAUA,AAAO,MAAM2P,2BAA2B,GAAG,CACzClP,OADyC,EAEzCC,WAFyC,EAGzCC,EAAO,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAHe,EAIzC1E,MAAuB,GAAG+C,EAAE,CAAC/C,MAAH,IAAa,EAJE,KAKvB;EAClB6C,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAiB,6BAAjB,EAAgD;IAC9ChE,MAAM,EAAEA,MAAM,CAACmB,GAAP,CAAY8D,CAAD,IAAOA,CAAC,IAAIA,CAAC,CAAC7E,IAAzB,CADsC;IAE9CgF,cAAc,EAAEtC,WAAW,CAACsC,cAAZ,CAA2BpF,MAA3B,CAF8B;IAG9CkO,iBAAiB,EAAEpL,WAAW,CAACoL,iBAAZ,CAA8BlO,MAA9B;GAHrB;;MAMI+C,EAAE,CAACiP,mBAAH,CAAuBlO,MAAvB,KAAkC,CAAtC,EAAyC;WAChCgO,uBAAuB,CAC5BjP,OAD4B,EAE5BE,EAF4B,EAG3B,yBAAwBA,EAAE,CAACiP,mBAAH,CACtB7Q,GADsB,CACjB8Q,EAAD,IAAaA,EAAE,CAACtL,KADE,EAEtBiJ,IAFsB,CAEjB,IAFiB,CAEX,EALc,CAA9B;;;MASE9M,WAAW,CAACmL,yBAAZ,CAAsCjO,MAAtC,CAAJ,EAAmD;WAC1C8R,uBAAuB,CAC5BjP,OAD4B,EAE5BE,EAF4B,EAG5B,+EAH4B,CAA9B;;;QAOImP,qBAAqB,GAAGpP,WAAW,CAACqL,wBAAZ,CAAqCnO,MAArC,CAA9B;;MAEIkS,qBAAqB,CAACpO,MAAtB,KAAiC,CAArC,EAAwC;WAC/BgO,uBAAuB,CAC5BjP,OAD4B,EAE5BE,EAF4B,EAG3B,yBAAwBmP,qBAAqB,CAACtC,IAAtB,CACvB,IADuB,CAEvB,6BAL0B,CAA9B;;;MASE,CAAC9M,WAAW,CAACoL,iBAAZ,CAA8BlO,MAA9B,CAAL,EAA4C;QACtC8C,WAAW,CAAC5F,MAAZ,CAAmBO,qBAAvB,EAA8C;aACrCqU,uBAAuB,CAC5BjP,OAD4B,EAE5BE,EAF4B,EAG5B,8CAH4B,CAA9B;;GAvCc;;;;;;;;;;;;;;;SA4DX4O,cAAc,CAAC9O,OAAD,EAAUE,EAAV,EAAc;IACjCsB,KAAK,EAAE,SAD0B;IAEjCjC,WAAW,EAAE;GAFM,CAArB,CA5DkB;CALb;;ACnDA,MAAM+P,kBAAkB,GAAG,OAIhCtP,OAJgC,EAKhCC,WALgC,EAMhCsP,WANgC,EAOhC;EACEC,GAAG,EAAEC,WADP;EAEEC,MAAM,EAAEC;CATsB,KAcH;EAC7B3P,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAiB,oBAAjB,EAAuC;IACrCoO,WADqC;IAErCE,WAFqC;IAGrCE;GAHF;QAMMzP,EAAE,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAA3B;MACIC,QAAyB,GAAG5B,EAAE,CAAC/C,MAAH,IAAa,EAA7C;MACI,CAACoS,WAAL,EAAkB,OAAOzN,QAAP;QAEZ8N,aAAa,GAAG,IAAIzH,GAAJ,CACpBrG,QAAQ,CAACxD,GAAT,CAAcK,KAAD,IAA0BA,KAAK,CAACpB,IAA7C,CADoB,CAAtB;QAIMsS,KAAK,GAAG,IAAI1H,GAAJ,EAAd;QACM2H,QAAQ,GAAG,IAAI3H,GAAJ,EAAjB;QACMhL,MAAM,GAAG8C,WAAW,CAAC9C,MAA3B;;QAEM4S,eAAe,GAAI/F,GAAD,IAAiD;UACjEgG,YAAY,GAAG/P,WAAW,CAAC5F,MAAZ,CAAmB8C,MAAnB,CAA0BM,MAA1B,CAAiC8R,WAAjC,CAArB;QACI,CAACS,YAAL,EAAmB,OAAOlN,SAAP;WAEZkN,YAAY,CAAChG,GAAD,CAAZ,IAAqB7M,MAAM,CAAC6S,YAAY,CAAChG,GAAD,CAAb,CAA3B,GACH7M,MAAM,CAAC6S,YAAY,CAAChG,GAAD,CAAb,CADH,GAEHlH,SAFJ;GAJF;;MASI2M,WAAJ,EAAiB;IACfA,WAAW,CAAC9H,OAAZ,CAAqBqC,GAAD,IAAS;UACvB,CAACA,GAAL,EAAU;YACJrL,KAAK,GAAGoR,eAAe,CAAC/F,GAAD,CAA7B;;UACI,CAACrL,KAAD,IAAUmD,QAAQ,CAACgH,IAAT,CAAemH,OAAD,IAAaA,OAAO,CAAC7O,EAAR,KAAezC,KAAK,CAACyC,EAAhD,CAAd,EAAmE;;;;MAGnEwO,aAAa,CAACJ,GAAd,CAAkB7Q,KAAK,CAACpB,IAAxB;MACAsS,KAAK,CAACL,GAAN,CAAUxF,GAAV;KAPF;;;MAWE2F,cAAJ,EAAoB;IAClBA,cAAc,CAAChI,OAAf,CAAwBqC,GAAD,IAAS;UAC1B,CAACA,GAAL,EAAU;YACJrL,KAAK,GAAGoR,eAAe,CAAC/F,GAAD,CAA7B;UACI,CAACrL,KAAL,EAAY;YACNuR,QAAQ,GAAGpO,QAAQ,CAACK,IAAT,CAAe8N,OAAD,IAAaA,OAAO,CAAC7O,EAAR,KAAezC,KAAK,CAACyC,EAAhD,CAAjB;;UACI8O,QAAJ,EAAc;QACZN,aAAa,CAAClG,MAAd,CAAqBwG,QAAQ,CAAC3S,IAA9B;QACAuS,QAAQ,CAACN,GAAT,CAAaxF,GAAb;;KAPJ;GAzC2B;;;EAuD7B/J,WAAW,CAACoI,gBAAZ,CAA6BnI,EAAE,CAACwG,IAAH,CAAQ5C,KAArC,EAA4C6D,OAA5C,CAAqDG,QAAD,IAAc;UAC1DqI,IAAI,GAAGlQ,WAAW,CAAC5F,MAAZ,CAAmB2C,KAAnB,CAAyB8K,QAAzB,CAAb;;QACIqI,IAAI,CAAChT,MAAT,EAAiB;MACfgT,IAAI,CAAChT,MAAL,CAAYwK,OAAZ,CAAqBjD,QAAD,IAAc;cAC1B/F,KAAK,GAAGsB,WAAW,CAAC9C,MAAZ,CAAmBuH,QAAnB,CAAd;;YACI/F,KAAK,IAAI,CAACmD,QAAQ,CAACgH,IAAT,CAAemH,OAAD,IAAaA,OAAO,CAAC7O,EAAR,KAAezC,KAAK,CAACyC,EAAhD,CAAd,EAAmE;UACjEwO,aAAa,CAACJ,GAAd,CAAkB7Q,KAAK,CAACpB,IAAxB;UACAsS,KAAK,CAACL,GAAN,CAAU9K,QAAV;;OAJJ;;GAHJ;QAaM0L,kBAAkB,GAAG,CAAC,GAAGR,aAAJ,CAA3B;EAEA5P,OAAO,CAACkB,GAAR,CAAYC,IAAZ,CAAiB,oBAAjB,EAAuC;IACrCoO,WADqC;IAErCM,KAAK,EAAE,CAAC,GAAGA,KAAJ,CAF8B;IAGrCC,QAAQ,EAAE,CAAC,GAAGA,QAAJ,CAH2B;IAIrCO,SAAS,EAAEvO,QAAQ,CAACxD,GAAT,CAAc8D,CAAD,IAAsBA,CAAC,CAAC7E,IAArC,CAJ0B;IAKrCqS,aAAa,EAAEQ;GALjB,EAtE6B;;MAgFzBP,KAAK,CAACS,IAAN,IAAcR,QAAQ,CAACQ,IAA3B,EAAiC;UACzBrL,MAAM,GAAG,MAAMjF,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBgN,aAAtB,CACnBvQ,OAAO,CAACrE,KAAR,CAAc;MACZwB,MAAM,EAAEiT;KADV,CADmB,CAArB;IAKAtO,QAAQ,GAAGmD,MAAM,CAACrE,IAAlB;GAtF2B;;;;;;;;QA+FvBsO,2BAA2B,CAAClP,OAAD,EAAUC,WAAV,EAAuBC,EAAvB,EAA2B4B,QAA3B,CAAjC,CA/F6B;;SAkGtBA,QAAP;CAhHK;;ACFA,MAAM0O,uBAAuB,GAAG,OACrCxQ,OADqC,EAErCC,WAFqC,KAGnB;;QAEZwQ,iBAAiB,GAAGxQ,WAAW,CAAC9C,MAAZ,CAAmB,eAAnB,CAA1B;QACM2E,QAAQ,GAAG9B,OAAO,CAAC4B,OAAR,CAAgBC,YAAhB,CAA6B1E,MAA9C;;MACI2E,QAAQ,CAACK,IAAT,CAAeC,CAAD,IAAgBA,CAAC,CAAChB,EAAF,KAASqP,iBAAiB,CAACrP,EAAzD,CAAJ,EAAkE;UAC1DpB,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqB0N,YAArB,CACJ1Q,OAAO,CAACrE,KAAR,CAAc;MAAEgV,KAAK,EAAE;KAAvB,CADI,CAAN;;;QAKIhP,mBAAmB,CAAC3B,OAAD,EAAUC,WAAV,CAAzB;CAbK;;ACEQ,SAAS2Q,MAAT,CAAgBC,GAAhB,EAAwC;EACrDA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEE7E,8BAA8B,CAC5B,OAAOjM,OAAP,EAAgBC,WAAhB,KAA+C;UACvC8Q,YAAY,GAAG/Q,OAAO,CAAC4B,OAAR,CAAgBC,YAAhB,CAA6BrB,IAA7B,CAAkCD,GAAlC,CAAsC+C,UAAtC,CACnB,WADmB,CAArB;UAIMsC,OAAO,CAACiE,GAAR,CAAqB,CACzBwC,qBAAqB,CAACrM,OAAD,EAAUC,WAAV,CADI,EAEzBsN,YAAY,CAACvN,OAAD,EAAUC,WAAV,CAFa,EAGzB8Q,YAAY,GACRP,uBAAuB,CAACxQ,OAAD,EAAUC,WAAV,CADf,GAERqP,kBAAkB,CAACtP,OAAD,EAAUC,WAAV,EAAuB,KAAvB,EAA8B;MAC9CuP,GAAG,EAAE,CAAC,aAAD,CADyC;MAE9CE,MAAM,EAAE,CAAC,UAAD,EAAa,kBAAb;KAFQ,CALG,CAArB,CAAN;GAN0B,CAFhC;;;ACHa,SAASsB,MAAT,CAAgBH,GAAhB,EAAwC;EACrDA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEE7E,8BAA8B,CAC5B,OAAOjM,OAAP,EAAgBC,WAAhB,KAA+C;UACvCK,IAAI,GAAGN,OAAO,CAAC4B,OAAR,CAAgBwH,UAA7B;UACMlJ,EAAE,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAA3B;;QAEI3B,EAAE,CAACiD,MAAP,EAAe;YACPY,UAAU,GACd7D,EAAE,CAACM,IAAH,CAAQF,IAAR,CAAac,EAAb,KAAoBd,IAAI,CAACc,EAAzB,IACA9B,SAAS,CAACY,EAAE,CAACuD,IAAJ,EAAUxD,WAAW,CAAC5F,MAAZ,CAAmBQ,gBAA7B,CAFX;YAIM+K,OAAO,CAACiE,GAAR,CAAY,CAChB5J,WAAW,CAACqC,0BAAZ,CAAuCtC,OAAvC,EAAgDE,EAAE,CAAC+B,MAAnD,CADgB,EAEhB8B,UAAU,IAAIA,UAAU,CAAC3F,OAAX,CAAmBnD,gBAAjC,GACI+E,OAAO,CAACI,MAAR,CAAe6Q,GAAf,CACGC,SADH,CACalR,OAAO,CAACM,IAAR,CAAa;QAAEC,GAAG,EAAG,SAAQL,EAAE,CAACM,IAAH,CAAQD,GAAI;OAAzC,CADb,EAEG4Q,KAFH,CAES,MAAM,EAFf,CADJ,GAIIrO,SANY,CAAZ,CAAN;KALF,MAaO;YACC8C,OAAO,CAACiE,GAAR,CAAY,CAChB5J,WAAW,CAACqC,0BAAZ,CAAuCtC,OAAvC,EAAgDE,EAAE,CAAC+B,MAAnD,CADgB,EAEhBqN,kBAAkB,CAACtP,OAAD,EAAUC,WAAV,EAAuB,KAAvB,EAA8B;QAC9CyP,MAAM,EAAE,CAAC,aAAD;OADQ,CAFF,CAAZ,CAAN;;GAnBwB,CAFhC;;;ACFa,SAAS0B,eAAT,CAAyBP,GAAzB,EAAiD;EAC9DA,GAAG,CAACC,EAAJ,CACE,+BADF,EAEE7E,8BAA8B,CAC5B,OAAOjM,OAAP,EAAgBC,WAAhB,KAA+C;UACvCoR,MAAM,GAAGrR,OAAO,CAAC4B,OAAR,CAAgByP,MAA/B,CAD6C;;QAIzCA,MAAM,CAAC9E,IAAP,KAAgB,KAApB,EAA2B;UAErBrM,EAAE,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAA3B;UACMyP,QAAQ,GAAItR,OAAO,CAAC4B,OAAT,CAAyB2P,kBAA1C;UAEMhJ,aAAa,GAAGtI,WAAW,CAACmI,gBAAZ,CAA6BkJ,QAAQ,CAACxN,KAAtC,CAAtB;;;QAIIyE,aAAa,IAAItI,WAAW,CAAC5F,MAAZ,CAAmB8C,MAAnB,CAA0BM,MAA1B,CAAiC8K,aAAjC,CAArB,EAAsE;YAC9D;QAAE3H,IAAI,EAAE4Q;UAAY,MAAMxR,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqByO,WAArB,CAC9BzR,OAAO,CAACrE,KAAR,CAAc;QAAE+E,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAGMgR,4BAA4B,GAAGF,OAAO,CAAC1I,IAAR,CAClCrL,MAAD,IACEwC,WAAW,CAACmI,gBAAZ,CAA6B3K,MAAM,CAACiJ,IAAP,CAAY5C,KAAzC,MACEyE,aADF,IAEA9K,MAAM,CAAC+D,KAAP,KAAiB,iBAFjB;MAIA/D,MAAM,CAACiJ,IAAP,CAAY5C,KAAZ,KAAsBwN,QAAQ,CAACxN,KANE,CAArC;;UASI,CAAC4N,4BAAL,EAAmC;cAC3BpC,kBAAkB,CAACtP,OAAD,EAAUC,WAAV,EAAuBsI,aAAvB,EAAsC;UAC5DiH,GAAG,EAAE,CAAC,aAAD,cADuD;UAE5DE,MAAM,EAAE,CAAC,UAAD,EAAa,kBAAb;SAFc,CAAxB;;;;QAOA2B,MAAM,CAACvN,KAAP,KAAiBwN,QAAQ,CAACxN,KAA9B,EAAqC;;QAElB7D,WAAW,CAAC+I,KAA/B,EAAsC;MACpC/I,WAAW,CAAC+I,KAAZ,CAAkBrD,WAAlB,CACE2L,QAAQ,CAACxN,KADX,EAEG,UAAS7D,WAAW,CAAC+I,KAAZ,CAAkBtD,OAAlB,CACR2L,MAAM,CAACvN,KADC,CAER,4BAA2B5D,EAAE,CAACyR,QAAS,SAAQzR,EAAE,CAAC/E,KAAM,EAJ5D;;GAtCwB,CAFhC;;;ACDa,SAASyW,oBAAT,CAA8Bf,GAA9B,EAAsD;EACnEA,GAAG,CAACC,EAAJ,CACE,qCADF,EAEE7E,8BAA8B,CAC5B,OAAOjM,OAAP,EAAgBC,WAAhB,KAA+C;UACvCoR,MAAM,GAAGrR,OAAO,CAAC4B,OAAR,CAAgByP,MAA/B;UACMnR,EAAE,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAA3B;UACMyP,QAAQ,GAAItR,OAAO,CAAC4B,OAAT,CAAyB2P,kBAA1C;UAEMhJ,aAAa,GAAGtI,WAAW,CAACmI,gBAAZ,CAA6BkJ,QAAQ,CAACxN,KAAtC,CAAtB;;QAEIyE,aAAa,IAAItI,WAAW,CAAC5F,MAAZ,CAAmB8C,MAAnB,CAA0BM,MAA1B,CAAiC8K,aAAjC,CAArB,EAAsE;YAC9DsJ,2BAA2B,GAAG5R,WAAW,CAACqI,gBAAZ,CAClCC,aADkC,EAElCrI,EAAE,CAACiP,mBAF+B,EAGlC;QACE1G,qBAAqB,EAAE;OAJS,CAApC;YAQM;QAAE7H,IAAI,EAAE4Q;UAAY,MAAMxR,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqByO,WAArB,CAC9BzR,OAAO,CAACrE,KAAR,CAAc;QAAE+E,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAIMgR,4BAA4B,GAAGF,OAAO,CAAC1I,IAAR,CAClCrL,MAAD,IACEwC,WAAW,CAACmI,gBAAZ,CAA6B3K,MAAM,CAACiJ,IAAP,CAAY5C,KAAzC,MACEyE,aADF,IACmB9K,MAAM,CAAC+D,KAAP,KAAiB,iBAHH,CAArC;YAMMsQ,oBAAoB,GAAGN,OAAO,CAAC1I,IAAR,CAC1BrL,MAAD,IACEwC,WAAW,CAACmI,gBAAZ,CAA6B3K,MAAM,CAACiJ,IAAP,CAAY5C,KAAzC,MACEyE,aADF,IACmB9K,MAAM,CAAC+D,KAAP,KAAiB,UAHX,CAA7B;YAMMvD,QAAQ,GACZ,CAAC4T,2BAAD,IACA,CAACH,4BADD,IAEAI,oBAHF;YAIMxC,kBAAkB,CAACtP,OAAD,EAAUC,WAAV,EAAuBsI,aAAvB,EAAsC;QAC5DiH,GAAG,EAAE;QAEHkC,4BAA4B,IAAI,kBAF7B;QAIHzT,QAAQ,IAAI,UAJT,CADuD;;QAQ5DyR,MAAM,EAAE,CACNzR,QAAQ,IAAI,aADN,EAEN,CAAC4T,2BAAD,IACE,CAACH,4BADH,IAEE,WAJI;OARc,CAAxB;;;QAiBEL,MAAM,CAACvN,KAAP,KAAiBwN,QAAQ,CAACxN,KAA9B,EAAqC;;QAEjC7D,WAAW,CAAC+I,KAAhB,EAAuB;MACrB/I,WAAW,CAAC+I,KAAZ,CAAkBrD,WAAlB,CACE2L,QAAQ,CAACxN,KADX,EAEG,0BAAyB7D,WAAW,CAAC+I,KAAZ,CAAkBtD,OAAlB,CACxB2L,MAAM,CAACvN,KADiB,CAExB,2CAA0C5D,EAAE,CAACyR,QAAS,EAJ1D;;GAzDwB,CAFhC;;;ACAa,SAASI,eAAT,CAAyBlB,GAAzB,EAAiD;EAC9DA,GAAG,CAACC,EAAJ,CACE,+BADF,EAEE7E,8BAA8B,CAC5B,OAAOjM,OAAP,EAAgBC,WAAhB,KAA+C;UACvCC,EAAE,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAA3B;UACM;MAAE6E,IAAI,EAAE4K,QAAR;MAAkB9P;QAAWxB,OAAO,CAAC4B,OAAT,CAAyBnE,MAA3D;QACIyC,EAAE,CAACwG,IAAH,CAAQ5C,KAAR,KAAkBwN,QAAQ,CAACxN,KAA/B,EAAsC;UAEhCyE,aAAa,GAAGtI,WAAW,CAACmI,gBAAZ,CAA6BkJ,QAAQ,CAACxN,KAAtC,CAAtB;QACIX,MAAJ;;QAEIoF,aAAa,IAAItI,WAAW,CAAC5F,MAAZ,CAAmB8C,MAAnB,CAA0BM,MAA1B,CAAiC8K,aAAjC,CAArB,EAAsE;YAC9DsJ,2BAA2B,GAAG5R,WAAW,CAACqI,gBAAZ,CAClCC,aADkC,EAElCrI,EAAE,CAACiP,mBAF+B,EAGlC;QACE1G,qBAAqB,EAAE,IADzB;;;OAHkC,CAApC;YASM;QAAE7H,IAAI,EAAE4Q;UAAY,MAAMxR,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqByO,WAArB,CAC9BzR,OAAO,CAACrE,KAAR,CAAc;QAAE+E,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAGMgR,4BAA4B,GAAGF,OAAO,CAAC1I,IAAR,CAClCrL,MAAD,IACEwC,WAAW,CAACmI,gBAAZ,CAA6B3K,MAAM,CAACiJ,IAAP,CAAY5C,KAAzC,MACEyE,aADF,IACmB9K,MAAM,CAAC+D,KAAP,KAAiB,iBAHH,CAArC;YAMMvD,QAAQ,GACZ,CAAC4T,2BAAD,IACA,CAACH,4BADD,IAEAlQ,KAAK,KAAK,UAHZ;YAKMwQ,SAAS,GAAG,MAAM1C,kBAAkB,CACxCtP,OADwC,EAExCC,WAFwC,EAGxCsI,aAHwC,EAIxC;QACEiH,GAAG,EAAE,CACHvR,QAAQ,IAAI,UADT,EAEHuD,KAAK,KAAK,mBAAV,IAAiC,kBAF9B,CADP;QAKEkO,MAAM,EAAE,CACNzR,QAAQ,IAAI,aADN,EAEN,EACE4T,2BAA2B,IAAIrQ,KAAK,KAAK,mBAD3C,KAEK,WAJC,EAKNA,KAAK,KAAK,UAAV,IACE,CAACkQ,4BADH,IAEE,kBAPI,EAQNlQ,KAAK,KAAK,mBAAV,IAAiC,UAR3B;OAT8B,CAA1C;;UAsBIvD,QAAQ,IAAI,CAACyT,4BAAjB,EAA+C;QAC7CvO,MAAM,GAAG,MAAMxB,mBAAmB,CAChC3B,OADgC,EAEhCC,WAFgC,EAGhCC,EAHgC,EAIhC8R,SAJgC,CAAlC;;;;UASEtM,OAAO,GAAGzF,WAAW,CAAC+I,KAAZ,CAAkBtD,OAAlB,CAA0B4L,QAAQ,CAACxN,KAAnC,CAAhB;UACMmO,KAAK,GAAG/R,EAAE,CAACyR,QAAjB;;UAEMrN,OAAO,GAAG,CAAC,MAAM;UACjB9C,KAAK,KAAK,mBAAd,EAAmC;eACzB,OAAMkE,OAAQ,wBAAuBuM,KAAM,EAAnD;;;UAEEzQ,KAAK,KAAK,UAAd,EAA0B;eAChB,6BAA4BkE,OAAQ,aAAYuM,KAAM,GAC5D9O,MAAM,GAAG,0BAAH,GAAgC,EACvC,EAFD;;;aAIM,oBAAmBuC,OAAQ,iBAAgBuM,KAAM,EAAzD;KATc,GAAhB;;IAYAhS,WAAW,CAAC+I,KAAZ,CAAkBrD,WAAlB,CAA8BzF,EAAE,CAACwG,IAAH,CAAQ5C,KAAtC,EAA6CQ,OAA7C;GAhF0B,CAFhC;;;ACFa,SAAS4N,eAAT,CAAyBrB,GAAzB,EAAiD;EAC9DA,GAAG,CAACC,EAAJ,CACE,+BADF,EAEE7E,8BAA8B,CAC5B,OAAOjM,OAAP,EAAgBC,WAAhB,KAA+C;UACvCoR,MAAM,GAAGrR,OAAO,CAAC4B,OAAR,CAAgByP,MAA/B;UACMnR,EAAE,GAAGF,OAAO,CAAC4B,OAAR,CAAgBC,YAA3B;UACMyP,QAAQ,GAAItR,OAAO,CAAC4B,OAAT,CAAyBnE,MAAzB,CAAgCiJ,IAAjD;UAEM6B,aAAa,GAAGtI,WAAW,CAACmI,gBAAZ,CAA6BkJ,QAAQ,CAACxN,KAAtC,CAAtB;;QAEIyE,aAAa,IAAItI,WAAW,CAAC5F,MAAZ,CAAmB8C,MAAnB,CAA0BM,MAA1B,CAAiC8K,aAAjC,CAArB,EAAsE;YAC9D;QAAE3H,IAAI,EAAE4Q;UAAY,MAAMxR,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqByO,WAArB,CAC9BzR,OAAO,CAACrE,KAAR,CAAc;QAAE+E,QAAQ,EAAE;OAA1B,CAD8B,CAAhC;YAGMgR,4BAA4B,GAAGF,OAAO,CAAC1I,IAAR,CAClCrL,MAAD,IACEwC,WAAW,CAACmI,gBAAZ,CAA6B3K,MAAM,CAACiJ,IAAP,CAAY5C,KAAzC,MACEyE,aADF,IACmB9K,MAAM,CAAC+D,KAAP,KAAiB,iBAHH,CAArC;YAMM8N,kBAAkB,CAACtP,OAAD,EAAUC,WAAV,EAAuBsI,aAAvB,EAAsC;QAC5DiH,GAAG,EAAE,CAAC,aAAD,EAAgB,WAAhB,CADuD;QAE5DE,MAAM,EAAE,CACN,CAACgC,4BAAD,IAAiC,kBAD3B,EAEN,UAFM;OAFc,CAAxB;;;QASEzR,WAAW,CAAC+I,KAAhB,EAAuB;UACjBqI,MAAM,CAACvN,KAAP,KAAiBwN,QAAQ,CAACxN,KAA9B,EAAqC;QACnC7D,WAAW,CAAC+I,KAAZ,CAAkBrD,WAAlB,CACEzF,EAAE,CAACwG,IAAH,CAAQ5C,KADV,EAEG,WAAU7D,WAAW,CAAC+I,KAAZ,CAAkBtD,OAAlB,CACT4L,QAAQ,CAACxN,KADA,CAET,4BAA2B5D,EAAE,CAACyR,QAAS,EAJ3C;OADF,MAOO;QACL1R,WAAW,CAAC+I,KAAZ,CAAkBrD,WAAlB,CACE2L,QAAQ,CAACxN,KADX,EAEG,WAAU7D,WAAW,CAAC+I,KAAZ,CAAkBtD,OAAlB,CACT2L,MAAM,CAACvN,KADE,CAET,6BAA4B5D,EAAE,CAACyR,QAAS,EAJ5C;;;GApCsB,CAFhC;;;ACCa,SAASQ,WAAT,CAAqBtB,GAArB,EAA6C;EAC1DA,GAAG,CAACC,EAAJ,CACE,0BADF,EAEE7E,8BAA8B,CAC5B,OAAOjM,OAAP,EAAgBC,WAAhB,KAA+C;;;UAIvC2F,OAAO,CAACiE,GAAR,CAAY,CAChB0D,YAAY,CAACvN,OAAD,EAAUC,WAAV,CADI;IAGhBiP,2BAA2B,CAAClP,OAAD,EAAUC,WAAV,CAHX;IAKhB0B,mBAAmB,CAAC3B,OAAD,EAAUC,WAAV,CALH,CAAZ,CAAN;GAL0B,CAFhC;;;ACFa,SAASmS,MAAT,CAAgBvB,GAAhB,EAAwC;EACrDA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEE7E,8BAA8B,CAC5B,OAAOjM,OAAP,EAAgBC,WAAhB,KAA+C;UACvCoR,MAAM,GAAGrR,OAAO,CAAC4B,OAAR,CAAgByP,MAA/B;;QACIA,MAAM,CAAC9E,IAAP,KAAgB,KAApB,EAA2B;;;;UAIrBgB,YAAY,CAACvN,OAAD,EAAUC,WAAV,CAAlB;UACM0B,mBAAmB,CAAC3B,OAAD,EAAUC,WAAV,CAAzB;GAR0B,CAFhC;;;ACAK,MAAMoS,YAAY,GAAG,OAG1BrS,OAH0B,EAI1BC,WAJ0B,EAK1BkN,aAL0B,KAMR;QACZmF,MAAM,GAAGtS,OAAO,CAAC4B,OAAR,CAAgBC,YAAhB,CAA6B4B,IAA5C;QACM;IAAEA;MAASyJ,UAAU,CACzBoF,MADyB,EAEzBrS,WAAW,CAAC5F,MAAZ,CAAmBQ,gBAFM,EAGzBiI,SAHyB,EAIzBqK,aAJyB,CAA3B;;MAOI1J,IAAI,KAAK6O,MAAb,EAAqB;UACbtS,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqBQ,MAArB,CAA4BxD,OAAO,CAACrE,KAAR,CAAc;MAAE8H;KAAhB,CAA5B,CAAN;;CAhBG;;ACCQ,SAAS8O,aAAT,CAAuB1B,GAAvB,EAA+C;EAC5DA,GAAG,CAACC,EAAJ,CACE,CAAC,sBAAD,EAAyB,wBAAzB,CADF,EAEE,MAAO9Q,OAAP,IAAgE;UACxDqR,MAAM,GAAGrR,OAAO,CAAC4B,OAAR,CAAgByP,MAA/B;UACMN,YAAY,GAChBM,MAAM,CAAC9E,IAAP,KAAgB,KAAhB,IAAyB8E,MAAM,CAACvN,KAAP,KAAiB,eAD5C;IAEA9D,OAAO,CAAC4B,OAAR,CAAgBC,YAAhB,CAA6BrB,IAA7B,CAAkCD,GAAlC,CAAsC+C,UAAtC,CAAiD,WAAjD;;QAEI+N,MAAM,CAAC9E,IAAP,KAAgB,KAAhB,IAAyB,CAACwE,YAA9B,EAA4C;;;;UAItC/E,wBAAwB,CAAChM,OAAD,EAAU,MAAOC,WAAP,IAAuB;YACvDtB,KAAK,GAAIqB,OAAO,CAAC4B,OAAT,CAAyBjD,KAAvC;;UACIoS,YAAJ,EAAkB;cACVN,iBAAiB,GAAGxQ,WAAW,CAAC9C,MAAZ,CAAmB,eAAnB,CAA1B;cACM4E,cAAc,GAAG9B,WAAW,CAAC9C,MAAZ,CAAmB,iBAAnB,CAAvB;;YACI6C,OAAO,CAAC4B,OAAR,CAAgB4Q,MAAhB,KAA2B,SAA/B,EAA0C;cACpC/B,iBAAiB,IAAI9R,KAAK,CAACyC,EAAN,KAAaqP,iBAAiB,CAACrP,EAAxD,EAA4D;;;;;kBAKpDpB,OAAO,CAACI,MAAR,CAAe4C,KAAf,CAAqB0N,YAArB,CACJ1Q,OAAO,CAACrE,KAAR,CAAc;cAAEgV,KAAK,EAAE;aAAvB,CADI,CAAN;kBAGMzB,2BAA2B,CAC/BlP,OAD+B,EAE/BC,WAF+B,EAG/BD,OAAO,CAAC4B,OAAR,CAAgBC,YAHe,CAAjC;kBAKMwQ,YAAY,CAACrS,OAAD,EAAUC,WAAV,EAAuB;cACvClF,mBAAmB,EAAE;aADL,CAAlB,CAb0D;WAA5D,MAiBO,IAAIgH,cAAc,IAAIpD,KAAK,CAACyC,EAAN,KAAaW,cAAc,CAACX,EAAlD,EAAsD;kBACrDiR,YAAY,CAACrS,OAAD,EAAUC,WAAV,EAAuB;cACvCjF,SAAS,EAAE;aADK,CAAlB;;;;;;;UAQFiF,WAAW,CAACmK,iBAAZ,CAA8BvB,QAA9B,CAAuClK,KAAK,CAACyC,EAA7C,CAAJ,EAAsD;YAChDpB,OAAO,CAAC4B,OAAR,CAAgB4Q,MAAhB,KAA2B,SAA/B,EAA0C;gBAClCxS,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBqL,WAAtB,CACJ5O,OAAO,CAACrE,KAAR,CAAc;YAAE4B,IAAI,EAAEoB,KAAK,CAACpB;WAA5B,CADI,CAAN;SADF,MAIO;gBACCyC,OAAO,CAACI,MAAR,CAAemD,MAAf,CAAsBsL,SAAtB,CACJ7O,OAAO,CAACrE,KAAR,CAAc;YAAEwB,MAAM,EAAE,CAACwB,KAAK,CAACpB,IAAP;WAAxB,CADI,CAAN;;;;;;YAOE2R,2BAA2B,CAAClP,OAAD,EAAUC,WAAV,CAAjC;YAEMoO,kBAAkB,GAAGpO,WAAW,CAAC9C,MAAZ,CAAmB,gBAAnB,CAA3B;YACMmR,cAAc,GAAGrO,WAAW,CAAC9C,MAAZ,CAAmB,iBAAnB,CAAvB;;UAGGkR,kBAAkB,IAAI1P,KAAK,CAACyC,EAAN,KAAakN,cAAc,CAAClN,EAAnD,IACCkN,cAAc,IAAI3P,KAAK,CAACyC,EAAN,KAAakN,cAAc,CAAClN,EAFjD,EAGE;cACM7C,MAAqC,GACzC8P,kBAAkB,IAAI1P,KAAK,CAACyC,EAAN,KAAaiN,kBAAkB,CAACjN,EAAtD,GACI,eADJ,GAEI,WAHN;cAIMiR,YAAY,CAACrS,OAAD,EAAUC,WAAV,EAAuB;WACtC1B,MAAD,GAAUyB,OAAO,CAAC4B,OAAR,CAAgB4Q,MAAhB,KAA2B;SADrB,CAAlB;OARF,MAWO,IAAIxS,OAAO,CAAC4B,OAAR,CAAgB4Q,MAAhB,KAA2B,SAA/B,EAA0C;YAE7CvS,WAAW,CAAC9C,MAAZ,CAAmB,iBAAnB,KACAwB,KAAK,CAACyC,EAAN,KAAanB,WAAW,CAAC9C,MAAZ,CAAmB,iBAAnB,EAAsCiE,EAFrD,EAGE;gBACMO,mBAAmB,CAAC3B,OAAD,EAAUC,WAAV,CAAzB;;;KAlEwB,CAA9B;GAZJ;;;ACJa,SAASwS,iBAAT,CAA2B5B,GAA3B,EAAmD;EAChEA,GAAG,CAACC,EAAJ,CACE,qBADF,EAEE5E,+BAA+B,CAC5BlM,OAAD,IAAaA,OAAO,CAAC4B,OAAR,CAAgB8Q,SAAhB,CAA0BC,aADV,EAE7B,OAAO3S,OAAP,EAAgBC,WAAhB,KAAgC;UACxB2F,OAAO,CAACiE,GAAR,CACJ7J,OAAO,CAAC4B,OAAR,CAAgB8Q,SAAhB,CAA0BC,aAA1B,CAAwCrU,GAAxC,CAA6C4B,EAAD,IAC1CF,OAAO,CAACI,MAAR,CAAe4C,KAAf,CACGC,GADH,CAEIjD,OAAO,CAACM,IAAR,CAAa;MACX2B,MAAM,EAAE/B,EAAE,CAAC+B;KADb,CAFJ,EAMGuH,IANH,CAMSzG,QAAD,IAAc;aACXpB,mBAAmB,CAAC3B,OAAD,EAAUC,WAAV,EAAuB8C,QAAQ,CAACnC,IAAhC,CAA1B;KAPJ,CADF,CADI,CAAN;GAH2B,CAFjC;;;ACDa,SAASgS,mBAAT,CAA6B/B,GAA7B,EAAqD;EAClEA,GAAG,CAACC,EAAJ,CACE,uBADF,EAEE5E,+BAA+B,CAC5BlM,OAAD,IAAaA,OAAO,CAAC4B,OAAR,CAAgBiR,WAAhB,CAA4BF,aADZ,EAE7B,OAAO3S,OAAP,EAAgBC,WAAhB,KAAgC;UACxB2F,OAAO,CAACiE,GAAR,CACJ7J,OAAO,CAAC4B,OAAR,CAAgBiR,WAAhB,CAA4BF,aAA5B,CAA0CrU,GAA1C,CAA+C4B,EAAD,IAC5CF,OAAO,CAACI,MAAR,CAAe4C,KAAf,CACGC,GADH,CAEIjD,OAAO,CAACM,IAAR,CAAa;MACX2B,MAAM,EAAE/B,EAAE,CAAC+B;KADb,CAFJ,EAMGuH,IANH,CAMSzG,QAAD,IAAc;aACXpB,mBAAmB,CAAC3B,OAAD,EAAUC,WAAV,EAAuB8C,QAAQ,CAACnC,IAAhC,CAA1B;KAPJ,CADF,CADI,CAAN;GAH2B,CAFjC;;;ACAF,MAAMkS,YAAY,GAAG,CACnB9S,OADmB,EAEnByC,QAFmB,KAGP;MACR,CAACA,QAAL,EAAe,OAAO,KAAP;SACR,CAAC,CAACzC,OAAO,CAAC4B,OAAR,CAAgBmR,QAAhB,CAAyB5Q,IAAzB,CAA+B6Q,CAAD,IAAOA,CAAC,CAACzV,IAAF,KAAWkF,QAAQ,CAACP,MAAzD,CAAT;CALF;;AAQA,AAAe,SAAS1G,MAAT,CAAgBqV,GAAhB,EAAwC;EACrDA,GAAG,CAACC,EAAJ,CACE,QADF,EAEE5E,+BAA+B,CAC7B,CAAClM,OAAD,EAAUC,WAAV,KAA2C;UACnCwC,QAAQ,GAAGxC,WAAW,CAACyC,gBAAZ,EAAjB;QACI,CAACD,QAAL,EAAe,OAAO,EAAP;;QAEXqQ,YAAY,CAAC9S,OAAD,EAAUyC,QAAV,CAAhB,EAAqC;aAC5B,CAACA,QAAD,CAAP;;;WAGK,EAAP;GAT2B,EAW7B,CAACzC,OAAD,EAAUC,WAAV,KAAgC;UACxBwC,QAAQ,GAAGxC,WAAW,CAACyC,gBAAZ,EAAjB,CAD8B;;QAG1BoQ,YAAY,CAAC9S,OAAD,EAAUyC,QAAV,CAAhB,EAAqC;MACnCxC,WAAW,CAACoD,UAAZ,CAAuBrD,OAAvB,EAAgCyC,QAAhC;;GAfyB,CAFjC;;;ACCF,IAAI,CAAClI,OAAO,CAACC,GAAR,CAAYsR,IAAjB,EAAuBvR,OAAO,CAACC,GAAR,CAAYsR,IAAZ,GAAmB,YAAnB;;;;;;;AAWvBmH,aAAM,CAACC,GAAP,CAAYrC,GAAD,IAAsB;EAC/BsC,MAAa,CAACtC,GAAD,CAAb;EACAuC,MAAa,CAACvC,GAAD,CAAb;EACAwC,eAAsB,CAACxC,GAAD,CAAtB;EACAyC,oBAA2B,CAACzC,GAAD,CAA3B,CAJ+B;;;;;EAc/B0C,eAAsB,CAAC1C,GAAD,CAAtB;EACA2C,eAAsB,CAAC3C,GAAD,CAAtB;EACA0B,aAAa,CAAC1B,GAAD,CAAb;EACA4C,WAAkB,CAAC5C,GAAD,CAAlB;EACA6C,MAAa,CAAC7C,GAAD,CAAb;EAEA4B,iBAAiB,CAAC5B,GAAD,CAAjB;EACA+B,mBAAmB,CAAC/B,GAAD,CAAnB;EACArV,MAAM,CAACqV,GAAD,CAAN;CAtBF"} \ No newline at end of file diff --git a/dist/index-node10.cjs.js b/dist/index-node10.cjs.js index aa00eccd9..1dd8103de 100644 --- a/dist/index-node10.cjs.js +++ b/dist/index-node10.cjs.js @@ -56,7 +56,6 @@ const config = { /* back */ abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`, arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`, - CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`, rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`, damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`, 'Thierry-girod': `thierry${process.env.ORNIKAR_EMAIL_DOMAIN}`, @@ -67,6 +66,7 @@ const config = { christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`, HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`, LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`, + CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`, Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`, tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`, '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}` @@ -76,6 +76,16 @@ const config = { CoralineColasse: `coraline${process.env.ORNIKAR_EMAIL_DOMAIN}` } }, + teams: { + backends: { + logins: ['abarreir', 'arthurflachs', 'rigma', 'damienorny', 'Thierry-girod', 'darame07', 'Pixy'], + labels: ['teams/backend'] + }, + frontends: { + logins: ['christophehurpeau', 'HugoGarrido', 'LentnerStefan', 'CorentinAndre', 'Mxime', 'tilap', '63m29'], + labels: ['teams/frontend'] + } + }, waitForGroups: { dev: [], design: ['dev'] @@ -123,6 +133,16 @@ const config = { color: '#64DD17' }, + /* teams */ + 'teams/backend': { + name: 'backend', + color: '#6ad8cb' + }, + 'teams/frontend': { + name: 'frontend', + color: '#8a5abc' + }, + /* auto merge */ 'merge/automerge': { name: ':soon: automerge', @@ -187,6 +207,7 @@ const config$1 = { waitForGroups: { dev: [] }, + teams: {}, labels: { list: { // /* ci */ @@ -240,7 +261,7 @@ const config$1 = { } }; -const teamConfigs = { +const orgsConfigs = { ornikar: config, christophehurpeau: config$1 }; // flat requires node 11 @@ -617,12 +638,22 @@ const ExcludesFalsy$1 = Boolean; const initTeamContext = async (context, config) => { const slackPromise = initTeamSlack(context, config); - const githubLoginToGroup = getKeys(config.groups).reduce((acc, groupName) => { + const githubLoginToGroup = new Map(); + getKeys(config.groups).forEach(groupName => { Object.keys(config.groups[groupName]).forEach(login => { - acc.set(login, groupName); + githubLoginToGroup.set(login, groupName); }); - return acc; - }, new Map()); + }); + const githubLoginToTeams = new Map(); + getKeys(config.teams || {}).forEach((acc, teamName) => { + config.teams[teamName].logins.forEach(login => { + if (acc.has(login)) { + acc.get(login).push(teamName); + } else { + acc.set(login, [teamName]); + } + }); + }); const getReviewerGroups = githubLogins => [...new Set(githubLogins.map(githubLogin => githubLoginToGroup.get(githubLogin)).filter(Boolean))]; @@ -630,6 +661,7 @@ const initTeamContext = async (context, config) => { config, getReviewerGroup: githubLogin => githubLoginToGroup.get(githubLogin), getReviewerGroups: githubLogins => [...new Set(githubLogins.map(githubLogin => githubLoginToGroup.get(githubLogin)).filter(ExcludesFalsy$1))], + getTeamsForLogin: githubLogin => githubLoginToTeams.get(githubLogin) || [], reviewShouldWait: (reviewerGroup, requestedReviewers, { includesReviewerGroup, includesWaitForGroups @@ -653,20 +685,20 @@ const initTeamContext = async (context, config) => { }; }; -const teamContextsPromise = new Map(); -const teamContexts = new Map(); -const obtainTeamContext = (context, config) => { +const orgContextsPromise = new Map(); +const orgContexts = new Map(); +const obtainOrgContext = (context, config) => { const owner = context.payload.repository.owner; - const existingTeamContext = teamContexts.get(owner.login); + const existingTeamContext = orgContexts.get(owner.login); if (existingTeamContext) return existingTeamContext; - const existingPromise = teamContextsPromise.get(owner.login); + const existingPromise = orgContextsPromise.get(owner.login); if (existingPromise) return Promise.resolve(existingPromise); const promise = initTeamContext(context, config); - teamContextsPromise.set(owner.login, promise); - return promise.then(teamContext => { - teamContextsPromise.delete(owner.login); - teamContexts.set(owner.login, teamContext); - return teamContext; + orgContextsPromise.set(owner.login, promise); + return promise.then(orgContext => { + orgContextsPromise.delete(owner.login); + orgContexts.set(owner.login, orgContext); + return orgContext; }); }; @@ -674,8 +706,8 @@ const obtainTeamContext = (context, config) => { const ExcludesFalsy$2 = Boolean; async function initRepoContext(context, config) { - const teamContext = await obtainTeamContext(context, config); - const repoContext = Object.create(teamContext); + const orgContext = await obtainOrgContext(context, config); + const repoContext = Object.create(orgContext); const [labels] = await Promise.all([initRepoLabels(context, config)]); const reviewGroupNames = Object.keys(config.groups); const needsReviewLabelIds = reviewGroupNames.map(key => config.labels.review[key].needsReview).filter(Boolean).map(name => labels[name].id); @@ -803,8 +835,8 @@ const obtainRepoContext = context => { const owner = repo.owner; - if (!teamConfigs[owner.login]) { - console.warn(owner.login, Object.keys(teamConfigs)); + if (!orgsConfigs[owner.login]) { + console.warn(owner.login, Object.keys(orgsConfigs)); return null; } @@ -813,7 +845,7 @@ const obtainRepoContext = context => { if (existingRepoContext) return existingRepoContext; const existingPromise = repoContextsPromise.get(key); if (existingPromise) return Promise.resolve(existingPromise); - const promise = initRepoContext(context, teamConfigs[owner.login]); + const promise = initRepoContext(context, orgsConfigs[owner.login]); repoContextsPromise.set(key, promise); return promise.then(repoContext => { repoContextsPromise.delete(key); @@ -1166,8 +1198,23 @@ const updateReviewStatus = async (context, repoContext, reviewGroup, { toDelete.add(key); } }); - } + } // TODO move that elsewhere + + + repoContext.getTeamsForLogin(pr.user.login).forEach(teamName => { + const team = repoContext.config.teams[teamName]; + if (team.labels) { + team.labels.forEach(labelKey => { + const label = repoContext.labels[labelKey]; + + if (label && !prLabels.some(prLabel => prLabel.id === label.id)) { + newLabelNames.add(label.name); + toAdd.add(labelKey); + } + }); + } + }); const newLabelNamesArray = [...newLabelNames]; context.log.info('updateReviewStatus', { reviewGroup, diff --git a/dist/index-node10.cjs.js.map b/dist/index-node10.cjs.js.map index 6918855d0..14ee69d9f 100644 --- a/dist/index-node10.cjs.js.map +++ b/dist/index-node10.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"index-node10.cjs.js","sources":["../src/teamconfigs/ornikar.ts","../src/teamconfigs/christophehurpeau.ts","../src/teamconfigs/index.ts","../src/pr-handlers/actions/utils/prOptions.ts","../src/pr-handlers/actions/utils/parseBody.ts","../src/pr-handlers/actions/autoMergeIfPossible.ts","../src/context/initRepoLabels.ts","../src/context/utils.ts","../src/context/initTeamSlack.ts","../src/context/teamContext.ts","../src/context/repoContext.ts","../src/pr-handlers/utils.ts","../src/pr-handlers/actions/autoAssignPRToCreator.ts","../src/pr-handlers/actions/utils/cleanTitle.ts","../src/pr-handlers/actions/utils/updateBody.ts","../src/pr-handlers/actions/editOpenedPR.ts","../src/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/pr-handlers/actions/updateReviewStatus.ts","../src/pr-handlers/actions/autoApproveAndAutoMerge.ts","../src/pr-handlers/opened.ts","../src/pr-handlers/closed.ts","../src/pr-handlers/reviewRequested.ts","../src/pr-handlers/reviewRequestRemoved.ts","../src/pr-handlers/reviewSubmitted.ts","../src/pr-handlers/reviewDismissed.ts","../src/pr-handlers/synchronize.ts","../src/pr-handlers/edited.ts","../src/pr-handlers/actions/updatePrBody.ts","../src/pr-handlers/labelsChanged.ts","../src/pr-handlers/checkrunCompleted.ts","../src/pr-handlers/checksuiteCompleted.ts","../src/pr-handlers/status.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 prDefaultOptions: {\n featureBranch: false,\n autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\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 inBody: true,\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 /* back */\n abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'Thierry-girod': `thierry${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n darame07: `kevin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Pixy: `pierre-alexis${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n /* front */\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${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: '#FFC44C',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#DAE1E6',\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: '#FFC44C',\n },\n 'design/review-requested': {\n name: ':art: design/review-requested',\n color: '#DAE1E6',\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 /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\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 prDefaultOptions: {\n featureBranch: false,\n autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\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 tilap: 'jlavinh@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\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config as ConfigType } from './types';\nimport ornikar from './ornikar';\nimport christophehurpeau from './christophehurpeau';\n\nexport type Config = ConfigType;\n\nexport const teamConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n};\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","export type Options =\n | 'featureBranch'\n | 'autoMergeWithSkipCi'\n | 'autoMerge'\n | 'deleteAfterMerge';\n\nexport const options: Options[] = [\n 'featureBranch',\n 'autoMergeWithSkipCi',\n 'autoMerge',\n 'deleteAfterMerge',\n];\nexport const optionsRegexps: { name: Options; regexp: RegExp }[] = options.map(\n (option) => ({\n name: option,\n regexp: new RegExp(`\\\\[([ xX]?)]\\\\s*`),\n }),\n);\n\nexport const optionsLabels: { name: Options; label: string }[] = [\n { name: 'featureBranch', label: 'This PR is a feature branch' },\n {\n name: 'autoMergeWithSkipCi',\n label: 'Auto merge with `[skip ci]`',\n },\n {\n name: 'autoMerge',\n label:\n 'Auto merge when this PR is ready and has no failed statuses. (Also has a queue per repo to prevent multiple useless \"Update branch\" triggers)',\n },\n {\n name: 'deleteAfterMerge',\n label: 'Automatic branch delete after this PR is merged',\n },\n];\n","import { Options, optionsRegexps } from './prOptions';\n\nconst commentStart = '';\nconst commentEnd = \"\";\n\nconst regexpCols = /^(.*)((.*))(.*)$/is;\nconst regexpReviewflowCol = /^(\\s*<\\/td>]*>)\\s*(.*)\\s*(<\\/td><\\/tr><\\/table>\\s*)\\s*$/is;\n\nconst parseOptions = (\n content: string,\n defaultConfig: Record,\n): Record => {\n return optionsRegexps.reduce(\n (acc, { name, regexp }) => {\n const match = regexp.exec(content);\n acc[name] = !match\n ? defaultConfig[name] || false\n : match[1] === 'x' || match[1] === 'X';\n return acc;\n },\n {} as any,\n ) as Record;\n};\n\nexport const parseBody = (\n description: string,\n defaultConfig: Record,\n) => {\n const match = regexpCols.exec(description);\n if (!match) return null;\n const [, content, reviewFlowCol, reviewflowContent, ending] = match;\n const reviewFlowColMatch = regexpReviewflowCol.exec(reviewFlowCol);\n if (!reviewFlowColMatch) {\n return {\n content,\n ending,\n reviewflowContentCol: reviewflowContent,\n reviewflowContentColPrefix: commentStart,\n reviewflowContentColSuffix: commentEnd,\n options: parseOptions(reviewFlowCol, defaultConfig),\n };\n }\n const [\n ,\n reviewflowContentColPrefix,\n reviewflowContentCol,\n reviewflowContentColSuffix,\n ] = reviewFlowColMatch;\n\n return {\n content,\n ending,\n reviewflowContentCol,\n reviewflowContentColPrefix,\n reviewflowContentColSuffix,\n options: parseOptions(reviewflowContentCol, defaultConfig),\n };\n};\n","/* eslint-disable max-lines */\nimport { Context } from 'probot';\n// eslint-disable-next-line import/no-cycle\nimport { RepoContext } from '../../context/repoContext';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { parseBody } from './utils/parseBody';\n\nconst hasFailedStatusOrChecks = async (\n context: Context,\n repoContext: RepoContext,\n pr: any,\n) => {\n const checks = await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const failedChecks = checks.data.check_runs.filter(\n (check) => check.conclusion === 'failure',\n );\n\n if (failedChecks.length !== 0) {\n context.log.info(`automerge not possible: failed check pr ${pr.id}`, {\n checks: failedChecks.map((check) => check.name),\n });\n return true;\n }\n\n const combinedStatus = await context.github.repos.getCombinedStatusForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n if (combinedStatus.data.state === 'failure') {\n const failedStatuses = combinedStatus.data.statuses.filter(\n (status) => status.state === 'failure' || status.state === 'error',\n );\n\n context.log.info(`automerge not possible: failed status pr ${pr.id}`, {\n statuses: failedStatuses.map((status) => status.context),\n });\n\n return true;\n }\n\n return false;\n};\n\nexport const autoMergeIfPossible = async (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n prLabels: LabelResponse[] = pr.labels,\n): Promise => {\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return false;\n\n const createMergeLockPrFromPr = () => ({\n id: pr.id,\n number: pr.number,\n branch: pr.head.ref,\n });\n\n if (!prLabels.find((l): boolean => l.id === autoMergeLabel.id)) {\n context.log.debug('automerge not possible: no label');\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n }\n\n if (pr.state !== 'open') {\n context.log.debug('automerge not possible: pr is not opened');\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n }\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n context.log.debug('automerge not possible: blocking labels');\n // repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n }\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (lockedPr && lockedPr.number !== pr.number) {\n context.log.info(`automerge not possible: locked pr ${pr.id}`);\n repoContext.pushAutomergeQueue(createMergeLockPrFromPr());\n return false;\n }\n\n repoContext.addMergeLockPr(createMergeLockPrFromPr());\n\n if (pr.mergeable === undefined) {\n const prResult = await context.github.pulls.get(\n context.repo({\n pull_number: pr.number,\n }),\n );\n pr = prResult.data;\n }\n\n if (pr.merged) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n context.log.info(`automerge not possible: already merged pr ${pr.id}`);\n return false;\n }\n\n context.log.info(\n `automerge?: ${pr.id}, mergeable=${pr.mergeable} state=${\n pr.mergeable_state\n }`,\n );\n\n // https://github.com/octokit/octokit.net/issues/1763\n if (\n !(\n pr.mergeable_state === 'clean' ||\n pr.mergeable_state === 'has_hooks' ||\n pr.mergeable_state === 'unstable'\n )\n ) {\n if (!pr.mergeable_state || pr.mergeable_state === 'unknown') {\n context.log.info(`automerge not possible: rescheduling ${pr.id}`);\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n\n if (pr.head.ref.startsWith('renovate/')) {\n if (pr.mergeable_state === 'behind' || pr.mergeable_state === 'dirty') {\n context.log.info(\n `automerge not possible: rebase renovate branch pr ${pr.id}`,\n );\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n\n await context.github.issues.update(\n context.repo({\n number: pr.number,\n body: pr.body.replace(\n '[ ] ',\n '[x] ',\n ),\n }),\n );\n return false;\n }\n\n if (await hasFailedStatusOrChecks(context, repoContext, pr)) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n } else if (pr.mergeable_state === 'blocked') {\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n\n context.log.info(\n `automerge not possible: renovate with mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n if (pr.mergeable_state === 'blocked') {\n if (await hasFailedStatusOrChecks(context, repoContext, pr)) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n } else {\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n }\n\n if (pr.mergeable_state === 'behind') {\n context.log.info('automerge not possible: update branch', {\n head: pr.head.ref,\n base: pr.base.ref,\n });\n\n await context.github.repos.merge({\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n head: pr.base.ref,\n base: pr.head.ref,\n });\n\n return false;\n }\n\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pr.number}`);\n\n const parsedBody = parseBody(pr.body, repoContext.config.prDefaultOptions);\n const options =\n (parsedBody && parsedBody.options) || repoContext.config.prDefaultOptions;\n\n const mergeResult = await context.github.pulls.merge({\n merge_method: options.featureBranch ? 'merge' : 'squash',\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n pull_number: pr.number,\n commit_title: `${pr.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pr.number})`,\n commit_message: '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return Boolean(mergeResult.data.merged);\n } catch (err) {\n context.log.info('could not merge:', err.message);\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\n\nexport interface LabelResponse {\n id: number;\n node_id: string;\n url: string;\n name: string;\n description: string;\n color: string;\n default: boolean;\n}\n\nexport interface Labels {\n [key: string]: LabelResponse;\n}\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const { data: labels } = await context.github.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n const finalLabels: Record = {};\n\n for (const [labelKey, labelConfig] of Object.entries(config.labels.list)) {\n const labelColor = labelConfig.color.slice(1);\n const description = `Generated by review-flow for ${labelKey}`;\n\n let existingLabel = labels.find((label) => label.name === labelConfig.name);\n if (!existingLabel) {\n existingLabel = labels.find((label) => label.description === description);\n }\n if (!existingLabel) {\n if (labelKey === 'design/needs-review') {\n existingLabel = labels.find(\n (label) => label.name === 'needs-design-review',\n );\n }\n if (labelKey === 'design/approved') {\n existingLabel = labels.find(\n (label) => label.name === 'design-reviewed',\n );\n }\n }\n\n if (!existingLabel) {\n const result = await context.github.issues.createLabel(\n context.repo({\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else if (\n existingLabel.name !== labelConfig.name ||\n existingLabel.color !== labelColor // ||\n // TODO: description is never updated\n // existingLabel.description !== description\n ) {\n context.log.info('Needs to update label', {\n current_name: existingLabel.name,\n name: existingLabel.name !== labelConfig.name && labelConfig.name,\n color: existingLabel.color !== labelColor && labelColor,\n description: existingLabel.description !== description && description,\n });\n\n const result = await context.github.issues.updateLabel(\n context.repo({\n current_name: existingLabel.name,\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else {\n finalLabels[labelKey] = existingLabel;\n }\n }\n\n return finalLabels;\n};\n","export const getKeys = (o: T): (keyof T)[] =>\n Object.keys(o) as (keyof T)[];\n","import { WebClient } from '@slack/web-api';\nimport { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { getKeys } from './utils';\n\nexport interface TeamSlack {\n mention: (githubLogin: string) => string;\n postMessage: (githubLogin: string, text: string) => Promise;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const initTeamSlack = async (\n context: Context,\n config: Config,\n): Promise => {\n if (!config.slackToken) {\n return {\n mention: (githubLogin: string) => '',\n postMessage: (githubLogin: string, text: string) => Promise.resolve(),\n };\n }\n\n const githubLoginToSlackEmail = getKeys(config.groups).reduce<{\n [login: string]: string;\n }>((acc, groupName) => {\n Object.assign(acc, config.groups[groupName]);\n return acc;\n }, {});\n\n const slackClient = new WebClient(config.slackToken);\n const allUsers: any = await slackClient.users.list({ limit: 200 });\n const members: [string, { member: any; im: any }][] = Object.values(\n githubLoginToSlackEmail,\n )\n .map((email) => {\n const member = allUsers.members.find(\n (user: any) => user.profile.email === email,\n );\n if (!member) {\n console.warn(`Could not find user ${email}`);\n return;\n }\n return [email, { member, im: undefined }] as [\n string,\n { member: any; im: any }\n ];\n })\n .filter(ExcludesFalsy);\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.im.open({ user: user.member.id });\n user.im = im.channel;\n } catch (err) {\n console.error(err);\n }\n }\n\n const membersMap = new Map(members);\n\n const getUserFromGithubLogin = (githubLogin: string) => {\n const email = githubLoginToSlackEmail[githubLogin];\n if (!email) return null;\n return membersMap.get(email);\n };\n\n return {\n mention: (githubLogin: string) => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (githubLogin: string, text: string) => {\n context.log.info('send slack', { githubLogin, text });\n if (process.env.DRY_RUN) return;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return;\n await slackClient.chat.postMessage({\n channel: user.im.id,\n text,\n });\n },\n };\n};\n","import { Context } from 'probot';\nimport { Config } from '../teamconfigs';\nimport { initTeamSlack, TeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface TeamContext {\n config: Config;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => string | undefined;\n getReviewerGroups: (githubLogins: string[]) => string[];\n reviewShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n}\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nconst initTeamContext = async (\n context: Context,\n config: Config,\n): Promise => {\n const slackPromise = initTeamSlack(context, config);\n\n const githubLoginToGroup = getKeys(config.groups).reduce>(\n (acc, groupName) => {\n Object.keys(config.groups[groupName]).forEach((login) => {\n acc.set(login, groupName);\n });\n return acc;\n },\n new Map(),\n );\n\n const getReviewerGroups = (githubLogins: string[]) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(Boolean),\n ),\n ];\n\n return {\n config,\n getReviewerGroup: (githubLogin) => githubLoginToGroup.get(githubLogin),\n getReviewerGroups: (githubLogins) => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ],\n\n reviewShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ) => {\n if (!reviewerGroup) return false;\n\n const requestedReviewerGroups = getReviewerGroups(\n requestedReviewers.map((request) => request.login),\n );\n\n // contains another request of a reviewer in the same group\n if (\n includesReviewerGroup &&\n requestedReviewerGroups.includes(reviewerGroup)\n ) {\n return true;\n }\n\n // contains a request from a dependent group\n if (config.waitForGroups && includesWaitForGroups) {\n const waitForGroups = config.waitForGroups;\n return requestedReviewerGroups.some((group) =>\n waitForGroups[reviewerGroup].includes(group),\n );\n }\n\n return false;\n },\n\n slack: await slackPromise,\n };\n};\n\nconst teamContextsPromise = new Map();\nconst teamContexts = new Map();\n\nexport const obtainTeamContext = (\n context: Context,\n config: Config,\n): Promise => {\n const owner = context.payload.repository.owner;\n\n const existingTeamContext = teamContexts.get(owner.login);\n if (existingTeamContext) return existingTeamContext;\n\n const existingPromise = teamContextsPromise.get(owner.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initTeamContext(context, config);\n teamContextsPromise.set(owner.login, promise);\n\n return promise.then((teamContext) => {\n teamContextsPromise.delete(owner.login);\n teamContexts.set(owner.login, teamContext);\n return teamContext;\n });\n};\n","/* eslint-disable max-lines */\n\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { teamConfigs, Config } from '../teamconfigs';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../pr-handlers/actions/autoMergeIfPossible';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainTeamContext, TeamContext } from './teamContext';\n\nexport interface LockedMergePr {\n id: number;\n number: number;\n branch: string;\n}\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n protectedLabelIds: readonly LabelResponse['id'][];\n\n hasNeedsReview: (labels: LabelResponse[]) => boolean;\n hasRequestedReview: (labels: LabelResponse[]) => boolean;\n hasChangesRequestedReview: (labels: LabelResponse[]) => boolean;\n hasApprovesReview: (labels: LabelResponse[]) => boolean;\n getNeedsReviewGroupNames: (labels: LabelResponse[]) => GroupNames[];\n\n lockPROrPRS(\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise;\n\n getMergeLockedPr(): LockedMergePr;\n addMergeLockPr(pr: LockedMergePr): void;\n removePrFromAutomergeQueue(context: Context, prNumber: number): void;\n reschedule(context: Context, pr: LockedMergePr): void;\n pushAutomergeQueue(pr: LockedMergePr): void;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport type RepoContext = TeamContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nasync function initRepoContext(\n context: Context,\n config: Config,\n): Promise> {\n const teamContext = await obtainTeamContext(context, config);\n const repoContext = Object.create(teamContext);\n\n const [labels] = await Promise.all([initRepoLabels(context, config)]);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewGroupNames\n .map((key: GroupNames) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const changesRequestedLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].changesRequested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const protectedLabelIds = [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ];\n\n const labelIdToGroupName = new Map();\n reviewGroupNames.forEach((key) => {\n const reviewGroupLabels = config.labels.review[key] as any;\n Object.keys(reviewGroupLabels).forEach((labelKey: string) => {\n labelIdToGroupName.set(labels[reviewGroupLabels[labelKey]].id, key);\n });\n });\n\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: LabelResponse[]) =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: LabelResponse[]): GroupNames[] =>\n labels\n .filter((label) => needsReviewLabelIds.includes(label.id))\n .map((label) => labelIdToGroupName.get(label.id))\n .filter(ExcludesFalsy);\n\n const lock = Lock();\n let lockMergePr: LockedMergePr | undefined;\n let automergeQueue: LockedMergePr[] = [];\n\n const lockPROrPRS = (\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n console.log('lock: try to lock pr', { prIdOrIds });\n lock(prIdOrIds, async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n console.log('lock: lock acquired', { prIdOrIds });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { prIdOrIds });\n release();\n reject(err);\n return;\n }\n console.log('lock: release pr', { prIdOrIds });\n release();\n resolve();\n });\n });\n\n const reschedule = (context: Context, pr: LockedMergePr) => {\n if (!pr) throw new Error('Cannot reschedule undefined');\n context.log.info('reschedule', pr);\n setTimeout(() => {\n lockPROrPRS('reschedule', () => {\n return lockPROrPRS(String(pr.id), async () => {\n const prResult = await context.github.pulls.get(\n context.repo({\n pull_number: pr.number,\n }),\n );\n await autoMergeIfPossible(context, repoContext, prResult.data);\n });\n });\n }, 1000);\n };\n\n return Object.assign(repoContext, {\n labels,\n protectedLabelIds,\n hasNeedsReview,\n hasRequestedReview,\n hasChangesRequestedReview,\n hasApprovesReview,\n getNeedsReviewGroupNames,\n\n getMergeLockedPr: () => lockMergePr,\n addMergeLockPr: (pr: LockedMergePr): void => {\n console.log('merge lock: lock', pr);\n if (lockMergePr && String(lockMergePr.number) === String(pr.number)) {\n return;\n }\n if (lockMergePr) throw new Error('Already have lock');\n lockMergePr = pr;\n },\n removePrFromAutomergeQueue: (context, prNumber: number | string): void => {\n context.log('merge lock: remove', { prNumber });\n if (lockMergePr && String(lockMergePr.number) === String(prNumber)) {\n lockMergePr = automergeQueue.shift();\n context.log('merge lock: next', { lockMergePr });\n if (lockMergePr) {\n reschedule(context, lockMergePr);\n }\n } else {\n automergeQueue = automergeQueue.filter(\n (value) => String(value.number) !== String(prNumber),\n );\n }\n },\n pushAutomergeQueue: (pr: LockedMergePr): void => {\n console.log('merge lock: push queue', {\n pr,\n lockMergePr,\n automergeQueue,\n });\n if (!automergeQueue.some((p) => p.number === pr.number)) {\n automergeQueue.push(pr);\n }\n },\n reschedule,\n\n lockPROrPRS,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n context: Context,\n): Promise | RepoContext | null => {\n const repo = context.payload.repository;\n if (\n repo.name === 'reviewflow-test' &&\n process.env.NAME !== 'reviewflow-test'\n ) {\n return null;\n }\n const owner = repo.owner;\n if (!teamConfigs[owner.login]) {\n console.warn(owner.login, Object.keys(teamConfigs));\n return null;\n }\n const key = repo.id;\n\n const existingRepoContext = repoContexts.get(key);\n if (existingRepoContext) return existingRepoContext;\n\n const existingPromise = repoContextsPromise.get(key);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initRepoContext(context, teamConfigs[owner.login]);\n repoContextsPromise.set(key, promise);\n\n return promise.then((repoContext) => {\n repoContextsPromise.delete(key);\n repoContexts.set(key, repoContext);\n return repoContext;\n });\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { obtainRepoContext, RepoContext } from '../context/repoContext';\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n) => Promise;\n\nexport type CallbackWithRepoContext = (\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const handlerPullRequestChange = async <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n callback: CallbackWithRepoContext,\n): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n repoContext.lockPROrPRS(String(context.payload.pull_request.id), async () => {\n await callback(repoContext);\n });\n};\n\ntype CallbackContextAndRepoContext = (\n context: Context,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: CallbackContextAndRepoContext,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport const createHandlerPullRequestsChange = (\n getPullRequests: (\n context: Context,\n repoContext: RepoContext,\n ) => { id: string | number }[],\n callback: CallbackContextAndRepoContext,\n) => async (context: Context): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n const prs = getPullRequests(context, repoContext);\n if (prs.length === 0) return;\n return repoContext.lockPROrPRS(prs.map((pr) => String(pr.id)), () =>\n callback(context, repoContext),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoAssignPRToCreator: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext) => {\n if (!repoContext.config.autoAssignToCreator) return;\n\n const pr = context.payload.pull_request;\n if (pr.assignees.length !== 0) return;\n if (pr.user.type === 'Bot') return;\n\n await context.github.issues.addAssignees(\n context.issue({\n assignees: [pr.user.login],\n }),\n );\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(/[\\s-]+\\[?\\s*ONK[- ](\\d+)\\s*]?\\s*$/i, ' ONK-$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 { StatusInfo } from '../../../teamconfigs/types';\nimport { parseBody } from './parseBody';\nimport { Options, optionsLabels } from './prOptions';\n\nconst toMarkdownOptions = (options: Record) => {\n return optionsLabels\n .map(\n ({ name, label }) =>\n `- [${options[name] ? 'x' : ' '}] ${label}`,\n )\n .join('\\n');\n};\n\nconst toMarkdownInfos = (infos: StatusInfo[]) => {\n return infos\n .map((info) => {\n if (info.url) return `[${info.title}](${info.url})`;\n return info.title;\n })\n .join('\\n');\n};\n\ninterface UpdatedBodyWithOptions {\n body: string;\n options?: Record;\n}\n\nexport const updateBody = (\n body: string,\n defaultConfig: Record,\n infos?: StatusInfo[],\n updateOptions?: Partial>,\n): UpdatedBodyWithOptions => {\n const parsed = parseBody(body, defaultConfig);\n if (!parsed) {\n console.info('could not parse body');\n return { body };\n }\n const {\n content,\n ending,\n reviewflowContentCol,\n reviewflowContentColPrefix,\n reviewflowContentColSuffix,\n options,\n } = parsed;\n\n // eslint-disable-next-line no-nested-ternary\n const infosParagraph = !infos\n ? reviewflowContentCol.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*)?#### Options:)?.*$/s,\n '$1',\n )\n : infos.length !== 0\n ? `#### Infos:\\n${toMarkdownInfos(infos)}\\n`\n : '';\n\n const updatedOptions = !updateOptions\n ? options\n : { ...options, ...updateOptions };\n\n return {\n options: updatedOptions,\n body: `${content}${reviewflowContentColPrefix}\n${infosParagraph}#### Options:\n${toMarkdownOptions(updatedOptions)}\n${reviewflowContentColSuffix}${ending || ''}`,\n };\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { StatusError, StatusInfo } from '../../teamconfigs/types';\nimport { cleanTitle } from './utils/cleanTitle';\nimport { updateBody } from './utils/updateBody';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\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 editOpenedPR = async (\n context: Context,\n repoContext: RepoContext,\n): Promise => {\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 title = repoContext.config.trimTitle ? cleanTitle(pr.title) : pr.title;\n\n const isPrFromBot = pr.user.type === 'Bot';\n\n const statuses: Status[] = [];\n\n const errorRule = repoContext.config.parsePR.title.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(pr.title);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n return true;\n }\n\n if (rule.status && rule.statusInfoFromMatch) {\n statuses.push({\n name: rule.status,\n info: rule.statusInfoFromMatch(match),\n });\n return false;\n }\n\n return false;\n });\n\n const date = new Date().toISOString();\n\n const hasLintPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find(\n (check) => check.name === `${process.env.NAME}/lint-pr`,\n );\n\n await Promise.all(\n [\n ...statuses.map(({ name, error, info }) =>\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/${name}`,\n sha: pr.head.sha,\n state: (error ? 'failure' : 'success') as 'failure' | 'success',\n target_url: error ? undefined : (info as StatusInfo).url,\n description: error ? error.title : (info as StatusInfo).title,\n }),\n ),\n ),\n hasLintPrCheck &&\n context.github.checks.create(\n context.repo({\n name: `${process.env.NAME}/lint-pr`,\n head_sha: pr.head.sha,\n status: 'completed' as 'completed',\n conclusion: (errorRule ? 'failure' : 'success') as\n | 'failure'\n | 'success',\n started_at: date,\n completed_at: date,\n output: errorRule\n ? errorRule.error\n : {\n title: '✓ Your PR is valid',\n summary: '',\n },\n }),\n ),\n !hasLintPrCheck &&\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/lint-pr`,\n sha: pr.head.sha,\n state: (errorRule ? 'failure' : 'success') as 'failure' | 'success',\n target_url: undefined,\n description: errorRule\n ? errorRule.error.title\n : '✓ Your PR is valid',\n }),\n ),\n ].filter(ExcludesFalsy),\n );\n\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n\n const prHasFeatureBranchLabel = Boolean(\n featureBranchLabel &&\n pr.labels.find((label): boolean => label.id === featureBranchLabel.id),\n );\n\n const prHasAutoMergeLabel = Boolean(\n automergeLabel &&\n pr.labels.find((label): boolean => label.id === automergeLabel.id),\n );\n\n const defaultOptions = {\n ...repoContext.config.prDefaultOptions,\n autoMerge: prHasAutoMergeLabel,\n featureBranch: prHasFeatureBranchLabel,\n };\n\n const { body, options } = updateBody(pr.body, defaultOptions, statuses\n .filter((status) => status.info && status.info.inBody)\n .map((status) => status.info) as StatusInfo[]);\n\n const hasDiffInTitle = pr.title !== title;\n const hasDiffInBody = pr.body !== body;\n if (hasDiffInTitle || hasDiffInBody) {\n const update: Partial> = {};\n if (hasDiffInTitle) {\n update.title = title;\n pr.title = title;\n }\n if (hasDiffInBody) {\n update.body = body;\n pr.body = body;\n }\n\n await context.github.issues.update(context.issue(update));\n }\n\n if (options && (featureBranchLabel || automergeLabel)) {\n if (featureBranchLabel) {\n if (prHasFeatureBranchLabel && !options.featureBranch) {\n await context.github.issues.removeLabel(\n context.issue({ name: featureBranchLabel.name }),\n );\n }\n if (options.featureBranch && !prHasFeatureBranchLabel) {\n await context.github.issues.addLabels(\n context.issue({ labels: [featureBranchLabel.name] }),\n );\n }\n }\n\n if (automergeLabel) {\n if (prHasAutoMergeLabel && !options.autoMerge) {\n await context.github.issues.removeLabel(\n context.issue({ name: automergeLabel.name }),\n );\n }\n if (options.autoMerge && !prHasAutoMergeLabel) {\n const result = await context.github.issues.addLabels(\n context.issue({ labels: [automergeLabel.name] }),\n );\n await autoMergeIfPossible(\n context,\n repoContext,\n context.payload.pull_request,\n result.data,\n );\n }\n }\n }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { RepoContext } from '../../context/repoContext';\n\nconst addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n pr: any,\n { state, description }: { state: 'failure' | 'success'; description: string },\n): Promise {\n const hasPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find((check) => check.name === process.env.NAME);\n\n context.log.info('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME as string,\n head_sha: pr.head.sha,\n started_at: pr.created_at,\n status: 'completed',\n conclusion: state,\n completed_at: new Date().toISOString(),\n output: {\n title: description,\n summary: '',\n },\n }),\n );\n } else {\n await context.github.repos.createStatus(\n context.repo({\n context: process.env.NAME,\n sha: pr.head.sha,\n state,\n target_url: undefined,\n description,\n }),\n );\n }\n};\n\nconst createFailedStatusCheck = (\n context: Context,\n pr: any,\n description: string,\n): Promise =>\n addStatusCheck(context, pr, {\n state: 'failure',\n description,\n });\n\nexport const updateStatusCheckFromLabels = (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n labels: LabelResponse[] = pr.labels || [],\n): Promise => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n if (pr.requested_reviewers.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${pr.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Changes requested ! Push commits or discuss changes then re-request a review.',\n );\n }\n\n const needsReviewGroupNames = repoContext.getNeedsReviewGroupNames(labels);\n\n if (needsReviewGroupNames.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${needsReviewGroupNames.join(\n ', ',\n )}. Perhaps request someone ?`,\n );\n }\n\n if (!repoContext.hasApprovesReview(labels)) {\n if (repoContext.config.requiresReviewRequest) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Awaiting review... Perhaps request someone ?',\n );\n }\n }\n\n // if (\n // repoContext.config.requiresReviewRequest &&\n // !repoContext.hasRequestedReview(labels)\n // ) {\n // return createFailedStatusCheck(\n // context,\n // pr,\n // 'You need to request someone to review the PR',\n // );\n // return;\n // }\n // return createInProgressStatusCheck(context);\n // } else if (repoContext.hasApprovesReview(labels)) {\n return addStatusCheck(context, pr, {\n state: 'success',\n description: '✓ PR ready to merge !',\n });\n // }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { GroupLabels } from '../../teamconfigs/types';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends Webhooks.WebhookPayloadPullRequest,\n GroupNames extends string = any\n>(\n context: Context,\n repoContext: RepoContext,\n reviewGroup: GroupNames,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n): Promise => {\n context.log.info('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n const pr = context.payload.pull_request;\n let prLabels = pr.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n\n const toAdd = new Set();\n const toDelete = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = repoContext.config.labels.review[reviewGroup];\n if (!reviewConfig) return undefined;\n\n return reviewConfig[key] && labels[reviewConfig[key]]\n ? labels[reviewConfig[key]]\n : undefined;\n };\n\n if (labelsToAdd) {\n labelsToAdd.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (\n !label ||\n prLabels.some((prLabel: LabelResponse) => prLabel.id === label.id)\n ) {\n return;\n }\n newLabelNames.add(label.name);\n toAdd.add(key);\n });\n }\n\n if (labelsToRemove) {\n labelsToRemove.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label) return;\n const existing = prLabels.find(\n (prLabel: LabelResponse) => prLabel.id === label.id,\n );\n if (existing) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n const result = await context.github.issues.replaceLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(context, repoContext, pr, prLabels);\n // }\n\n return prLabels;\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\n\nexport const autoApproveAndAutoMerge = async (\n context: Context,\n repoContext: RepoContext,\n): Promise => {\n // const autoMergeLabel = repoContext.labels['merge/automerge'];\n const codeApprovedLabel = repoContext.labels['code/approved'];\n const prLabels = context.payload.pull_request.labels;\n if (prLabels.find((l): boolean => l.id === codeApprovedLabel.id)) {\n await context.github.pulls.createReview(\n context.issue({ event: 'APPROVE' }),\n );\n }\n\n await autoMergeIfPossible(context, repoContext);\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { autoApproveAndAutoMerge } from './actions/autoApproveAndAutoMerge';\n\nexport default function opened(app: Application): void {\n app.on(\n 'pull_request.opened',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const fromRenovate = context.payload.pull_request.head.ref.startsWith(\n 'renovate/',\n );\n\n await Promise.all([\n autoAssignPRToCreator(context, repoContext),\n editOpenedPR(context, repoContext),\n fromRenovate\n ? autoApproveAndAutoMerge(context, repoContext)\n : updateReviewStatus(context, repoContext, 'dev', {\n add: ['needsReview'],\n remove: ['approved', 'changesRequested'],\n }),\n ]);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseBody } from './actions/utils/parseBody';\n\nexport default function closed(app: Application): void {\n app.on(\n 'pull_request.closed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const repo = context.payload.repository;\n const pr = context.payload.pull_request;\n\n if (pr.merged) {\n const parsedBody =\n pr.head.repo.id === repo.id &&\n parseBody(pr.body, repoContext.config.prDefaultOptions);\n\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(context, pr.number),\n parsedBody && parsedBody.options.deleteAfterMerge\n ? context.github.git\n .deleteRef(context.repo({ ref: `heads/${pr.head.ref}` }))\n .catch(() => {})\n : undefined,\n ]);\n } else {\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(context, pr.number),\n updateReviewStatus(context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewRequested(app: Application): void {\n app.on(\n 'pull_request.review_requested',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\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) ===\n reviewerGroup &&\n review.state === 'REQUEST_CHANGES' &&\n // In case this is a rerequest for review\n review.user.login !== reviewer.login,\n );\n\n if (!hasChangesRequestedInReviews) {\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved', 'changesRequested'],\n });\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${pr.html_url} !\\n> ${pr.title}`,\n );\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewRequestRemoved(app: Application): void {\n app.on(\n 'pull_request.review_request_removed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n const hasApprovedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'APPROVED',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: [\n // if changes requested by the one which requests was removed\n hasChangesRequestedInReviews && 'changesRequested',\n // if was already approved by another member in the group and has no other requests waiting\n approved && 'approved',\n ],\n // remove labels if has no other requests waiting\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n ],\n });\n }\n\n if (sender.login === reviewer.login) return;\n\n if (repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${pr.html_url}`,\n );\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewSubmitted(app: Application): void {\n app.on(\n 'pull_request_review.submitted',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const pr = context.payload.pull_request;\n const { user: reviewer, state } = (context.payload as any).review;\n if (pr.user.login === reviewer.login) return;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged;\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n // TODO reenable this when accepted can notify request review to slack (dev accepted => design requested) and flag to disable for label (approved design ; still waiting for dev ?)\n // includesWaitForGroups: true,\n },\n );\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const newLabels = await updateReviewStatus(\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !(\n hasRequestedReviewsForGroup || state === 'changes_requested'\n ) && 'requested',\n state === 'approved' &&\n !hasChangesRequestedInReviews &&\n 'changesRequested',\n state === 'changes_requested' && 'approved',\n ],\n },\n );\n\n if (approved && !hasChangesRequestedInReviews) {\n merged = await autoMergeIfPossible(\n context,\n repoContext,\n pr,\n newLabels,\n );\n }\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = pr.html_url;\n\n const message = (() => {\n if (state === 'changes_requested') {\n return `:x: ${mention} requests changes on ${prUrl}`;\n }\n if (state === 'approved') {\n return `:clap: :white_check_mark: ${mention} approves ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n return `:speech_balloon: ${mention} commented on ${prUrl}`;\n })();\n\n repoContext.slack.postMessage(pr.user.login, message);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewDismissed(app: Application): void {\n app.on(\n 'pull_request_review.dismissed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\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) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', 'requested'],\n remove: [\n !hasChangesRequestedInReviews && 'changesRequested',\n 'approved',\n ],\n });\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n repoContext.slack.postMessage(\n pr.user.login,\n `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${pr.html_url}`,\n );\n } else {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${pr.html_url}`,\n );\n }\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function synchronize(app: Application): void {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n // old and new sha\n // const { before, after } = context.payload;\n\n await Promise.all([\n editOpenedPR(context, repoContext),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(context, repoContext),\n // call autoMergeIfPossible to re-add to the queue when push is fixed\n autoMergeIfPossible(context, repoContext),\n ]);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function edited(app: Application): void {\n app.on(\n 'pull_request.edited',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const sender = context.payload.sender;\n if (sender.type === 'Bot') {\n return;\n }\n\n await editOpenedPR(context, repoContext);\n await autoMergeIfPossible(context, repoContext);\n },\n ),\n );\n}\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateBody } from './utils/updateBody';\nimport { Options } from './utils/prOptions';\n\nexport const updatePrBody = async <\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n repoContext: RepoContext,\n updateOptions: Partial>,\n): Promise => {\n const prBody = context.payload.pull_request.body;\n const { body } = updateBody(\n prBody,\n repoContext.config.prDefaultOptions,\n undefined,\n updateOptions,\n );\n\n if (body !== prBody) {\n await context.github.pulls.update(context.issue({ body }));\n }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Application, Context } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { updatePrBody } from './actions/updatePrBody';\n\nexport default function labelsChanged(app: Application): void {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n async (context: Context) => {\n const sender = context.payload.sender;\n const fromRenovate =\n sender.type === 'Bot' && sender.login === 'renovate[bot]';\n context.payload.pull_request.head.ref.startsWith('renovate/');\n\n if (sender.type === 'Bot' && !fromRenovate) {\n return;\n }\n\n await handlerPullRequestChange(context, async (repoContext) => {\n const label = (context.payload as any).label;\n if (fromRenovate) {\n const codeApprovedLabel = repoContext.labels['code/approved'];\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (context.payload.action === 'labeled') {\n if (codeApprovedLabel && label.id === codeApprovedLabel.id) {\n // const { data: reviews } = await context.github.pulls.listReviews(\n // context.issue({ per_page: 1 }),\n // );\n // if (reviews.length !== 0) {\n await context.github.pulls.createReview(\n context.issue({ event: 'APPROVE' }),\n );\n await updateStatusCheckFromLabels(\n context,\n repoContext,\n context.payload.pull_request,\n );\n await updatePrBody(context, repoContext, {\n autoMergeWithSkipCi: true,\n });\n // }\n } else if (autoMergeLabel && label.id === autoMergeLabel.id) {\n await updatePrBody(context, repoContext, {\n autoMerge: true,\n });\n }\n }\n return;\n }\n\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.github.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.github.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(context, repoContext);\n\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n\n if (\n (featureBranchLabel && label.id === automergeLabel.id) ||\n (automergeLabel && label.id === automergeLabel.id)\n ) {\n const option: 'featureBranch' | 'autoMerge' =\n featureBranchLabel && label.id === featureBranchLabel.id\n ? 'featureBranch'\n : 'autoMerge';\n await updatePrBody(context, repoContext, {\n [option]: context.payload.action === 'labeled',\n });\n } else if (context.payload.action === 'labeled') {\n if (\n repoContext.labels['merge/automerge'] &&\n label.id === repoContext.labels['merge/automerge'].id\n ) {\n await autoMergeIfPossible(context, repoContext);\n }\n }\n });\n },\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function checkrunCompleted(app: Application): void {\n app.on(\n 'check_run.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_run.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_run.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function checksuiteCompleted(app: Application): void {\n app.on(\n 'check_suite.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_suite.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_suite.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n}\n","import Webhooks from '@octokit/webhooks';\nimport { Application, Context } from 'probot';\nimport { LockedMergePr } from '../context/repoContext';\nimport { createHandlerPullRequestsChange } from './utils';\n\nconst isSameBranch = (\n context: Context,\n lockedPr: LockedMergePr,\n): boolean => {\n if (!lockedPr) return false;\n return !!context.payload.branches.find((b) => b.name === lockedPr.branch);\n};\n\nexport default function status(app: Application): void {\n app.on(\n 'status',\n createHandlerPullRequestsChange(\n (context, repoContext): LockedMergePr[] => {\n const lockedPr = repoContext.getMergeLockedPr();\n if (!lockedPr) return [];\n\n if (isSameBranch(context, lockedPr)) {\n return [lockedPr];\n }\n\n return [];\n },\n (context, repoContext): void => {\n const lockedPr = repoContext.getMergeLockedPr();\n // check if changed\n if (isSameBranch(context, lockedPr)) {\n repoContext.reschedule(context, lockedPr);\n }\n },\n ),\n );\n}\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\nimport closedHandler from './pr-handlers/closed';\nimport reviewRequestedHandler from './pr-handlers/reviewRequested';\nimport reviewRequestRemovedHandler from './pr-handlers/reviewRequestRemoved';\nimport reviewSubmittedHandler from './pr-handlers/reviewSubmitted';\nimport reviewDismissedHandler from './pr-handlers/reviewDismissed';\nimport synchromizeHandler from './pr-handlers/synchronize';\nimport editedHandler from './pr-handlers/edited';\nimport labelsChanged from './pr-handlers/labelsChanged';\nimport checkrunCompleted from './pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './pr-handlers/checksuiteCompleted';\nimport status from './pr-handlers/status';\n\nif (!process.env.NAME) process.env.NAME = 'reviewflow';\n\n// const getConfig = require('probot-config')\n// const { MongoClient } = require('mongodb');\n\n// const connect = MongoClient.connect(process.env.MONGO_URL);\n// const db = connect.then(client => client.db(process.env.MONGO_DB));\n\n// let config = await getConfig(context, 'reviewflow.yml');\n\n// eslint-disable-next-line import/no-commonjs\nProbot.run((app: Application) => {\n openedHandler(app);\n closedHandler(app);\n reviewRequestedHandler(app);\n reviewRequestRemovedHandler(app);\n\n // app.on('pull_request.closed', async context => {\n\n // });\n\n // app.on('pull_request.reopened', async context => {\n\n // });\n\n reviewSubmittedHandler(app);\n reviewDismissedHandler(app);\n labelsChanged(app);\n synchromizeHandler(app);\n editedHandler(app);\n\n checkrunCompleted(app);\n checksuiteCompleted(app);\n status(app);\n});\n"],"names":["config","slackToken","process","env","ORNIKAR_SLACK_TOKEN","autoAssignToCreator","trimTitle","requiresReviewRequest","prDefaultOptions","featureBranch","autoMergeWithSkipCi","autoMerge","deleteAfterMerge","parsePR","title","regExp","error","summary","bot","status","statusInfoFromMatch","match","issue","inBody","url","groups","dev","abarreir","ORNIKAR_EMAIL_DOMAIN","arthurflachs","CorentinAndre","rigma","damienorny","darame07","Pixy","christophehurpeau","HugoGarrido","LentnerStefan","Mxime","tilap","design","jperriere","CoralineColasse","waitForGroups","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","teamConfigs","ornikar","options","optionsRegexps","map","option","regexp","RegExp","optionsLabels","label","commentStart","commentEnd","regexpCols","regexpReviewflowCol","parseOptions","content","defaultConfig","reduce","acc","exec","parseBody","description","reviewFlowCol","reviewflowContent","ending","reviewFlowColMatch","reviewflowContentCol","reviewflowContentColPrefix","reviewflowContentColSuffix","hasFailedStatusOrChecks","context","repoContext","pr","checks","github","listForRef","repo","ref","head","sha","per_page","failedChecks","data","check_runs","filter","check","conclusion","length","log","info","id","combinedStatus","repos","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","payload","pull_request","prLabels","autoMergeLabel","createMergeLockPrFromPr","number","branch","find","l","debug","removePrFromAutomergeQueue","hasNeedsReview","hasRequestedReview","lockedPr","getMergeLockedPr","pushAutomergeQueue","addMergeLockPr","mergeable","undefined","prResult","pulls","get","pull_number","merged","mergeable_state","reschedule","startsWith","issues","update","body","replace","base","merge","owner","login","parsedBody","mergeResult","merge_method","commit_title","commit_message","Boolean","err","message","initRepoLabels","listLabelsForRepo","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","existingLabel","result","createLabel","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","initTeamSlack","mention","postMessage","Promise","resolve","githubLoginToSlackEmail","groupName","assign","slackClient","WebClient","allUsers","users","limit","members","values","email","member","user","profile","console","warn","im","open","channel","membersMap","Map","getUserFromGithubLogin","githubLogin","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","set","getReviewerGroups","githubLogins","Set","getReviewerGroup","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","some","group","slack","teamContextsPromise","teamContexts","obtainTeamContext","repository","existingTeamContext","existingPromise","promise","then","teamContext","delete","initRepoContext","create","all","reviewGroupNames","needsReviewLabelIds","key","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","protectedLabelIds","labelIdToGroupName","reviewGroupLabels","lock","Lock","lockMergePr","automergeQueue","lockPROrPRS","prIdOrIds","callback","reject","createReleaseCallback","release","Error","setTimeout","String","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","prNumber","shift","value","p","push","repoContextsPromise","repoContexts","obtainRepoContext","NAME","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","createHandlerPullRequestsChange","getPullRequests","prs","autoAssignPRToCreator","assignees","type","addAssignees","cleanTitle","trim","s","arg1","toLowerCase","toMarkdownOptions","join","toMarkdownInfos","infos","updateBody","updateOptions","parsed","infosParagraph","updatedOptions","editOpenedPR","isPrFromBot","errorRule","rule","date","Date","toISOString","hasLintPrCheck","createStatus","target_url","head_sha","started_at","completed_at","output","featureBranchLabel","automergeLabel","prHasFeatureBranchLabel","prHasAutoMergeLabel","defaultOptions","hasDiffInTitle","hasDiffInBody","removeLabel","addLabels","addStatusCheck","hasPrCheck","created_at","createFailedStatusCheck","updateStatusCheckFromLabels","requested_reviewers","rr","needsReviewGroupNames","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","newLabelNamesArray","oldLabels","size","replaceLabels","autoApproveAndAutoMerge","codeApprovedLabel","createReview","event","opened","app","on","fromRenovate","closed","git","deleteRef","catch","reviewRequested","sender","reviewer","requested_reviewer","reviews","listReviews","hasChangesRequestedInReviews","html_url","reviewRequestRemoved","hasRequestedReviewsForGroup","hasApprovedInReviews","reviewSubmitted","newLabels","prUrl","reviewDismissed","synchronize","edited","updatePrBody","prBody","labelsChanged","action","checkrunCompleted","check_run","pull_requests","checksuiteCompleted","check_suite","isSameBranch","branches","b","Probot","run","openedHandler","closedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","synchromizeHandler","editedHandler"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index-node10.cjs.js","sources":["../src/orgsConfigs/ornikar.ts","../src/orgsConfigs/christophehurpeau.ts","../src/orgsConfigs/index.ts","../src/pr-handlers/actions/utils/prOptions.ts","../src/pr-handlers/actions/utils/parseBody.ts","../src/pr-handlers/actions/autoMergeIfPossible.ts","../src/context/initRepoLabels.ts","../src/context/utils.ts","../src/context/initTeamSlack.ts","../src/context/orgContext.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/utils/updateBody.ts","../src/pr-handlers/actions/editOpenedPR.ts","../src/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/pr-handlers/actions/updateReviewStatus.ts","../src/pr-handlers/actions/autoApproveAndAutoMerge.ts","../src/pr-handlers/opened.ts","../src/pr-handlers/closed.ts","../src/pr-handlers/reviewRequested.ts","../src/pr-handlers/reviewRequestRemoved.ts","../src/pr-handlers/reviewSubmitted.ts","../src/pr-handlers/reviewDismissed.ts","../src/pr-handlers/synchronize.ts","../src/pr-handlers/edited.ts","../src/pr-handlers/actions/updatePrBody.ts","../src/pr-handlers/labelsChanged.ts","../src/pr-handlers/checkrunCompleted.ts","../src/pr-handlers/checksuiteCompleted.ts","../src/pr-handlers/status.ts","../src/index.ts"],"sourcesContent":["import { Config } from './types';\n\nconst config: Config<'dev' | 'design', 'frontends' | 'backends'> = {\n slackToken: process.env.ORNIKAR_SLACK_TOKEN,\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: true,\n prDefaultOptions: {\n featureBranch: false,\n autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\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 inBody: true,\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 /* back */\n abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'Thierry-girod': `thierry${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n darame07: `kevin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Pixy: `pierre-alexis${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n /* front */\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${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\n teams: {\n backends: {\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'rigma',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'tilap',\n '63m29',\n ],\n labels: ['teams/frontend'],\n },\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: '#FFC44C',\n },\n 'code/review-requested': {\n name: ':ok_hand: code/review-requested',\n color: '#DAE1E6',\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: '#FFC44C',\n },\n 'design/review-requested': {\n name: ':art: design/review-requested',\n color: '#DAE1E6',\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 /* teams */\n\n 'teams/backend': {\n name: 'backend',\n color: '#6ad8cb',\n },\n 'teams/frontend': {\n name: 'frontend',\n color: '#8a5abc',\n },\n\n /* auto merge */\n 'merge/automerge': {\n name: ':soon: automerge',\n color: '#64DD17',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\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', never> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prDefaultOptions: {\n featureBranch: false,\n autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\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 tilap: 'jlavinh@gmail.com',\n },\n },\n waitForGroups: {\n dev: [],\n },\n teams: {},\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\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n dev: {\n needsReview: 'code/needs-review',\n requested: 'code/review-requested',\n changesRequested: 'code/changes-requested',\n approved: 'code/approved',\n },\n },\n },\n};\n\nexport default config;\n","import { Config as ConfigType } from './types';\nimport ornikar from './ornikar';\nimport christophehurpeau from './christophehurpeau';\n\nexport type Config<\n GroupNames extends string = any,\n TeamNames extends string = any\n> = ConfigType;\n\nexport const orgsConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n};\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","export type Options =\n | 'featureBranch'\n | 'autoMergeWithSkipCi'\n | 'autoMerge'\n | 'deleteAfterMerge';\n\nexport const options: Options[] = [\n 'featureBranch',\n 'autoMergeWithSkipCi',\n 'autoMerge',\n 'deleteAfterMerge',\n];\nexport const optionsRegexps: { name: Options; regexp: RegExp }[] = options.map(\n (option) => ({\n name: option,\n regexp: new RegExp(`\\\\[([ xX]?)]\\\\s*`),\n }),\n);\n\nexport const optionsLabels: { name: Options; label: string }[] = [\n { name: 'featureBranch', label: 'This PR is a feature branch' },\n {\n name: 'autoMergeWithSkipCi',\n label: 'Auto merge with `[skip ci]`',\n },\n {\n name: 'autoMerge',\n label:\n 'Auto merge when this PR is ready and has no failed statuses. (Also has a queue per repo to prevent multiple useless \"Update branch\" triggers)',\n },\n {\n name: 'deleteAfterMerge',\n label: 'Automatic branch delete after this PR is merged',\n },\n];\n","import { Options, optionsRegexps } from './prOptions';\n\nconst commentStart = '';\nconst commentEnd = \"\";\n\nconst regexpCols = /^(.*)((.*))(.*)$/is;\nconst regexpReviewflowCol = /^(\\s*<\\/td>]*>)\\s*(.*)\\s*(<\\/td><\\/tr><\\/table>\\s*)\\s*$/is;\n\nconst parseOptions = (\n content: string,\n defaultConfig: Record,\n): Record => {\n return optionsRegexps.reduce(\n (acc, { name, regexp }) => {\n const match = regexp.exec(content);\n acc[name] = !match\n ? defaultConfig[name] || false\n : match[1] === 'x' || match[1] === 'X';\n return acc;\n },\n {} as any,\n ) as Record;\n};\n\nexport const parseBody = (\n description: string,\n defaultConfig: Record,\n) => {\n const match = regexpCols.exec(description);\n if (!match) return null;\n const [, content, reviewFlowCol, reviewflowContent, ending] = match;\n const reviewFlowColMatch = regexpReviewflowCol.exec(reviewFlowCol);\n if (!reviewFlowColMatch) {\n return {\n content,\n ending,\n reviewflowContentCol: reviewflowContent,\n reviewflowContentColPrefix: commentStart,\n reviewflowContentColSuffix: commentEnd,\n options: parseOptions(reviewFlowCol, defaultConfig),\n };\n }\n const [\n ,\n reviewflowContentColPrefix,\n reviewflowContentCol,\n reviewflowContentColSuffix,\n ] = reviewFlowColMatch;\n\n return {\n content,\n ending,\n reviewflowContentCol,\n reviewflowContentColPrefix,\n reviewflowContentColSuffix,\n options: parseOptions(reviewflowContentCol, defaultConfig),\n };\n};\n","/* eslint-disable max-lines */\nimport { Context } from 'probot';\n// eslint-disable-next-line import/no-cycle\nimport { RepoContext } from '../../context/repoContext';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { parseBody } from './utils/parseBody';\n\nconst hasFailedStatusOrChecks = async (\n context: Context,\n repoContext: RepoContext,\n pr: any,\n) => {\n const checks = await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n const failedChecks = checks.data.check_runs.filter(\n (check) => check.conclusion === 'failure',\n );\n\n if (failedChecks.length !== 0) {\n context.log.info(`automerge not possible: failed check pr ${pr.id}`, {\n checks: failedChecks.map((check) => check.name),\n });\n return true;\n }\n\n const combinedStatus = await context.github.repos.getCombinedStatusForRef(\n context.repo({\n ref: pr.head.sha,\n per_page: 100,\n }),\n );\n\n if (combinedStatus.data.state === 'failure') {\n const failedStatuses = combinedStatus.data.statuses.filter(\n (status) => status.state === 'failure' || status.state === 'error',\n );\n\n context.log.info(`automerge not possible: failed status pr ${pr.id}`, {\n statuses: failedStatuses.map((status) => status.context),\n });\n\n return true;\n }\n\n return false;\n};\n\nexport const autoMergeIfPossible = async (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n prLabels: LabelResponse[] = pr.labels,\n): Promise => {\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (!autoMergeLabel) return false;\n\n const createMergeLockPrFromPr = () => ({\n id: pr.id,\n number: pr.number,\n branch: pr.head.ref,\n });\n\n if (!prLabels.find((l): boolean => l.id === autoMergeLabel.id)) {\n context.log.debug('automerge not possible: no label');\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n }\n\n if (pr.state !== 'open') {\n context.log.debug('automerge not possible: pr is not opened');\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n }\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n context.log.debug('automerge not possible: blocking labels');\n // repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n }\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (lockedPr && lockedPr.number !== pr.number) {\n context.log.info(`automerge not possible: locked pr ${pr.id}`);\n repoContext.pushAutomergeQueue(createMergeLockPrFromPr());\n return false;\n }\n\n repoContext.addMergeLockPr(createMergeLockPrFromPr());\n\n if (pr.mergeable === undefined) {\n const prResult = await context.github.pulls.get(\n context.repo({\n pull_number: pr.number,\n }),\n );\n pr = prResult.data;\n }\n\n if (pr.merged) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n context.log.info(`automerge not possible: already merged pr ${pr.id}`);\n return false;\n }\n\n context.log.info(\n `automerge?: ${pr.id}, mergeable=${pr.mergeable} state=${\n pr.mergeable_state\n }`,\n );\n\n // https://github.com/octokit/octokit.net/issues/1763\n if (\n !(\n pr.mergeable_state === 'clean' ||\n pr.mergeable_state === 'has_hooks' ||\n pr.mergeable_state === 'unstable'\n )\n ) {\n if (!pr.mergeable_state || pr.mergeable_state === 'unknown') {\n context.log.info(`automerge not possible: rescheduling ${pr.id}`);\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n\n if (pr.head.ref.startsWith('renovate/')) {\n if (pr.mergeable_state === 'behind' || pr.mergeable_state === 'dirty') {\n context.log.info(\n `automerge not possible: rebase renovate branch pr ${pr.id}`,\n );\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n\n await context.github.issues.update(\n context.repo({\n number: pr.number,\n body: pr.body.replace(\n '[ ] ',\n '[x] ',\n ),\n }),\n );\n return false;\n }\n\n if (await hasFailedStatusOrChecks(context, repoContext, pr)) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n } else if (pr.mergeable_state === 'blocked') {\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n\n context.log.info(\n `automerge not possible: renovate with mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n if (pr.mergeable_state === 'blocked') {\n if (await hasFailedStatusOrChecks(context, repoContext, pr)) {\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return false;\n } else {\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n }\n\n if (pr.mergeable_state === 'behind') {\n context.log.info('automerge not possible: update branch', {\n head: pr.head.ref,\n base: pr.base.ref,\n });\n\n await context.github.repos.merge({\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n head: pr.base.ref,\n base: pr.head.ref,\n });\n\n return false;\n }\n\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${\n pr.mergeable_state\n }`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pr.number}`);\n\n const parsedBody = parseBody(pr.body, repoContext.config.prDefaultOptions);\n const options =\n (parsedBody && parsedBody.options) || repoContext.config.prDefaultOptions;\n\n const mergeResult = await context.github.pulls.merge({\n merge_method: options.featureBranch ? 'merge' : 'squash',\n owner: pr.head.repo.owner.login,\n repo: pr.head.repo.name,\n pull_number: pr.number,\n commit_title: `${pr.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pr.number})`,\n commit_message: '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removePrFromAutomergeQueue(context, pr.number);\n return Boolean(mergeResult.data.merged);\n } catch (err) {\n context.log.info('could not merge:', err.message);\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n};\n","import { Context } from 'probot';\nimport { Config } from '../orgsConfigs';\n\nexport interface LabelResponse {\n id: number;\n node_id: string;\n url: string;\n name: string;\n description: string;\n color: string;\n default: boolean;\n}\n\nexport interface Labels {\n [key: string]: LabelResponse;\n}\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const { data: labels } = await context.github.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n const finalLabels: Record = {};\n\n for (const [labelKey, labelConfig] of Object.entries(config.labels.list)) {\n const labelColor = labelConfig.color.slice(1);\n const description = `Generated by review-flow for ${labelKey}`;\n\n let existingLabel = labels.find((label) => label.name === labelConfig.name);\n if (!existingLabel) {\n existingLabel = labels.find((label) => label.description === description);\n }\n if (!existingLabel) {\n if (labelKey === 'design/needs-review') {\n existingLabel = labels.find(\n (label) => label.name === 'needs-design-review',\n );\n }\n if (labelKey === 'design/approved') {\n existingLabel = labels.find(\n (label) => label.name === 'design-reviewed',\n );\n }\n }\n\n if (!existingLabel) {\n const result = await context.github.issues.createLabel(\n context.repo({\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else if (\n existingLabel.name !== labelConfig.name ||\n existingLabel.color !== labelColor // ||\n // TODO: description is never updated\n // existingLabel.description !== description\n ) {\n context.log.info('Needs to update label', {\n current_name: existingLabel.name,\n name: existingLabel.name !== labelConfig.name && labelConfig.name,\n color: existingLabel.color !== labelColor && labelColor,\n description: existingLabel.description !== description && description,\n });\n\n const result = await context.github.issues.updateLabel(\n context.repo({\n current_name: existingLabel.name,\n name: labelConfig.name,\n color: labelColor,\n description,\n }),\n );\n finalLabels[labelKey] = result.data;\n } else {\n finalLabels[labelKey] = existingLabel;\n }\n }\n\n return finalLabels;\n};\n","export const getKeys = (o: T): (keyof T)[] =>\n Object.keys(o) as (keyof T)[];\n","import { WebClient } from '@slack/web-api';\nimport { Context } from 'probot';\nimport { Config } from '../orgsConfigs';\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 '../orgsConfigs';\nimport { initTeamSlack, TeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface OrgContext<\n GroupNames extends string = any,\n TeamNames extends string = any\n> {\n config: Config;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => string | undefined;\n getReviewerGroups: (githubLogins: string[]) => string[];\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\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 = new Map();\n getKeys(config.groups).forEach((groupName) => {\n Object.keys(config.groups[groupName]).forEach((login) => {\n githubLoginToGroup.set(login, groupName);\n });\n });\n\n const githubLoginToTeams = new Map();\n getKeys(config.teams || {}).forEach((acc, teamName) => {\n (config.teams as NonNullable)[teamName].logins.forEach(\n (login) => {\n if (acc.has(login)) {\n acc.get(login).push(teamName);\n } else {\n acc.set(login, [teamName]);\n }\n },\n );\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 getTeamsForLogin: (githubLogin) =>\n githubLoginToTeams.get(githubLogin) || [],\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 orgContextsPromise = new Map();\nconst orgContexts = new Map();\n\nexport const obtainOrgContext = (\n context: Context,\n config: Config,\n): Promise => {\n const owner = context.payload.repository.owner;\n\n const existingTeamContext = orgContexts.get(owner.login);\n if (existingTeamContext) return existingTeamContext;\n\n const existingPromise = orgContextsPromise.get(owner.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initTeamContext(context, config);\n orgContextsPromise.set(owner.login, promise);\n\n return promise.then((orgContext) => {\n orgContextsPromise.delete(owner.login);\n orgContexts.set(owner.login, orgContext);\n return orgContext;\n });\n};\n","/* eslint-disable max-lines */\n\nimport { Lock } from 'lock';\nimport { Context } from 'probot';\nimport { orgsConfigs, Config } from '../orgsConfigs';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../pr-handlers/actions/autoMergeIfPossible';\nimport { initRepoLabels, LabelResponse, Labels } from './initRepoLabels';\nimport { obtainOrgContext, OrgContext } from './orgContext';\n\nexport interface LockedMergePr {\n id: number;\n number: number;\n branch: string;\n}\n\ninterface RepoContextWithoutTeamContext {\n labels: Labels;\n protectedLabelIds: readonly LabelResponse['id'][];\n\n hasNeedsReview: (labels: LabelResponse[]) => boolean;\n hasRequestedReview: (labels: LabelResponse[]) => boolean;\n hasChangesRequestedReview: (labels: LabelResponse[]) => boolean;\n hasApprovesReview: (labels: LabelResponse[]) => boolean;\n getNeedsReviewGroupNames: (labels: LabelResponse[]) => GroupNames[];\n\n lockPROrPRS(\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise;\n\n getMergeLockedPr(): LockedMergePr;\n addMergeLockPr(pr: LockedMergePr): void;\n removePrFromAutomergeQueue(context: Context, prNumber: number): void;\n reschedule(context: Context, pr: LockedMergePr): void;\n pushAutomergeQueue(pr: LockedMergePr): void;\n}\n\nconst ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport type RepoContext = OrgContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nasync function initRepoContext(\n context: Context,\n config: Config,\n): Promise> {\n const orgContext = await obtainOrgContext(context, config);\n const repoContext = Object.create(orgContext);\n\n const [labels] = await Promise.all([initRepoLabels(context, config)]);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const needsReviewLabelIds = reviewGroupNames\n .map((key: GroupNames) => config.labels.review[key].needsReview)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const requestedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].requested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const changesRequestedLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].changesRequested)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const approvedReviewLabelIds = reviewGroupNames\n .map((key) => config.labels.review[key].approved)\n .filter(Boolean)\n .map((name) => labels[name].id);\n\n const protectedLabelIds = [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ];\n\n const labelIdToGroupName = new Map();\n reviewGroupNames.forEach((key) => {\n const reviewGroupLabels = config.labels.review[key] as any;\n Object.keys(reviewGroupLabels).forEach((labelKey: string) => {\n labelIdToGroupName.set(labels[reviewGroupLabels[labelKey]].id, key);\n });\n });\n\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: LabelResponse[]) =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: LabelResponse[]) =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: LabelResponse[]) =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: LabelResponse[]): GroupNames[] =>\n labels\n .filter((label) => needsReviewLabelIds.includes(label.id))\n .map((label) => labelIdToGroupName.get(label.id))\n .filter(ExcludesFalsy);\n\n const lock = Lock();\n let lockMergePr: LockedMergePr | undefined;\n let automergeQueue: LockedMergePr[] = [];\n\n const lockPROrPRS = (\n prIdOrIds: string | string[],\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n console.log('lock: try to lock pr', { prIdOrIds });\n lock(prIdOrIds, async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n console.log('lock: lock acquired', { prIdOrIds });\n try {\n await callback();\n } catch (err) {\n console.log('lock: release pr (with error)', { prIdOrIds });\n release();\n reject(err);\n return;\n }\n console.log('lock: release pr', { prIdOrIds });\n release();\n resolve();\n });\n });\n\n const reschedule = (context: Context, pr: LockedMergePr) => {\n if (!pr) throw new Error('Cannot reschedule undefined');\n context.log.info('reschedule', pr);\n setTimeout(() => {\n lockPROrPRS('reschedule', () => {\n return lockPROrPRS(String(pr.id), async () => {\n const prResult = await context.github.pulls.get(\n context.repo({\n pull_number: pr.number,\n }),\n );\n await autoMergeIfPossible(context, repoContext, prResult.data);\n });\n });\n }, 1000);\n };\n\n return Object.assign(repoContext, {\n labels,\n protectedLabelIds,\n hasNeedsReview,\n hasRequestedReview,\n hasChangesRequestedReview,\n hasApprovesReview,\n getNeedsReviewGroupNames,\n\n getMergeLockedPr: () => lockMergePr,\n addMergeLockPr: (pr: LockedMergePr): void => {\n console.log('merge lock: lock', pr);\n if (lockMergePr && String(lockMergePr.number) === String(pr.number)) {\n return;\n }\n if (lockMergePr) throw new Error('Already have lock');\n lockMergePr = pr;\n },\n removePrFromAutomergeQueue: (context, prNumber: number | string): void => {\n context.log('merge lock: remove', { prNumber });\n if (lockMergePr && String(lockMergePr.number) === String(prNumber)) {\n lockMergePr = automergeQueue.shift();\n context.log('merge lock: next', { lockMergePr });\n if (lockMergePr) {\n reschedule(context, lockMergePr);\n }\n } else {\n automergeQueue = automergeQueue.filter(\n (value) => String(value.number) !== String(prNumber),\n );\n }\n },\n pushAutomergeQueue: (pr: LockedMergePr): void => {\n console.log('merge lock: push queue', {\n pr,\n lockMergePr,\n automergeQueue,\n });\n if (!automergeQueue.some((p) => p.number === pr.number)) {\n automergeQueue.push(pr);\n }\n },\n reschedule,\n\n lockPROrPRS,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n context: Context,\n): Promise | RepoContext | null => {\n const repo = context.payload.repository;\n if (\n repo.name === 'reviewflow-test' &&\n process.env.NAME !== 'reviewflow-test'\n ) {\n return null;\n }\n const owner = repo.owner;\n if (!orgsConfigs[owner.login]) {\n console.warn(owner.login, Object.keys(orgsConfigs));\n return null;\n }\n const key = repo.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, orgsConfigs[owner.login]);\n repoContextsPromise.set(key, promise);\n\n return promise.then((repoContext) => {\n repoContextsPromise.delete(key);\n repoContexts.set(key, repoContext);\n return repoContext;\n });\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { obtainRepoContext, RepoContext } from '../context/repoContext';\n\nexport type Handler = (\n context: Context,\n repoContext: RepoContext,\n) => Promise;\n\nexport type CallbackWithRepoContext = (\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const handlerPullRequestChange = async <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n callback: CallbackWithRepoContext,\n): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n repoContext.lockPROrPRS(String(context.payload.pull_request.id), async () => {\n await callback(repoContext);\n });\n};\n\ntype CallbackContextAndRepoContext = (\n context: Context,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createHandlerPullRequestChange = <\n T extends Webhooks.WebhookPayloadPullRequest\n>(\n callback: CallbackContextAndRepoContext,\n) => (context: Context) => {\n return handlerPullRequestChange(context, (repoContext) =>\n callback(context, repoContext),\n );\n};\n\nexport const createHandlerPullRequestsChange = (\n getPullRequests: (\n context: Context,\n repoContext: RepoContext,\n ) => { id: string | number }[],\n callback: CallbackContextAndRepoContext,\n) => async (context: Context): Promise => {\n const repoContext = await obtainRepoContext(context);\n if (!repoContext) return;\n\n const prs = getPullRequests(context, repoContext);\n if (prs.length === 0) return;\n return repoContext.lockPROrPRS(prs.map((pr) => String(pr.id)), () =>\n callback(context, repoContext),\n );\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Handler } from '../utils';\n\nexport const autoAssignPRToCreator: Handler<\n Webhooks.WebhookPayloadPullRequest\n> = async (context, repoContext) => {\n if (!repoContext.config.autoAssignToCreator) return;\n\n const pr = context.payload.pull_request;\n if (pr.assignees.length !== 0) return;\n if (pr.user.type === 'Bot') return;\n\n await context.github.issues.addAssignees(\n context.issue({\n assignees: [pr.user.login],\n }),\n );\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(/[\\s-]+\\[?\\s*ONK[- ](\\d+)\\s*]?\\s*$/i, ' ONK-$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 { StatusInfo } from '../../../orgsConfigs/types';\nimport { parseBody } from './parseBody';\nimport { Options, optionsLabels } from './prOptions';\n\nconst toMarkdownOptions = (options: Record) => {\n return optionsLabels\n .map(\n ({ name, label }) =>\n `- [${options[name] ? 'x' : ' '}] ${label}`,\n )\n .join('\\n');\n};\n\nconst toMarkdownInfos = (infos: StatusInfo[]) => {\n return infos\n .map((info) => {\n if (info.url) return `[${info.title}](${info.url})`;\n return info.title;\n })\n .join('\\n');\n};\n\ninterface UpdatedBodyWithOptions {\n body: string;\n options?: Record;\n}\n\nexport const updateBody = (\n body: string,\n defaultConfig: Record,\n infos?: StatusInfo[],\n updateOptions?: Partial>,\n): UpdatedBodyWithOptions => {\n const parsed = parseBody(body, defaultConfig);\n if (!parsed) {\n console.info('could not parse body');\n return { body };\n }\n const {\n content,\n ending,\n reviewflowContentCol,\n reviewflowContentColPrefix,\n reviewflowContentColSuffix,\n options,\n } = parsed;\n\n // eslint-disable-next-line no-nested-ternary\n const infosParagraph = !infos\n ? reviewflowContentCol.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*)?#### Options:)?.*$/s,\n '$1',\n )\n : infos.length !== 0\n ? `#### Infos:\\n${toMarkdownInfos(infos)}\\n`\n : '';\n\n const updatedOptions = !updateOptions\n ? options\n : { ...options, ...updateOptions };\n\n return {\n options: updatedOptions,\n body: `${content}${reviewflowContentColPrefix}\n${infosParagraph}#### Options:\n${toMarkdownOptions(updatedOptions)}\n${reviewflowContentColSuffix}${ending || ''}`,\n };\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { StatusError, StatusInfo } from '../../orgsConfigs/types';\nimport { cleanTitle } from './utils/cleanTitle';\nimport { updateBody } from './utils/updateBody';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\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 editOpenedPR = async (\n context: Context,\n repoContext: RepoContext,\n): Promise => {\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 title = repoContext.config.trimTitle ? cleanTitle(pr.title) : pr.title;\n\n const isPrFromBot = pr.user.type === 'Bot';\n\n const statuses: Status[] = [];\n\n const errorRule = repoContext.config.parsePR.title.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(pr.title);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n return true;\n }\n\n if (rule.status && rule.statusInfoFromMatch) {\n statuses.push({\n name: rule.status,\n info: rule.statusInfoFromMatch(match),\n });\n return false;\n }\n\n return false;\n });\n\n const date = new Date().toISOString();\n\n const hasLintPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find(\n (check) => check.name === `${process.env.NAME}/lint-pr`,\n );\n\n await Promise.all(\n [\n ...statuses.map(({ name, error, info }) =>\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/${name}`,\n sha: pr.head.sha,\n state: (error ? 'failure' : 'success') as 'failure' | 'success',\n target_url: error ? undefined : (info as StatusInfo).url,\n description: error ? error.title : (info as StatusInfo).title,\n }),\n ),\n ),\n hasLintPrCheck &&\n context.github.checks.create(\n context.repo({\n name: `${process.env.NAME}/lint-pr`,\n head_sha: pr.head.sha,\n status: 'completed' as 'completed',\n conclusion: (errorRule ? 'failure' : 'success') as\n | 'failure'\n | 'success',\n started_at: date,\n completed_at: date,\n output: errorRule\n ? errorRule.error\n : {\n title: '✓ Your PR is valid',\n summary: '',\n },\n }),\n ),\n !hasLintPrCheck &&\n context.github.repos.createStatus(\n context.repo({\n context: `${process.env.NAME}/lint-pr`,\n sha: pr.head.sha,\n state: (errorRule ? 'failure' : 'success') as 'failure' | 'success',\n target_url: undefined,\n description: errorRule\n ? errorRule.error.title\n : '✓ Your PR is valid',\n }),\n ),\n ].filter(ExcludesFalsy),\n );\n\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n\n const prHasFeatureBranchLabel = Boolean(\n featureBranchLabel &&\n pr.labels.find((label): boolean => label.id === featureBranchLabel.id),\n );\n\n const prHasAutoMergeLabel = Boolean(\n automergeLabel &&\n pr.labels.find((label): boolean => label.id === automergeLabel.id),\n );\n\n const defaultOptions = {\n ...repoContext.config.prDefaultOptions,\n autoMerge: prHasAutoMergeLabel,\n featureBranch: prHasFeatureBranchLabel,\n };\n\n const { body, options } = updateBody(pr.body, defaultOptions, statuses\n .filter((status) => status.info && status.info.inBody)\n .map((status) => status.info) as StatusInfo[]);\n\n const hasDiffInTitle = pr.title !== title;\n const hasDiffInBody = pr.body !== body;\n if (hasDiffInTitle || hasDiffInBody) {\n const update: Partial> = {};\n if (hasDiffInTitle) {\n update.title = title;\n pr.title = title;\n }\n if (hasDiffInBody) {\n update.body = body;\n pr.body = body;\n }\n\n await context.github.issues.update(context.issue(update));\n }\n\n if (options && (featureBranchLabel || automergeLabel)) {\n if (featureBranchLabel) {\n if (prHasFeatureBranchLabel && !options.featureBranch) {\n await context.github.issues.removeLabel(\n context.issue({ name: featureBranchLabel.name }),\n );\n }\n if (options.featureBranch && !prHasFeatureBranchLabel) {\n await context.github.issues.addLabels(\n context.issue({ labels: [featureBranchLabel.name] }),\n );\n }\n }\n\n if (automergeLabel) {\n if (prHasAutoMergeLabel && !options.autoMerge) {\n await context.github.issues.removeLabel(\n context.issue({ name: automergeLabel.name }),\n );\n }\n if (options.autoMerge && !prHasAutoMergeLabel) {\n const result = await context.github.issues.addLabels(\n context.issue({ labels: [automergeLabel.name] }),\n );\n await autoMergeIfPossible(\n context,\n repoContext,\n context.payload.pull_request,\n result.data,\n );\n }\n }\n }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { RepoContext } from '../../context/repoContext';\n\nconst addStatusCheck = async function<\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n pr: any,\n { state, description }: { state: 'failure' | 'success'; description: string },\n): Promise {\n const hasPrCheck = (await context.github.checks.listForRef(\n context.repo({\n ref: pr.head.sha,\n }),\n )).data.check_runs.find((check) => check.name === process.env.NAME);\n\n context.log.info('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.github.checks.create(\n context.repo({\n name: process.env.NAME as string,\n head_sha: pr.head.sha,\n started_at: pr.created_at,\n status: 'completed',\n conclusion: state,\n completed_at: new Date().toISOString(),\n output: {\n title: description,\n summary: '',\n },\n }),\n );\n } else {\n await context.github.repos.createStatus(\n context.repo({\n context: process.env.NAME,\n sha: pr.head.sha,\n state,\n target_url: undefined,\n description,\n }),\n );\n }\n};\n\nconst createFailedStatusCheck = (\n context: Context,\n pr: any,\n description: string,\n): Promise =>\n addStatusCheck(context, pr, {\n state: 'failure',\n description,\n });\n\nexport const updateStatusCheckFromLabels = (\n context: Context,\n repoContext: RepoContext,\n pr: any = context.payload.pull_request,\n labels: LabelResponse[] = pr.labels || [],\n): Promise => {\n context.log.info('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l && l.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n if (pr.requested_reviewers.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${pr.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Changes requested ! Push commits or discuss changes then re-request a review.',\n );\n }\n\n const needsReviewGroupNames = repoContext.getNeedsReviewGroupNames(labels);\n\n if (needsReviewGroupNames.length !== 0) {\n return createFailedStatusCheck(\n context,\n pr,\n `Awaiting review from: ${needsReviewGroupNames.join(\n ', ',\n )}. Perhaps request someone ?`,\n );\n }\n\n if (!repoContext.hasApprovesReview(labels)) {\n if (repoContext.config.requiresReviewRequest) {\n return createFailedStatusCheck(\n context,\n pr,\n 'Awaiting review... Perhaps request someone ?',\n );\n }\n }\n\n // if (\n // repoContext.config.requiresReviewRequest &&\n // !repoContext.hasRequestedReview(labels)\n // ) {\n // return createFailedStatusCheck(\n // context,\n // pr,\n // 'You need to request someone to review the PR',\n // );\n // return;\n // }\n // return createInProgressStatusCheck(context);\n // } else if (repoContext.hasApprovesReview(labels)) {\n return addStatusCheck(context, pr, {\n state: 'success',\n description: '✓ PR ready to merge !',\n });\n // }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { LabelResponse } from '../../context/initRepoLabels';\nimport { GroupLabels } from '../../orgsConfigs/types';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends Webhooks.WebhookPayloadPullRequest,\n GroupNames extends string = any\n>(\n context: Context,\n repoContext: RepoContext,\n reviewGroup: GroupNames,\n {\n add: labelsToAdd,\n remove: labelsToRemove,\n }: {\n add?: (GroupLabels | false | undefined)[];\n remove?: (GroupLabels | false | undefined)[];\n },\n): Promise => {\n context.log.info('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n const pr = context.payload.pull_request;\n let prLabels: LabelResponse[] = pr.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(\n prLabels.map((label: LabelResponse) => label.name),\n );\n\n const toAdd = new Set();\n const toDelete = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (key: GroupLabels): undefined | LabelResponse => {\n const reviewConfig = repoContext.config.labels.review[reviewGroup];\n if (!reviewConfig) return undefined;\n\n return reviewConfig[key] && labels[reviewConfig[key]]\n ? labels[reviewConfig[key]]\n : undefined;\n };\n\n if (labelsToAdd) {\n labelsToAdd.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label || prLabels.some((prLabel) => prLabel.id === label.id)) {\n return;\n }\n newLabelNames.add(label.name);\n toAdd.add(key);\n });\n }\n\n if (labelsToRemove) {\n labelsToRemove.forEach((key) => {\n if (!key) return;\n const label = getLabelFromKey(key);\n if (!label) return;\n const existing = prLabels.find((prLabel) => prLabel.id === label.id);\n if (existing) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n }\n });\n }\n\n // TODO move that elsewhere\n\n repoContext.getTeamsForLogin(pr.user.login).forEach((teamName) => {\n const team = repoContext.config.teams[teamName];\n if (team.labels) {\n team.labels.forEach((labelKey) => {\n const label = repoContext.labels[labelKey];\n if (label && !prLabels.some((prLabel) => prLabel.id === label.id)) {\n newLabelNames.add(label.name);\n toAdd.add(labelKey);\n }\n });\n }\n });\n\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.info('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l: LabelResponse) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n // if (process.env.DRY_RUN) return;\n\n if (toAdd.size || toDelete.size) {\n const result = await context.github.issues.replaceLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(context, repoContext, pr, prLabels);\n // }\n\n return prLabels;\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\n\nexport const autoApproveAndAutoMerge = async (\n context: Context,\n repoContext: RepoContext,\n): Promise => {\n // const autoMergeLabel = repoContext.labels['merge/automerge'];\n const codeApprovedLabel = repoContext.labels['code/approved'];\n const prLabels = context.payload.pull_request.labels;\n if (prLabels.find((l): boolean => l.id === codeApprovedLabel.id)) {\n await context.github.pulls.createReview(\n context.issue({ event: 'APPROVE' }),\n );\n }\n\n await autoMergeIfPossible(context, repoContext);\n};\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { autoApproveAndAutoMerge } from './actions/autoApproveAndAutoMerge';\n\nexport default function opened(app: Application): void {\n app.on(\n 'pull_request.opened',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const fromRenovate = context.payload.pull_request.head.ref.startsWith(\n 'renovate/',\n );\n\n await Promise.all([\n autoAssignPRToCreator(context, repoContext),\n editOpenedPR(context, repoContext),\n fromRenovate\n ? autoApproveAndAutoMerge(context, repoContext)\n : updateReviewStatus(context, repoContext, 'dev', {\n add: ['needsReview'],\n remove: ['approved', 'changesRequested'],\n }),\n ]);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseBody } from './actions/utils/parseBody';\n\nexport default function closed(app: Application): void {\n app.on(\n 'pull_request.closed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const repo = context.payload.repository;\n const pr = context.payload.pull_request;\n\n if (pr.merged) {\n const parsedBody =\n pr.head.repo.id === repo.id &&\n parseBody(pr.body, repoContext.config.prDefaultOptions);\n\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(context, pr.number),\n parsedBody && parsedBody.options.deleteAfterMerge\n ? context.github.git\n .deleteRef(context.repo({ ref: `heads/${pr.head.ref}` }))\n .catch(() => {})\n : undefined,\n ]);\n } else {\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(context, pr.number),\n updateReviewStatus(context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewRequested(app: Application): void {\n app.on(\n 'pull_request.review_requested',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\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) ===\n reviewerGroup &&\n review.state === 'REQUEST_CHANGES' &&\n // In case this is a rerequest for review\n review.user.login !== reviewer.login,\n );\n\n if (!hasChangesRequestedInReviews) {\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved', 'changesRequested'],\n });\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${pr.html_url} !\\n> ${pr.title}`,\n );\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewRequestRemoved(app: Application): void {\n app.on(\n 'pull_request.review_request_removed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const sender = context.payload.sender;\n const pr = context.payload.pull_request;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n const hasApprovedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'APPROVED',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: [\n // if changes requested by the one which requests was removed\n hasChangesRequestedInReviews && 'changesRequested',\n // if was already approved by another member in the group and has no other requests waiting\n approved && 'approved',\n ],\n // remove labels if has no other requests waiting\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n ],\n });\n }\n\n if (sender.login === reviewer.login) return;\n\n if (repoContext.slack) {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${pr.html_url}`,\n );\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewSubmitted(app: Application): void {\n app.on(\n 'pull_request_review.submitted',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const pr = context.payload.pull_request;\n const { user: reviewer, state } = (context.payload as any).review;\n if (pr.user.login === reviewer.login) return;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged;\n\n if (reviewerGroup && repoContext.config.labels.review[reviewerGroup]) {\n const hasRequestedReviewsForGroup = repoContext.reviewShouldWait(\n reviewerGroup,\n pr.requested_reviewers,\n {\n includesReviewerGroup: true,\n // TODO reenable this when accepted can notify request review to slack (dev accepted => design requested) and flag to disable for label (approved design ; still waiting for dev ?)\n // includesWaitForGroups: true,\n },\n );\n const { data: reviews } = await context.github.pulls.listReviews(\n context.issue({ per_page: 50 }),\n );\n const hasChangesRequestedInReviews = reviews.some(\n (review) =>\n repoContext.getReviewerGroup(review.user.login) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const newLabels = await updateReviewStatus(\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !(\n hasRequestedReviewsForGroup || state === 'changes_requested'\n ) && 'requested',\n state === 'approved' &&\n !hasChangesRequestedInReviews &&\n 'changesRequested',\n state === 'changes_requested' && 'approved',\n ],\n },\n );\n\n if (approved && !hasChangesRequestedInReviews) {\n merged = await autoMergeIfPossible(\n context,\n repoContext,\n pr,\n newLabels,\n );\n }\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = pr.html_url;\n\n const message = (() => {\n if (state === 'changes_requested') {\n return `:x: ${mention} requests changes on ${prUrl}`;\n }\n if (state === 'approved') {\n return `:clap: :white_check_mark: ${mention} approves ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n return `:speech_balloon: ${mention} commented on ${prUrl}`;\n })();\n\n repoContext.slack.postMessage(pr.user.login, message);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\n\nexport default function reviewDismissed(app: Application): void {\n app.on(\n 'pull_request_review.dismissed',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\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) ===\n reviewerGroup && review.state === 'REQUEST_CHANGES',\n );\n\n await updateReviewStatus(context, repoContext, reviewerGroup, {\n add: ['needsReview', 'requested'],\n remove: [\n !hasChangesRequestedInReviews && 'changesRequested',\n 'approved',\n ],\n });\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n repoContext.slack.postMessage(\n pr.user.login,\n `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${pr.html_url}`,\n );\n } else {\n repoContext.slack.postMessage(\n reviewer.login,\n `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${pr.html_url}`,\n );\n }\n }\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestChange } from './utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function synchronize(app: Application): void {\n app.on(\n 'pull_request.synchronize',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n // old and new sha\n // const { before, after } = context.payload;\n\n await Promise.all([\n editOpenedPR(context, repoContext),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(context, repoContext),\n // call autoMergeIfPossible to re-add to the queue when push is fixed\n autoMergeIfPossible(context, repoContext),\n ]);\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createHandlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function edited(app: Application): void {\n app.on(\n 'pull_request.edited',\n createHandlerPullRequestChange(\n async (context, repoContext): Promise => {\n const sender = context.payload.sender;\n if (sender.type === 'Bot') {\n return;\n }\n\n await editOpenedPR(context, repoContext);\n await autoMergeIfPossible(context, repoContext);\n },\n ),\n );\n}\n","import Webhooks from '@octokit/webhooks';\nimport { Context } from 'probot';\nimport { RepoContext } from '../../context/repoContext';\nimport { updateBody } from './utils/updateBody';\nimport { Options } from './utils/prOptions';\n\nexport const updatePrBody = async <\n E extends Webhooks.WebhookPayloadPullRequest\n>(\n context: Context,\n repoContext: RepoContext,\n updateOptions: Partial>,\n): Promise => {\n const prBody = context.payload.pull_request.body;\n const { body } = updateBody(\n prBody,\n repoContext.config.prDefaultOptions,\n undefined,\n updateOptions,\n );\n\n if (body !== prBody) {\n await context.github.pulls.update(context.issue({ body }));\n }\n};\n","import Webhooks from '@octokit/webhooks';\nimport { Application, Context } from 'probot';\nimport { handlerPullRequestChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { updatePrBody } from './actions/updatePrBody';\n\nexport default function labelsChanged(app: Application): void {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n async (context: Context) => {\n const sender = context.payload.sender;\n const fromRenovate =\n sender.type === 'Bot' && sender.login === 'renovate[bot]';\n context.payload.pull_request.head.ref.startsWith('renovate/');\n\n if (sender.type === 'Bot' && !fromRenovate) {\n return;\n }\n\n await handlerPullRequestChange(context, async (repoContext) => {\n const label = (context.payload as any).label;\n if (fromRenovate) {\n const codeApprovedLabel = repoContext.labels['code/approved'];\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n if (context.payload.action === 'labeled') {\n if (codeApprovedLabel && label.id === codeApprovedLabel.id) {\n // const { data: reviews } = await context.github.pulls.listReviews(\n // context.issue({ per_page: 1 }),\n // );\n // if (reviews.length !== 0) {\n await context.github.pulls.createReview(\n context.issue({ event: 'APPROVE' }),\n );\n await updateStatusCheckFromLabels(\n context,\n repoContext,\n context.payload.pull_request,\n );\n await updatePrBody(context, repoContext, {\n autoMergeWithSkipCi: true,\n });\n // }\n } else if (autoMergeLabel && label.id === autoMergeLabel.id) {\n await updatePrBody(context, repoContext, {\n autoMerge: true,\n });\n }\n }\n return;\n }\n\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.github.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.github.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(context, repoContext);\n\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n\n if (\n (featureBranchLabel && label.id === automergeLabel.id) ||\n (automergeLabel && label.id === automergeLabel.id)\n ) {\n const option: 'featureBranch' | 'autoMerge' =\n featureBranchLabel && label.id === featureBranchLabel.id\n ? 'featureBranch'\n : 'autoMerge';\n await updatePrBody(context, repoContext, {\n [option]: context.payload.action === 'labeled',\n });\n } else if (context.payload.action === 'labeled') {\n if (\n repoContext.labels['merge/automerge'] &&\n label.id === repoContext.labels['merge/automerge'].id\n ) {\n await autoMergeIfPossible(context, repoContext);\n }\n }\n });\n },\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function checkrunCompleted(app: Application): void {\n app.on(\n 'check_run.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_run.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_run.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n}\n","import { Application } from 'probot';\nimport { createHandlerPullRequestsChange } from './utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\n\nexport default function checksuiteCompleted(app: Application): void {\n app.on(\n 'check_suite.completed',\n createHandlerPullRequestsChange(\n (context) => context.payload.check_suite.pull_requests,\n async (context, repoContext) => {\n await Promise.all(\n context.payload.check_suite.pull_requests.map((pr) =>\n context.github.pulls\n .get(\n context.repo({\n number: pr.number,\n }),\n )\n .then((prResult) => {\n return autoMergeIfPossible(context, repoContext, prResult.data);\n }),\n ),\n );\n },\n ),\n );\n}\n","import Webhooks from '@octokit/webhooks';\nimport { Application, Context } from 'probot';\nimport { LockedMergePr } from '../context/repoContext';\nimport { createHandlerPullRequestsChange } from './utils';\n\nconst isSameBranch = (\n context: Context,\n lockedPr: LockedMergePr,\n): boolean => {\n if (!lockedPr) return false;\n return !!context.payload.branches.find((b) => b.name === lockedPr.branch);\n};\n\nexport default function status(app: Application): void {\n app.on(\n 'status',\n createHandlerPullRequestsChange(\n (context, repoContext): LockedMergePr[] => {\n const lockedPr = repoContext.getMergeLockedPr();\n if (!lockedPr) return [];\n\n if (isSameBranch(context, lockedPr)) {\n return [lockedPr];\n }\n\n return [];\n },\n (context, repoContext): void => {\n const lockedPr = repoContext.getMergeLockedPr();\n // check if changed\n if (isSameBranch(context, lockedPr)) {\n repoContext.reschedule(context, lockedPr);\n }\n },\n ),\n );\n}\n","import 'dotenv/config';\nimport { Probot, Application } from 'probot';\nimport openedHandler from './pr-handlers/opened';\nimport closedHandler from './pr-handlers/closed';\nimport reviewRequestedHandler from './pr-handlers/reviewRequested';\nimport reviewRequestRemovedHandler from './pr-handlers/reviewRequestRemoved';\nimport reviewSubmittedHandler from './pr-handlers/reviewSubmitted';\nimport reviewDismissedHandler from './pr-handlers/reviewDismissed';\nimport synchromizeHandler from './pr-handlers/synchronize';\nimport editedHandler from './pr-handlers/edited';\nimport labelsChanged from './pr-handlers/labelsChanged';\nimport checkrunCompleted from './pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './pr-handlers/checksuiteCompleted';\nimport status from './pr-handlers/status';\n\nif (!process.env.NAME) process.env.NAME = 'reviewflow';\n\n// const getConfig = require('probot-config')\n// const { MongoClient } = require('mongodb');\n\n// const connect = MongoClient.connect(process.env.MONGO_URL);\n// const db = connect.then(client => client.db(process.env.MONGO_DB));\n\n// let config = await getConfig(context, 'reviewflow.yml');\n\n// eslint-disable-next-line import/no-commonjs\nProbot.run((app: Application) => {\n openedHandler(app);\n closedHandler(app);\n reviewRequestedHandler(app);\n reviewRequestRemovedHandler(app);\n\n // app.on('pull_request.closed', async context => {\n\n // });\n\n // app.on('pull_request.reopened', async context => {\n\n // });\n\n reviewSubmittedHandler(app);\n reviewDismissedHandler(app);\n labelsChanged(app);\n synchromizeHandler(app);\n editedHandler(app);\n\n checkrunCompleted(app);\n checksuiteCompleted(app);\n status(app);\n});\n"],"names":["config","slackToken","process","env","ORNIKAR_SLACK_TOKEN","autoAssignToCreator","trimTitle","requiresReviewRequest","prDefaultOptions","featureBranch","autoMergeWithSkipCi","autoMerge","deleteAfterMerge","parsePR","title","regExp","error","summary","bot","status","statusInfoFromMatch","match","issue","inBody","url","groups","dev","abarreir","ORNIKAR_EMAIL_DOMAIN","arthurflachs","rigma","damienorny","darame07","Pixy","christophehurpeau","HugoGarrido","LentnerStefan","CorentinAndre","Mxime","tilap","design","jperriere","CoralineColasse","teams","backends","logins","labels","frontends","waitForGroups","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","orgsConfigs","ornikar","options","optionsRegexps","map","option","regexp","RegExp","optionsLabels","label","commentStart","commentEnd","regexpCols","regexpReviewflowCol","parseOptions","content","defaultConfig","reduce","acc","exec","parseBody","description","reviewFlowCol","reviewflowContent","ending","reviewFlowColMatch","reviewflowContentCol","reviewflowContentColPrefix","reviewflowContentColSuffix","hasFailedStatusOrChecks","context","repoContext","pr","checks","github","listForRef","repo","ref","head","sha","per_page","failedChecks","data","check_runs","filter","check","conclusion","length","log","info","id","combinedStatus","repos","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","payload","pull_request","prLabels","autoMergeLabel","createMergeLockPrFromPr","number","branch","find","l","debug","removePrFromAutomergeQueue","hasNeedsReview","hasRequestedReview","lockedPr","getMergeLockedPr","pushAutomergeQueue","addMergeLockPr","mergeable","undefined","prResult","pulls","get","pull_number","merged","mergeable_state","reschedule","startsWith","issues","update","body","replace","base","merge","owner","login","parsedBody","mergeResult","merge_method","commit_title","commit_message","Boolean","err","message","initRepoLabels","listLabelsForRepo","finalLabels","labelKey","labelConfig","Object","entries","labelColor","slice","existingLabel","result","createLabel","current_name","updateLabel","getKeys","o","keys","ExcludesFalsy","initTeamSlack","mention","postMessage","Promise","resolve","githubLoginToSlackEmail","groupName","assign","slackClient","WebClient","allUsers","users","limit","members","values","email","member","user","profile","console","warn","im","open","channel","membersMap","Map","getUserFromGithubLogin","githubLogin","text","DRY_RUN","chat","initTeamContext","slackPromise","githubLoginToGroup","forEach","set","githubLoginToTeams","teamName","has","push","getReviewerGroups","githubLogins","Set","getReviewerGroup","getTeamsForLogin","reviewShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","includes","some","group","slack","orgContextsPromise","orgContexts","obtainOrgContext","repository","existingTeamContext","existingPromise","promise","then","orgContext","delete","initRepoContext","create","all","reviewGroupNames","needsReviewLabelIds","key","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","protectedLabelIds","labelIdToGroupName","reviewGroupLabels","lock","Lock","lockMergePr","automergeQueue","lockPROrPRS","prIdOrIds","callback","reject","createReleaseCallback","release","Error","setTimeout","String","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","prNumber","shift","value","p","repoContextsPromise","repoContexts","obtainRepoContext","NAME","existingRepoContext","handlerPullRequestChange","createHandlerPullRequestChange","createHandlerPullRequestsChange","getPullRequests","prs","autoAssignPRToCreator","assignees","type","addAssignees","cleanTitle","trim","s","arg1","toLowerCase","toMarkdownOptions","join","toMarkdownInfos","infos","updateBody","updateOptions","parsed","infosParagraph","updatedOptions","editOpenedPR","isPrFromBot","errorRule","rule","date","Date","toISOString","hasLintPrCheck","createStatus","target_url","head_sha","started_at","completed_at","output","featureBranchLabel","automergeLabel","prHasFeatureBranchLabel","prHasAutoMergeLabel","defaultOptions","hasDiffInTitle","hasDiffInBody","removeLabel","addLabels","addStatusCheck","hasPrCheck","created_at","createFailedStatusCheck","updateStatusCheckFromLabels","requested_reviewers","rr","needsReviewGroupNames","updateReviewStatus","reviewGroup","add","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toDelete","getLabelFromKey","reviewConfig","prLabel","existing","team","newLabelNamesArray","oldLabels","size","replaceLabels","autoApproveAndAutoMerge","codeApprovedLabel","createReview","event","opened","app","on","fromRenovate","closed","git","deleteRef","catch","reviewRequested","sender","reviewer","requested_reviewer","reviews","listReviews","hasChangesRequestedInReviews","html_url","reviewRequestRemoved","hasRequestedReviewsForGroup","hasApprovedInReviews","reviewSubmitted","newLabels","prUrl","reviewDismissed","synchronize","edited","updatePrBody","prBody","labelsChanged","action","checkrunCompleted","check_run","pull_requests","checksuiteCompleted","check_suite","isSameBranch","branches","b","Probot","run","openedHandler","closedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","synchromizeHandler","editedHandler"],"mappings":"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"} \ No newline at end of file diff --git a/src/context/initRepoLabels.ts b/src/context/initRepoLabels.ts index 642f97125..b109be561 100644 --- a/src/context/initRepoLabels.ts +++ b/src/context/initRepoLabels.ts @@ -1,5 +1,5 @@ import { Context } from 'probot'; -import { Config } from '../teamconfigs'; +import { Config } from '../orgsConfigs'; export interface LabelResponse { id: number; diff --git a/src/context/initTeamSlack.ts b/src/context/initTeamSlack.ts index 049f3cfba..ea89a0a2a 100644 --- a/src/context/initTeamSlack.ts +++ b/src/context/initTeamSlack.ts @@ -1,6 +1,6 @@ import { WebClient } from '@slack/web-api'; import { Context } from 'probot'; -import { Config } from '../teamconfigs'; +import { Config } from '../orgsConfigs'; import { getKeys } from './utils'; export interface TeamSlack { diff --git a/src/context/teamContext.ts b/src/context/orgContext.ts similarity index 62% rename from src/context/teamContext.ts rename to src/context/orgContext.ts index a98260aa8..b295baa01 100644 --- a/src/context/teamContext.ts +++ b/src/context/orgContext.ts @@ -1,13 +1,17 @@ import { Context } from 'probot'; -import { Config } from '../teamconfigs'; +import { Config } from '../orgsConfigs'; import { initTeamSlack, TeamSlack } from './initTeamSlack'; import { getKeys } from './utils'; -export interface TeamContext { - config: Config; +export interface OrgContext< + GroupNames extends string = any, + TeamNames extends string = any +> { + config: Config; slack: TeamSlack; getReviewerGroup: (githubLogin: string) => string | undefined; getReviewerGroups: (githubLogins: string[]) => string[]; + getTeamsForLogin: (githubLogin: string) => TeamNames[]; reviewShouldWait: ( reviewerGroup: GroupNames | undefined, requestedReviewers: any[], @@ -24,18 +28,28 @@ const ExcludesFalsy = (Boolean as any) as ( const initTeamContext = async ( context: Context, config: Config, -): Promise => { +): Promise => { const slackPromise = initTeamSlack(context, config); - const githubLoginToGroup = getKeys(config.groups).reduce>( - (acc, groupName) => { - Object.keys(config.groups[groupName]).forEach((login) => { - acc.set(login, groupName); - }); - return acc; - }, - new Map(), - ); + const githubLoginToGroup = new Map(); + getKeys(config.groups).forEach((groupName) => { + Object.keys(config.groups[groupName]).forEach((login) => { + githubLoginToGroup.set(login, groupName); + }); + }); + + const githubLoginToTeams = new Map(); + getKeys(config.teams || {}).forEach((acc, teamName) => { + (config.teams as NonNullable)[teamName].logins.forEach( + (login) => { + if (acc.has(login)) { + acc.get(login).push(teamName); + } else { + acc.set(login, [teamName]); + } + }, + ); + }); const getReviewerGroups = (githubLogins: string[]) => [ ...new Set( @@ -56,6 +70,9 @@ const initTeamContext = async ( ), ], + getTeamsForLogin: (githubLogin) => + githubLoginToTeams.get(githubLogin) || [], + reviewShouldWait: ( reviewerGroup, requestedReviewers, @@ -90,27 +107,27 @@ const initTeamContext = async ( }; }; -const teamContextsPromise = new Map(); -const teamContexts = new Map(); +const orgContextsPromise = new Map(); +const orgContexts = new Map(); -export const obtainTeamContext = ( +export const obtainOrgContext = ( context: Context, config: Config, -): Promise => { +): Promise => { const owner = context.payload.repository.owner; - const existingTeamContext = teamContexts.get(owner.login); + const existingTeamContext = orgContexts.get(owner.login); if (existingTeamContext) return existingTeamContext; - const existingPromise = teamContextsPromise.get(owner.login); + const existingPromise = orgContextsPromise.get(owner.login); if (existingPromise) return Promise.resolve(existingPromise); const promise = initTeamContext(context, config); - teamContextsPromise.set(owner.login, promise); + orgContextsPromise.set(owner.login, promise); - return promise.then((teamContext) => { - teamContextsPromise.delete(owner.login); - teamContexts.set(owner.login, teamContext); - return teamContext; + return promise.then((orgContext) => { + orgContextsPromise.delete(owner.login); + orgContexts.set(owner.login, orgContext); + return orgContext; }); }; diff --git a/src/context/repoContext.ts b/src/context/repoContext.ts index 099b0f5d1..af134406e 100644 --- a/src/context/repoContext.ts +++ b/src/context/repoContext.ts @@ -2,11 +2,11 @@ import { Lock } from 'lock'; import { Context } from 'probot'; -import { teamConfigs, Config } from '../teamconfigs'; +import { orgsConfigs, Config } from '../orgsConfigs'; // eslint-disable-next-line import/no-cycle import { autoMergeIfPossible } from '../pr-handlers/actions/autoMergeIfPossible'; import { initRepoLabels, LabelResponse, Labels } from './initRepoLabels'; -import { obtainTeamContext, TeamContext } from './teamContext'; +import { obtainOrgContext, OrgContext } from './orgContext'; export interface LockedMergePr { id: number; @@ -40,7 +40,7 @@ const ExcludesFalsy = (Boolean as any) as ( x: T | false | null | undefined, ) => x is T; -export type RepoContext = TeamContext< +export type RepoContext = OrgContext< GroupNames > & RepoContextWithoutTeamContext; @@ -49,8 +49,8 @@ async function initRepoContext( context: Context, config: Config, ): Promise> { - const teamContext = await obtainTeamContext(context, config); - const repoContext = Object.create(teamContext); + const orgContext = await obtainOrgContext(context, config); + const repoContext = Object.create(orgContext); const [labels] = await Promise.all([initRepoLabels(context, config)]); @@ -213,8 +213,8 @@ export const obtainRepoContext = ( return null; } const owner = repo.owner; - if (!teamConfigs[owner.login]) { - console.warn(owner.login, Object.keys(teamConfigs)); + if (!orgsConfigs[owner.login]) { + console.warn(owner.login, Object.keys(orgsConfigs)); return null; } const key = repo.id; @@ -225,7 +225,7 @@ export const obtainRepoContext = ( const existingPromise = repoContextsPromise.get(key); if (existingPromise) return Promise.resolve(existingPromise); - const promise = initRepoContext(context, teamConfigs[owner.login]); + const promise = initRepoContext(context, orgsConfigs[owner.login]); repoContextsPromise.set(key, promise); return promise.then((repoContext) => { diff --git a/src/teamconfigs/christophehurpeau.ts b/src/orgsConfigs/christophehurpeau.ts similarity index 97% rename from src/teamconfigs/christophehurpeau.ts rename to src/orgsConfigs/christophehurpeau.ts index b137dd4f2..0f0662faa 100644 --- a/src/teamconfigs/christophehurpeau.ts +++ b/src/orgsConfigs/christophehurpeau.ts @@ -1,6 +1,6 @@ import { Config } from './types'; -const config: Config<'dev'> = { +const config: Config<'dev', never> = { autoAssignToCreator: true, trimTitle: true, requiresReviewRequest: false, @@ -34,6 +34,7 @@ const config: Config<'dev'> = { waitForGroups: { dev: [], }, + teams: {}, labels: { list: { // /* ci */ diff --git a/src/teamconfigs/index.ts b/src/orgsConfigs/index.ts similarity index 66% rename from src/teamconfigs/index.ts rename to src/orgsConfigs/index.ts index ba71aa793..9788d0ee0 100644 --- a/src/teamconfigs/index.ts +++ b/src/orgsConfigs/index.ts @@ -2,9 +2,12 @@ import { Config as ConfigType } from './types'; import ornikar from './ornikar'; import christophehurpeau from './christophehurpeau'; -export type Config = ConfigType; +export type Config< + GroupNames extends string = any, + TeamNames extends string = any +> = ConfigType; -export const teamConfigs: { [owner: string]: Config } = { +export const orgsConfigs: { [owner: string]: Config } = { ornikar, christophehurpeau, }; diff --git a/src/teamconfigs/ornikar.ts b/src/orgsConfigs/ornikar.ts similarity index 86% rename from src/teamconfigs/ornikar.ts rename to src/orgsConfigs/ornikar.ts index 29f13952f..0130400fd 100644 --- a/src/teamconfigs/ornikar.ts +++ b/src/orgsConfigs/ornikar.ts @@ -1,6 +1,6 @@ import { Config } from './types'; -const config: Config<'dev' | 'design'> = { +const config: Config<'dev' | 'design', 'frontends' | 'backends'> = { slackToken: process.env.ORNIKAR_SLACK_TOKEN, autoAssignToCreator: true, trimTitle: true, @@ -55,7 +55,6 @@ const config: Config<'dev' | 'design'> = { /* back */ abarreir: `alexandre${process.env.ORNIKAR_EMAIL_DOMAIN}`, arthurflachs: `arthur${process.env.ORNIKAR_EMAIL_DOMAIN}`, - CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`, rigma: `romain${process.env.ORNIKAR_EMAIL_DOMAIN}`, damienorny: `damien.orny${process.env.ORNIKAR_EMAIL_DOMAIN}`, 'Thierry-girod': `thierry${process.env.ORNIKAR_EMAIL_DOMAIN}`, @@ -65,6 +64,7 @@ const config: Config<'dev' | 'design'> = { christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`, HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`, LentnerStefan: `stefan${process.env.ORNIKAR_EMAIL_DOMAIN}`, + CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`, Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`, tilap: `julien.lavinh${process.env.ORNIKAR_EMAIL_DOMAIN}`, '63m29': `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`, @@ -74,6 +74,35 @@ const config: Config<'dev' | 'design'> = { CoralineColasse: `coraline${process.env.ORNIKAR_EMAIL_DOMAIN}`, }, }, + + teams: { + backends: { + logins: [ + 'abarreir', + 'arthurflachs', + 'rigma', + 'damienorny', + 'Thierry-girod', + 'darame07', + 'Pixy', + ], + labels: ['teams/backend'], + }, + + frontends: { + logins: [ + 'christophehurpeau', + 'HugoGarrido', + 'LentnerStefan', + 'CorentinAndre', + 'Mxime', + 'tilap', + '63m29', + ], + labels: ['teams/frontend'], + }, + }, + waitForGroups: { dev: [], design: ['dev'], @@ -121,6 +150,17 @@ const config: Config<'dev' | 'design'> = { color: '#64DD17', }, + /* teams */ + + 'teams/backend': { + name: 'backend', + color: '#6ad8cb', + }, + 'teams/frontend': { + name: 'frontend', + color: '#8a5abc', + }, + /* auto merge */ 'merge/automerge': { name: ':soon: automerge', diff --git a/src/teamconfigs/types.ts b/src/orgsConfigs/types.ts similarity index 88% rename from src/teamconfigs/types.ts rename to src/orgsConfigs/types.ts index 2245bfe22..a8c22a584 100644 --- a/src/teamconfigs/types.ts +++ b/src/orgsConfigs/types.ts @@ -15,6 +15,11 @@ export interface Group { [userName: string]: string; } +export interface Team { + logins: string[]; + labels?: string[]; +} + export interface ParsePRRule { bot?: false; regExp: RegExp; @@ -52,7 +57,7 @@ export interface LabelsConfig { review: ReviewConfig; } -export interface Config { +export interface Config { slackToken?: string; autoAssignToCreator?: boolean; trimTitle?: boolean; @@ -61,6 +66,7 @@ export interface Config { prDefaultOptions: Record; groups: Record; + teams: Record; waitForGroups?: Record; labels: LabelsConfig; diff --git a/src/pr-handlers/actions/editOpenedPR.ts b/src/pr-handlers/actions/editOpenedPR.ts index 2ab3e55ed..bc15ff173 100644 --- a/src/pr-handlers/actions/editOpenedPR.ts +++ b/src/pr-handlers/actions/editOpenedPR.ts @@ -1,7 +1,7 @@ import Webhooks from '@octokit/webhooks'; import { Context } from 'probot'; import { RepoContext } from '../../context/repoContext'; -import { StatusError, StatusInfo } from '../../teamconfigs/types'; +import { StatusError, StatusInfo } from '../../orgsConfigs/types'; import { cleanTitle } from './utils/cleanTitle'; import { updateBody } from './utils/updateBody'; import { autoMergeIfPossible } from './autoMergeIfPossible'; diff --git a/src/pr-handlers/actions/updateReviewStatus.ts b/src/pr-handlers/actions/updateReviewStatus.ts index 0ca5395db..84e2471ab 100644 --- a/src/pr-handlers/actions/updateReviewStatus.ts +++ b/src/pr-handlers/actions/updateReviewStatus.ts @@ -1,7 +1,7 @@ import Webhooks from '@octokit/webhooks'; import { Context } from 'probot'; import { LabelResponse } from '../../context/initRepoLabels'; -import { GroupLabels } from '../../teamconfigs/types'; +import { GroupLabels } from '../../orgsConfigs/types'; import { RepoContext } from '../../context/repoContext'; import { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels'; @@ -27,14 +27,14 @@ export const updateReviewStatus = async < }); const pr = context.payload.pull_request; - let prLabels = pr.labels || []; + let prLabels: LabelResponse[] = pr.labels || []; if (!reviewGroup) return prLabels; const newLabelNames = new Set( prLabels.map((label: LabelResponse) => label.name), ); - const toAdd = new Set(); + const toAdd = new Set(); const toDelete = new Set(); const labels = repoContext.labels; @@ -51,10 +51,7 @@ export const updateReviewStatus = async < labelsToAdd.forEach((key) => { if (!key) return; const label = getLabelFromKey(key); - if ( - !label || - prLabels.some((prLabel: LabelResponse) => prLabel.id === label.id) - ) { + if (!label || prLabels.some((prLabel) => prLabel.id === label.id)) { return; } newLabelNames.add(label.name); @@ -67,9 +64,7 @@ export const updateReviewStatus = async < if (!key) return; const label = getLabelFromKey(key); if (!label) return; - const existing = prLabels.find( - (prLabel: LabelResponse) => prLabel.id === label.id, - ); + const existing = prLabels.find((prLabel) => prLabel.id === label.id); if (existing) { newLabelNames.delete(existing.name); toDelete.add(key); @@ -77,6 +72,21 @@ export const updateReviewStatus = async < }); } + // TODO move that elsewhere + + repoContext.getTeamsForLogin(pr.user.login).forEach((teamName) => { + const team = repoContext.config.teams[teamName]; + if (team.labels) { + team.labels.forEach((labelKey) => { + const label = repoContext.labels[labelKey]; + if (label && !prLabels.some((prLabel) => prLabel.id === label.id)) { + newLabelNames.add(label.name); + toAdd.add(labelKey); + } + }); + } + }); + const newLabelNamesArray = [...newLabelNames]; context.log.info('updateReviewStatus', { diff --git a/src/pr-handlers/actions/utils/updateBody.ts b/src/pr-handlers/actions/utils/updateBody.ts index ef71c7a1e..b941c4d16 100644 --- a/src/pr-handlers/actions/utils/updateBody.ts +++ b/src/pr-handlers/actions/utils/updateBody.ts @@ -1,4 +1,4 @@ -import { StatusInfo } from '../../../teamconfigs/types'; +import { StatusInfo } from '../../../orgsConfigs/types'; import { parseBody } from './parseBody'; import { Options, optionsLabels } from './prOptions';