From 89643ad01287c0ad2b5e6c58936e8e658c795ffc Mon Sep 17 00:00:00 2001 From: Christophe Hurpeau Date: Sat, 19 Dec 2020 11:35:54 +0100 Subject: [PATCH] fix: logs --- dist/index-node10-dev.cjs.js | 103 ++++++++++-------- dist/index-node10-dev.cjs.js.map | 2 +- dist/index-node10.cjs.js | 103 ++++++++++-------- dist/index-node10.cjs.js.map | 2 +- src/context/accountContext.ts | 8 +- src/context/initRepoLabels.ts | 15 ++- src/context/initTeamSlack.ts | 21 ++-- src/context/repoContext.ts | 31 ++++-- .../actions/autoMergeIfPossible.ts | 44 +++++--- .../pr-handlers/actions/updateBranch.ts | 13 ++- .../pr-handlers/actions/updateReviewStatus.ts | 56 ++++++---- .../actions/updateStatusCheckFromLabels.ts | 15 ++- 12 files changed, 235 insertions(+), 178 deletions(-) diff --git a/dist/index-node10-dev.cjs.js b/dist/index-node10-dev.cjs.js index 04e4523ff..d30d5c732 100644 --- a/dist/index-node10-dev.cjs.js +++ b/dist/index-node10-dev.cjs.js @@ -1150,11 +1150,11 @@ const initTeamSlack = async ({ return `<@${user.member.id}>`; }, postMessage: async (category, githubId, githubLogin, message) => { - context.log.debug('slack: post message', { + context.log.debug({ category, githubLogin, message - }); + }, 'slack: post message'); if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null; const userDmSettings = await getUserDmSettings(mongoStores, owner.login, owner.id, githubId); if (!userDmSettings[category]) return null; @@ -1177,11 +1177,11 @@ const initTeamSlack = async ({ }; }, updateMessage: async (ts, channel, message) => { - context.log.debug('slack: update message', { + context.log.debug({ ts, channel, message - }); + }, 'slack: update message'); if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null; const result = await slackClient.chat.update({ ts, @@ -1199,21 +1199,21 @@ const initTeamSlack = async ({ }; }, deleteMessage: async (ts, channel) => { - context.log.debug('slack: delete message', { + context.log.debug({ ts, channel - }); + }, 'slack: delete message'); await slackClient.chat.delete({ ts, channel }); }, addReaction: async (ts, channel, name) => { - context.log.debug('slack: add reaction', { + context.log.debug({ ts, channel, name - }); + }, 'slack: add reaction'); await slackClient.reactions.add({ timestamp: ts, channel, @@ -1221,9 +1221,9 @@ const initTeamSlack = async ({ }); }, updateHome: githubLogin => { - context.log.debug('update slack home', { + context.log.debug({ githubLogin - }); + }, 'update slack home'); const user = getUserFromGithubLogin(githubLogin); if (!user || !user.member) return; slackHome.scheduleUpdateMember(context.octokit, slackClient, { @@ -1282,22 +1282,22 @@ const initAccountContext = async (appContext, context, config, accountInfo) => { const logInfos = { account: accountInfo.login }; - context.log.info('lock: try to lock account', logInfos); // eslint-disable-next-line @typescript-eslint/no-misused-promises + context.log.info(logInfos, 'lock: try to lock account'); // eslint-disable-next-line @typescript-eslint/no-misused-promises lock$1('_', async createReleaseCallback => { const release = createReleaseCallback(() => {}); - context.log.info('lock: lock account acquired', logInfos); + context.log.info(logInfos, 'lock: lock account acquired'); try { await callback(); } catch (err) { - context.log.info('lock: release account (with error)', logInfos); + context.log.info(logInfos, 'lock: release account (with error)'); release(); reject(err); return; } - context.log.info('lock: release account', logInfos); + context.log.info(logInfos, 'lock: release account'); release(); resolve(); }); @@ -1419,9 +1419,9 @@ const hasFailedStatusOrChecks = async (pr, context) => { const failedChecks = checks.data.check_runs.filter(check => check.conclusion === 'failure'); if (failedChecks.length > 0) { - context.log.info(`automerge not possible: failed check pr ${pr.id}`, { + context.log.info({ checks: failedChecks.map(check => check.name) - }); + }, `automerge not possible: failed check pr ${pr.id}`); return true; } @@ -1432,9 +1432,9 @@ const hasFailedStatusOrChecks = async (pr, context) => { if (combinedStatus.data.state === 'failure') { const failedStatuses = combinedStatus.data.statuses.filter(status => status.state === 'failure' || status.state === 'error'); - context.log.info(`automerge not possible: failed status pr ${pr.id}`, { + context.log.info({ statuses: failedStatuses.map(status => status.context) - }); + }, `automerge not possible: failed status pr ${pr.id}`); return true; } @@ -1492,10 +1492,10 @@ const autoMergeIfPossible = async (pullRequest, context, repoContext, reviewflow const lockedPr = repoContext.getMergeLockedPr(); if (lockedPr && String(lockedPr.number) !== String(pullRequest.number)) { - context.log.info('automerge not possible: locked pr', { + context.log.info({ prId: pullRequest.id, prNumber: pullRequest.number - }); + }, 'automerge not possible: locked pr'); repoContext.pushAutomergeQueue(createMergeLockPrFromPr()); return false; } @@ -1577,10 +1577,10 @@ const autoMergeIfPossible = async (pullRequest, context, repoContext, reviewflow if (pullRequest.mergeable_state === 'behind') { addLog('behind mergeable_state', 'update branch'); - context.log.info('automerge not possible: update branch', { + context.log.info({ head: pullRequest.head.ref, base: pullRequest.base.ref - }); + }, 'automerge not possible: update branch'); await context.octokit.repos.merge({ owner: pullRequest.head.repo.owner.login, repo: pullRequest.head.repo.name, @@ -1609,11 +1609,13 @@ const autoMergeIfPossible = async (pullRequest, context, repoContext, reviewflow commit_message: options.featureBranch ? undefined : '' // TODO add BC }); - context.log.debug('merge result:', mergeResult.data); + context.log.debug(mergeResult.data, 'merge result:'); repoContext.removePrFromAutomergeQueue(context, pullRequest.number, 'merged'); return Boolean('merged' in mergeResult.data && mergeResult.data.merged); } catch (err) { - context.log.info('could not merge:', err.message); + context.log.info({ + errorMessage: err.message + }, 'could not merge:'); repoContext.reschedule(context, createMergeLockPrFromPr()); return false; } @@ -1804,12 +1806,12 @@ const initRepoLabels = async (context, config) => { })); finalLabels[labelKey] = result.data; } else if (existingLabel.name !== labelConfig.name || existingLabel.color !== labelColor || existingLabel.description !== description) { - context.log.info('Needs to update label', { + context.log.info({ current_name: existingLabel.name, name: existingLabel.name !== labelConfig.name && labelConfig.name, color: existingLabel.color !== labelColor && labelColor, description: existingLabel.description !== description && description - }); + }, 'Needs to update label'); const result = await context.octokit.issues.updateLabel(context.repo({ current_name: existingLabel.name, name: labelConfig.name, @@ -1886,22 +1888,22 @@ async function initRepoContext(appContext, context, config) { prOrPrIssueId, prNumber }; - context.log.debug('lock: try to lock pr', logInfos); // eslint-disable-next-line @typescript-eslint/no-misused-promises + context.log.debug(logInfos, 'lock: try to lock pr'); // eslint-disable-next-line @typescript-eslint/no-misused-promises lock$1(String(prNumber), async createReleaseCallback => { const release = createReleaseCallback(() => {}); - context.log.info('lock: lock pr acquired', logInfos); + context.log.info(logInfos, 'lock: lock pr acquired'); try { await callback(); } catch (err) { - context.log.info('lock: release pr (with error)', logInfos); + context.log.info(logInfos, 'lock: release pr (with error)'); release(); reject(err); return; } - context.log.info('lock: release pr', logInfos); + context.log.info(logInfos, 'lock: release pr'); release(); resolve(); }); @@ -1909,7 +1911,7 @@ async function initRepoContext(appContext, context, config) { const reschedule = (context, pr) => { if (!pr) throw new Error('Cannot reschedule undefined'); - context.log.info('reschedule', pr); + context.log.info(pr, 'reschedule'); setTimeout(() => { lockPR('reschedule', -1, () => { return lockPR(String(pr.id), pr.number, async () => { @@ -1954,7 +1956,12 @@ async function initRepoContext(appContext, context, config) { if (lockMergePr && String(lockMergePr.number) === String(prNumber)) { lockMergePr = automergeQueue.shift(); context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`); - context.log(`merge lock: next ${fullName}`, lockMergePr); + + if (lockMergePr) { + context.log(lockMergePr, `merge lock: next ${fullName}`); + } else { + context.log(`merge lock: nothing next ${fullName}`); + } if (lockMergePr) { reschedule(context, lockMergePr); @@ -1969,12 +1976,12 @@ async function initRepoContext(appContext, context, config) { } }, pushAutomergeQueue: pr => { - context.log('merge lock: push queue', { + context.log({ repo: fullName, pr, lockMergePr, automergeQueue - }); + }, 'merge lock: push queue'); if (!automergeQueue.some(p => p.number === pr.number)) { automergeQueue.push(pr); @@ -2084,11 +2091,11 @@ const addStatusCheck = async function (pullRequest, context, { const hasPrCheck = (await context.octokit.checks.listForRef(context.repo({ ref: pullRequest.head.sha }))).data.check_runs.find(check => check.name === process.env.REVIEWFLOW_NAME); - context.log.debug('add status check', { + context.log.debug({ hasPrCheck, state, description - }); + }, 'add status check'); if (hasPrCheck) { await context.octokit.checks.create(context.repo({ @@ -2111,11 +2118,11 @@ const addStatusCheck = async function (pullRequest, context, { }; const updateStatusCheckFromLabels = (pullRequest, context, repoContext, labels = pullRequest.labels || [], previousSha) => { - context.log.debug('updateStatusCheckFromLabels', { + context.log.debug({ labels: labels.map(l => l === null || l === void 0 ? void 0 : l.name), hasNeedsReview: repoContext.hasNeedsReview(labels), hasApprovesReview: repoContext.hasApprovesReview(labels) - }); + }, 'updateStatusCheckFromLabels'); const createFailedStatusCheck = description => addStatusCheck(pullRequest, context, { state: 'failure', @@ -2167,11 +2174,11 @@ const updateReviewStatus = async (pullRequest, context, repoContext, reviewGroup add: labelsToAdd, remove: labelsToRemove }) => { - context.log.debug('updateReviewStatus', { + context.log.debug({ reviewGroup, labelsToAdd, labelsToRemove - }); + }, 'updateReviewStatus'); let prLabels = pullRequest.labels || []; if (!reviewGroup) return prLabels; const newLabelNames = new Set(prLabels.map(label => label.name)); @@ -2236,13 +2243,13 @@ const updateReviewStatus = async (pullRequest, context, repoContext, reviewGroup if (toAdd.size !== 0 || toDelete.size !== 0) { if (toDelete.size === 0 || toDelete.size < 4) { - context.log.debug('updateReviewStatus', { + context.log.debug({ reviewGroup, toAdd: [...toAdd], toDelete: [...toDelete], toAddNames: [...toAddNames], toDeleteNames: [...toDeleteNames] - }); + }, 'updateReviewStatus'); if (toAdd.size !== 0) { const result = await context.octokit.issues.addLabels(context.issue({ @@ -2259,21 +2266,21 @@ const updateReviewStatus = async (pullRequest, context, repoContext, reviewGroup })); prLabels = result.data; } catch (err) { - context.log.warn('error removing label', { + context.log.warn({ err: err === null || err === void 0 ? void 0 : err.message - }); + }, 'error removing label'); } } } } else { const newLabelNamesArray = [...newLabelNames]; - context.log.debug('updateReviewStatus', { + context.log.debug({ reviewGroup, toAdd: [...toAdd], toDelete: [...toDelete], oldLabels: prLabels.map(l => l.name), newLabelNames: newLabelNamesArray - }); + }, 'updateReviewStatus'); const result = await context.octokit.issues.setLabels(context.issue({ labels: newLabelNamesArray })); @@ -2856,11 +2863,11 @@ const updateBranch = async (pullRequest, context, login) => { }).catch(err => ({ error: err })); - context.log.info('update branch result', { + context.log.info({ status: result.status, sha: (_result$data = result.data) === null || _result$data === void 0 ? void 0 : _result$data.sha, error: result.error - }); + }, 'update branch result'); if (result.status === 204) { context.octokit.issues.createComment(context.repo({ diff --git a/dist/index-node10-dev.cjs.js.map b/dist/index-node10-dev.cjs.js.map index b3a3c53de..ee12ec102 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/auth/github.ts","../src/views/Layout.tsx","../src/app/auth.tsx","../src/app/home.tsx","../src/accountConfigs/christophehurpeau.ts","../src/accountConfigs/defaultConfig.ts","../src/accountConfigs/ornikar.ts","../src/accountConfigs/reviewflow.ts","../src/accountConfigs/index.ts","../src/dm/defaultDmSettings.ts","../src/dm/getUserDmSettings.ts","../src/events/account-handlers/actions/syncOrg.ts","../src/events/account-handlers/actions/syncTeams.ts","../src/app/org-settings.tsx","../src/app/repository.tsx","../src/events/account-handlers/actions/syncUser.ts","../src/app/user-settings.tsx","../src/appRouter.tsx","../src/utils/Excludes.ts","../src/context/getOrCreateAccount.ts","../src/context/utils.ts","../src/context/voidTeamSlack.ts","../src/context/initTeamSlack.ts","../src/context/accountContext.ts","../src/events/account-handlers/utils/handler.ts","../src/events/pr-handlers/actions/utils/body/prOptions.ts","../src/events/pr-handlers/actions/utils/body/parseBody.ts","../src/events/pr-handlers/actions/utils/hasLabelInPR.ts","../src/events/pr-handlers/actions/autoMergeIfPossible.ts","../src/events/pr-handlers/actions/utils/body/updateBody.ts","../src/events/pr-handlers/utils/reviewflowComment.ts","../src/events/pr-handlers/utils/createPullRequestContext.ts","../src/events/pr-handlers/utils/fetchPr.ts","../src/context/initRepoLabels.ts","../src/context/repoContext.ts","../src/events/repository-handlers/utils/createRepoHandler.ts","../src/events/pr-handlers/utils/createPullRequestHandler.ts","../src/events/pr-handlers/checkrunCompleted.ts","../src/events/pr-handlers/checksuiteCompleted.ts","../src/events/pr-handlers/actions/utils/createStatus.ts","../src/events/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/events/pr-handlers/actions/updateReviewStatus.ts","../src/events/pr-handlers/closed.ts","../src/slack/utils.ts","../src/events/pr-handlers/utils/createSlackMessageWithSecondaryBlock.ts","../src/events/pr-handlers/utils/getPullRequestFromPayload.ts","../src/events/pr-handlers/utils/getReviewersAndReviewStates.ts","../src/events/pr-handlers/utils/isBotUser.ts","../src/events/pr-handlers/utils/parseMentions.ts","../src/events/pr-handlers/utils/slackifyCommentBody.ts","../src/events/pr-handlers/commentCreated.ts","../src/events/pr-handlers/actions/updatePrCommentBody.ts","../src/events/pr-handlers/actions/utils/syncLabel.ts","../src/events/pr-handlers/actions/syncLabelsAfterCommentBodyEdited.ts","../src/events/pr-handlers/commentEditedOrDeleted.ts","../src/events/pr-handlers/actions/readCommitsAndUpdateInfos.ts","../src/events/pr-handlers/actions/updatePr.ts","../src/events/pr-handlers/actions/utils/cleanTitle.ts","../src/events/pr-handlers/actions/editOpenedPR.ts","../src/events/pr-handlers/edited.ts","../src/events/pr-handlers/actions/updateBranch.ts","../src/events/pr-handlers/labelsChanged.ts","../src/events/pr-handlers/actions/autoApproveAndAutoMerge.ts","../src/events/pr-handlers/actions/autoAssignPRToCreator.ts","../src/events/pr-handlers/opened.ts","../src/events/pr-handlers/reopened.ts","../src/events/pr-handlers/reviewDismissed.ts","../src/events/pr-handlers/reviewRequestRemoved.ts","../src/events/pr-handlers/reviewRequested.ts","../src/events/pr-handlers/reviewSubmitted.ts","../src/events/pr-handlers/status.ts","../src/events/pr-handlers/synchronize.ts","../src/events/repository-handlers/repoEdited.ts","../src/initApp.ts","../src/mongo.ts","../src/slack/home.ts","../src/index.ts"],"sourcesContent":["import { create } from 'simple-oauth2';\n\nif (!process.env.GITHUB_CLIENT_ID) {\n throw new Error('Missing env variable: GITHUB_CLIENT_ID');\n}\n\nif (!process.env.GITHUB_CLIENT_SECRET) {\n throw new Error('Missing env variable: GITHUB_CLIENT_SECRET');\n}\n\nexport const oauth2 = create({\n client: {\n id: process.env.GITHUB_CLIENT_ID,\n secret: process.env.GITHUB_CLIENT_SECRET,\n },\n auth: {\n tokenHost: 'https://github.com',\n tokenPath: '/login/oauth/access_token',\n authorizePath: '/login/oauth/authorize',\n },\n});\n","import type { ReactElement, ReactNode } from 'react';\nimport React from 'react';\n\ninterface LayoutProps {\n lang?: string;\n title?: string;\n children: ReactNode;\n}\n\nexport default function Layout({\n lang = 'en',\n title = process.env.REVIEWFLOW_NAME,\n children,\n}: LayoutProps): ReactElement {\n return (\n \n \n \n \n {title}\n \n \n \n \n
{children}
\n \n \n );\n}\n","import { promisify } from 'util';\nimport { Octokit } from '@octokit/rest';\nimport type { Router, Request, Response } from 'express';\nimport { sign, verify } from 'jsonwebtoken';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport * as githubAuth from '../auth/github';\nimport Layout from '../views/Layout';\n\nif (!process.env.AUTH_SECRET_KEY) {\n throw new Error('Missing env variable: AUTH_SECRET_KEY');\n}\n\nconst AUTH_SECRET_KEY: string = process.env.AUTH_SECRET_KEY;\n\nconst signPromisified: any = promisify(sign);\nconst verifyPromisified: any = promisify(verify);\n\nconst secure =\n !!process.env.SECURE_COOKIE && process.env.SECURE_COOKIE !== 'false';\n\nconst createRedirectUri = (req: Request): string => {\n const host = `http${secure ? 's' : ''}://${req.hostname}${\n req.hostname === 'localhost' ? `:${process.env.PORT}` : ''\n }`;\n return `${host}/app/login-response`;\n};\n\ninterface AuthInfo {\n id: number;\n login: string;\n accessToken: string;\n time: number;\n}\n\nconst readAuthCookie = (\n req: Request,\n strategy: string,\n): undefined | Promise => {\n const cookie = req.cookies[`auth_${strategy}`];\n if (!cookie) return;\n\n return verifyPromisified(cookie, AUTH_SECRET_KEY, {\n algorithm: 'HS512',\n audience: req.headers['user-agent'],\n });\n};\n\nconst getAuthInfoFromCookie = async (\n req: Request,\n res: Response,\n): Promise => {\n const strategy = 'gh'; // req.params.strategy\n const authInfo = await readAuthCookie(req, strategy);\n\n if (authInfo?.id) {\n return authInfo;\n }\n\n res.clearCookie(`auth_${strategy}`);\n return undefined;\n};\n\nfunction createApi(accessToken: string): Octokit {\n return new Octokit({ auth: accessToken });\n}\n\nexport const getUser = async (\n req: Request,\n res: Response,\n): Promise<{\n authInfo: AuthInfo;\n api: Octokit;\n} | null> => {\n const authInfo = await getAuthInfoFromCookie(req, res);\n if (!authInfo) {\n res.redirect('/app/login');\n return null;\n }\n\n const api = createApi(authInfo.accessToken);\n\n return {\n authInfo,\n api,\n };\n};\n\nexport default function auth(router: Router): void {\n router.get('/login', async (req: Request, res: Response) => {\n if (await getAuthInfoFromCookie(req, res)) {\n return res.redirect('/app');\n }\n\n // const state = await randomHex(8);\n // res.cookie(`auth_${strategy}_${state}`, strategy, {\n // maxAge: 10 * 60 * 1000,\n // httpOnly: true,\n // secure,\n // });\n\n const redirectUri = githubAuth.oauth2.authorizationCode.authorizeURL({\n redirect_uri: createRedirectUri(req),\n scope: 'read:user,repo',\n // state,\n // grant_type: options.grantType,\n // access_type: options.accessType,\n // login_hint: req.query.loginHint,\n // include_granted_scopes: options.includeGrantedScopes,\n });\n\n // console.log(redirectUri);\n\n res.redirect(redirectUri);\n });\n\n router.get('/login-response', async (req, res) => {\n if (req.query.error) {\n res.send(req.query.error_description);\n return;\n }\n\n const strategy = 'gh';\n const code: string = req.query.code as string;\n // const state = req.query.state;\n // const cookieName = `auth_${strategy}_${state}`;\n // const cookie = req.cookies && req.cookies[cookieName];\n // if (!cookie) {\n // // res.redirect(`/${strategy}/login`);\n // res.send(\n // 'No cookie for this state. Retry ?',\n // );\n // return;\n // }\n // res.clearCookie(cookieName);\n\n const result = await githubAuth.oauth2.authorizationCode.getToken({\n code,\n redirect_uri: createRedirectUri(req),\n });\n\n if (!result) {\n res.send(\n renderToStaticMarkup(\n \n
\n Could not get access token. Retry ?\n
\n
,\n ),\n );\n return;\n }\n\n const accessToken = result.access_token;\n const api = createApi(accessToken);\n const user = await api.users.getAuthenticated({});\n const id = user.data.id;\n const login = user.data.login;\n\n const authInfo: AuthInfo = { id, login, accessToken, time: Date.now() };\n const token = await signPromisified(authInfo, AUTH_SECRET_KEY, {\n algorithm: 'HS512',\n audience: req.headers['user-agent'],\n expiresIn: '10 days',\n });\n\n res.cookie(`auth_${strategy}`, token, {\n httpOnly: true,\n secure,\n });\n\n res.redirect('/app');\n });\n}\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function home(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{process.env.REVIEWFLOW_NAME}

\n
\n
\n

Choose your account

\n \n
\n
\n
\n
,\n ),\n );\n });\n}\n","import type { 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 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 'merge/skip-ci': {\n name: 'automerge/skip-ci',\n color: '#e1e8ed',\n },\n 'merge/update-branch': {\n name: ':arrows_counterclockwise: update branch',\n color: '#64DD17',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n\n /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n color: '#ef7934',\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 type { Config } from './types';\n\nconst config: Config = {\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 groups: {},\n waitForGroups: {},\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 /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n color: '#ef7934',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n },\n },\n};\n\nexport default config;\n","import type { Config } from './types';\n\nconst config: Config<'dev' | 'design', 'ops' | 'frontends' | 'backends'> = {\n autoAssignToCreator: true,\n trimTitle: true,\n ignoreRepoPattern: '(infra-.*|devenv)',\n requiresReviewRequest: true,\n autoMergeRenovateWithSkipCi: 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 bot: false,\n regExp: /\\s([A-Z][\\dA-Z]+-(\\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 botUsers: ['michael-robot'],\n\n groups: {\n dev: {\n /* ops */\n JulienBreux: `julien.breux${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n TheR3aLp3nGuinJM: `jean-michel${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n\n /* back */\n abarreir: `alexandre${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 machartier: `marie-anne${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n\n /* front */\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n vlbr: `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'budet-b': `benjamin.budet${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n mdcarter: `maxime.dehaye${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n ChibiBlasphem: `christopher${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n PSniezak: `paul.sniezak${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 Lenamari: `lena${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n loicleser: null,\n },\n },\n\n teams: {\n ops: {\n logins: ['JulienBreux', 'Alan-pad', 'CamilSadiki', 'busser'],\n labels: ['teams/ops'],\n },\n\n backends: {\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n 'Radyum',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'vlbr',\n 'budet-b',\n 'mdcarter',\n 'ChibiBlasphem',\n 'PSniezak',\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 'teams/ops': {\n name: 'ops',\n color: '#003b55',\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 'merge/skip-ci': {\n name: 'automerge/skip-ci',\n color: '#e1e8ed',\n },\n 'merge/update-branch': {\n name: ':arrows_counterclockwise: update branch',\n color: '#e1e8ed',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n\n /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n description: 'This issue or pull request will need a new major version',\n color: '#FF6F00',\n },\n duplicate: {\n name: 'duplicate',\n description: 'This issue or pull request already exists',\n color: '#ECEFF1',\n },\n documentation: {\n name: 'documentation',\n description: 'Improvements or additions to documentation',\n color: '#7FCEFF',\n },\n rfc: {\n name: 'RFC',\n description: 'Request For Comments',\n color: '#FFD3B2',\n },\n bug: {\n name: 'bug',\n description: \"Something isn't working\",\n color: '#FF3D00',\n },\n enhancement: {\n name: 'enhancement',\n description: 'New feature or request',\n color: '#7FCEFF',\n },\n 'help-wanted': {\n name: 'help wanted',\n description: 'Extra attention is needed',\n color: '#B1EE8B',\n },\n question: {\n name: 'question',\n description: 'Further information is requested',\n color: '#F860A4',\n },\n wontfix: {\n name: 'wontfix',\n description: 'This will not be worked on',\n color: '#ECEFF1',\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 chrisconfig from './christophehurpeau';\nimport type { Config } from './types';\n\nconst config: Config<'dev', never> = {\n ...chrisconfig,\n requiresReviewRequest: true,\n groups: {\n dev: {\n christophehurpeau: 'christophe@hurpeau.com',\n 'chris-reviewflow': 'christophe.hurpeau+reviewflow@gmail.com',\n },\n },\n};\nexport default config;\n","import christophehurpeau from './christophehurpeau';\nimport defaultConfig from './defaultConfig';\nimport ornikar from './ornikar';\nimport reviewflow from './reviewflow';\nimport type { Config as ConfigType } from './types';\n\nexport type Config<\n GroupNames extends string = any,\n TeamNames extends string = any\n> = ConfigType;\n\nexport const accountConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n reviewflow,\n};\n\nexport { defaultConfig };\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","import type { MessageCategory } from './MessageCategory';\n\nexport const defaultDmSettings: Record = {\n 'pr-review': true,\n 'pr-review-follow': true,\n 'pr-comment': true,\n 'pr-comment-bots': true,\n 'pr-comment-follow': true,\n 'pr-comment-follow-bots': false,\n 'pr-comment-mention': true,\n 'pr-comment-thread': true,\n 'pr-merge-conflicts': true,\n 'issue-comment-mention': true,\n};\n","import { accountConfigs, defaultConfig } from '../accountConfigs';\nimport type { MongoStores } from '../mongo';\nimport type { MessageCategory } from './MessageCategory';\nimport { defaultDmSettings } from './defaultDmSettings';\n\nexport type UserDmSettings = Record;\nconst cache = new Map>();\n\nconst getDefaultDmSettings = (org: string): UserDmSettings => {\n const accountConfig = accountConfigs[org] || defaultConfig;\n return accountConfig.defaultDmSettings\n ? { ...defaultDmSettings, ...accountConfig.defaultDmSettings }\n : defaultDmSettings;\n};\n\nexport const updateCache = (\n org: string,\n userId: number,\n newSettings: Partial,\n): void => {\n let orgCache = cache.get(org);\n if (!orgCache) {\n orgCache = new Map();\n cache.set(org, orgCache);\n }\n orgCache.set(userId, { ...getDefaultDmSettings(org), ...newSettings });\n};\n\nexport const getUserDmSettings = async (\n mongoStores: MongoStores,\n org: string,\n orgId: number,\n userId: number,\n): Promise => {\n const orgDefaultDmSettings = getDefaultDmSettings(org);\n\n const userDmSettingsConfig = await mongoStores.userDmSettings.findOne({\n orgId,\n userId,\n });\n\n const config = userDmSettingsConfig\n ? {\n ...orgDefaultDmSettings,\n ...userDmSettingsConfig.settings,\n }\n : orgDefaultDmSettings;\n\n updateCache(org, userId, config);\n return config;\n};\n","import type { Octokit } from '@octokit/core';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { MongoStores, Org } from '../../../mongo';\n\ninterface OrgInfo {\n login: string;\n id: number;\n}\n\nexport const syncOrg = async (\n mongoStores: MongoStores,\n github: Octokit,\n installationId: number,\n org: OrgInfo,\n): Promise => {\n const orgInStore = await mongoStores.orgs.upsertOne({\n _id: org.id as any, // TODO _id is number\n login: org.login,\n installationId,\n });\n\n const orgEmbed = { id: org.id, login: org.login };\n\n const memberIds: number[] = [];\n\n await Promise.all(\n await github.paginate(\n github.orgs.listMembers.endpoint.merge({\n org: org.login,\n }),\n ({\n data,\n }: RestEndpointMethodTypes['orgs']['listMembers']['response']) => {\n return Promise.all(\n data.map(async (member) => {\n memberIds.push(member.id);\n return Promise.all([\n mongoStores.orgMembers.upsertOne({\n _id: `${org.id}_${member.id}`,\n org: orgEmbed,\n user: {\n id: member.id,\n login: member.login,\n },\n }),\n mongoStores.users.upsertOne({\n _id: member.id as any,\n login: member.login,\n type: member.type,\n }),\n ]);\n }),\n );\n },\n ),\n );\n\n await mongoStores.orgMembers.deleteMany({\n 'org.id': org.id,\n 'user.id': { $not: { $in: memberIds } },\n });\n\n return orgInStore;\n};\n","import type { Octokit } from '@octokit/core';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { MongoStores } from '../../../mongo';\n\nexport const syncTeams = async (\n mongoStores: MongoStores,\n github: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const orgEmbed = { id: org.id, login: org.login };\n\n const teamIds: number[] = [];\n\n await Promise.all(\n await github.paginate(\n github.teams.list.endpoint.merge({\n org: org.login,\n }),\n ({ data }: RestEndpointMethodTypes['teams']['list']['response']) => {\n return Promise.all(\n data.map((team) => {\n teamIds.push(team.id);\n return mongoStores.orgTeams.upsertOne({\n _id: team.id,\n org: orgEmbed,\n name: team.name,\n slug: team.slug,\n description: team.description,\n });\n }),\n );\n },\n ),\n );\n\n await mongoStores.orgTeams.deleteMany({\n 'org.id': org.id,\n _id: { $not: { $in: teamIds } },\n });\n};\n","import bodyParser from 'body-parser';\nimport type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { accountConfigs } from '../accountConfigs';\nimport type { MessageCategory } from '../dm/MessageCategory';\nimport { getUserDmSettings, updateCache } from '../dm/getUserDmSettings';\nimport { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeams } from '../events/account-handlers/actions/syncTeams';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nconst dmMessages: Record = {\n 'pr-review': 'You are assigned to a review, someone reviewed your PR',\n 'pr-review-follow': \"Someone reviewed a PR you're also reviewing\",\n 'pr-comment': 'Someone commented on your PR',\n 'pr-comment-bots': 'A bot commented on your PR',\n 'pr-comment-follow': \"Someone commented on a PR you're reviewing\",\n 'pr-comment-follow-bots': \"A bot commented on a PR you're reviewing\",\n 'pr-comment-mention': 'Someone mentioned you in a PR',\n 'pr-comment-thread': \"Someone replied to a discussion you're in\",\n 'pr-merge-conflicts': 'Your PR has a merge conflict (not implemented)',\n 'issue-comment-mention':\n 'Someone mentioned you in an issue (not implemented)',\n};\n\nexport default function orgSettings(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/org/:org/force-sync', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n const o = await mongoStores.orgs.findByKey(org.id);\n if (!o) return res.redirect('/app');\n\n await syncOrg(mongoStores, user.api, o.installationId as number, org);\n await syncTeams(mongoStores, user.api, org);\n\n res.redirect(`/app/org/${req.params.org}`);\n });\n\n router.get('/org/:org', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n const installation = await octokitApp.apps\n .getOrgInstallation({ org: org.login })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!installation) {\n return res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed for this user. Go to \"}\n \n Github Configuration\n {' '}\n to install it.\n
\n
,\n ),\n );\n }\n\n const accountConfig = accountConfigs[org.login];\n const userDmSettings = await getUserDmSettings(\n mongoStores,\n org.login,\n org.id,\n user.authInfo.id,\n );\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{process.env.REVIEWFLOW_NAME}

\n
\n

{org.login}

\n Switch account\n
\n\n
\n
\n

Information

\n {!accountConfig\n ? 'Default config is used: https://github.com/christophehurpeau/reviewflow/blob/master/src/accountConfigs/defaultConfig.ts'\n : `Custom config: https://github.com/christophehurpeau/reviewflow/blob/master/src/accountConfigs/${org.login}.ts`}\n
\n
\n

My DM Settings

\n {Object.entries(dmMessages).map(([key, name]) => (\n
\n \n
\n ))}\n
\n
\n
\n
,\n ),\n );\n });\n\n router.patch('/org/:org', bodyParser.json(), async (req, res) => {\n if (!req.body) {\n res.status(400).send('not ok');\n return;\n }\n\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n (await mongoStores.userDmSettings.collection).updateOne(\n {\n _id: `${org.id}_${user.authInfo.id}`,\n },\n {\n $set: {\n [`settings.${req.body.key}`]: req.body.value,\n updated: new Date(),\n },\n $setOnInsert: {\n orgId: org.id,\n userId: user.authInfo.id,\n created: new Date(),\n },\n },\n { upsert: true },\n );\n\n const userDmSettingsConfig = await mongoStores.userDmSettings.findOne({\n orgId: org.id,\n userId: user.authInfo.id,\n });\n\n if (userDmSettingsConfig) {\n updateCache(org.login, user.authInfo.id, userDmSettingsConfig.settings);\n }\n\n res.send('ok');\n });\n}\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function repository(\n router: Router,\n octokitApp: InstanceType,\n): void {\n router.get('/repositories', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n const { data } = await user.api.repos.listForAuthenticatedUser({\n per_page: 100,\n });\n\n res.send(\n renderToStaticMarkup(\n \n
\n

Your repositories

\n \n\n {data.length === 100 && (\n
We currently have a limit to 100 repositories
\n )}\n
\n
,\n ),\n );\n });\n\n router.get('/repository/:owner/:repository', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n const { data } = await user.api.repos.get({\n owner: req.params.owner,\n repo: req.params.repository,\n });\n\n if (!data) {\n res.status(404).send(\n renderToStaticMarkup(\n \n
repo not found
\n
,\n ),\n );\n return;\n }\n\n if (!data.permissions || !data.permissions.admin) {\n res.status(401).send(\n renderToStaticMarkup(\n \n
\n not authorized to see this repo, you need to have admin permission\n
\n
,\n ),\n );\n return;\n }\n\n const { data: data2 } = await octokitApp.apps\n .getRepoInstallation({\n owner: req.params.owner,\n repo: req.params.repository,\n })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!data2) {\n res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed on this repo. Go to \"}\n \n Github Configuration\n {' '}\n to add it.\n
\n
,\n ),\n );\n return;\n }\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{req.params.repository}

\n
\n
,\n ),\n );\n });\n}\n","import type { Octokit } from '@octokit/core';\nimport type { MongoStores, User } from '../../../mongo';\n\ninterface UserInfo {\n login: string;\n id: number;\n}\n\nexport const syncUser = async (\n mongoStores: MongoStores,\n github: Octokit,\n installationId: number,\n userInfo: UserInfo,\n): Promise => {\n const user = await mongoStores.users.upsertOne({\n _id: userInfo.id,\n login: userInfo.login,\n type: 'User',\n installationId,\n });\n\n return user;\n};\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function userSettings(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/user/force-sync', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n // const { data: installation } = await api.apps\n // .getUserInstallation({\n // username: user.authInfo.login,\n // })\n // .catch((err) => {\n // return { status: err.status, data: undefined };\n // });\n\n // console.log(installation);\n\n const u = await mongoStores.users.findByKey(user.authInfo.id);\n if (!u || !u.installationId) return res.redirect('/app');\n\n await syncUser(\n mongoStores,\n user.api,\n u.installationId as number,\n user.authInfo,\n );\n\n res.redirect('/app/user');\n });\n\n router.get('/user', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const { data: installation } = await octokitApp.apps\n .getUserInstallation({\n username: user.authInfo.login,\n })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!installation) {\n return res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed for this user. Go to \"}\n \n Github Configuration\n {' '}\n to install it.\n
\n
,\n ),\n );\n }\n\n return res.send(\n renderToStaticMarkup(\n \n
{process.env.REVIEWFLOW_NAME} is installed for this user
\n
,\n ),\n );\n });\n}\n","import cookieParser from 'cookie-parser';\nimport type { Probot, run } from 'probot';\nimport auth from './app/auth';\nimport home from './app/home';\nimport orgSettings from './app/org-settings';\nimport repository from './app/repository';\nimport userSettings from './app/user-settings';\nimport type { AppContext } from './context/AppContext';\n\nexport default async function appRouter(\n app: Probot,\n getRouter: Parameters<\n // eslint-disable-next-line @typescript-eslint/ban-types\n Extract[0], Function>\n >[0]['getRouter'],\n { mongoStores }: AppContext,\n): Promise {\n const router = getRouter('/app');\n const octokitApp = await app.auth();\n\n router.use(cookieParser());\n\n auth(router);\n repository(router, octokitApp);\n home(router, octokitApp, mongoStores);\n orgSettings(router, octokitApp, mongoStores);\n userSettings(router, octokitApp, mongoStores);\n}\n","export const ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const ExcludesNullish = (((res: any) => res !== null) as any) as (\n x: T | null,\n) => x is T;\n","import type { Octokit } from '@octokit/core';\nimport { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeams } from '../events/account-handlers/actions/syncTeams';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { Org, User } from '../mongo';\nimport type { AppContext } from './AppContext';\n\nexport interface AccountInfo {\n id: number;\n login: string;\n type: string;\n}\n\nexport const getOrCreateAccount = async (\n { mongoStores }: AppContext,\n github: Octokit,\n installationId: number,\n accountInfo: AccountInfo,\n): Promise => {\n switch (accountInfo.type) {\n case 'Organization': {\n let org = await mongoStores.orgs.findByKey(accountInfo.id);\n if (org?.installationId) return org;\n\n // TODO diff org vs user...\n org = await syncOrg(mongoStores, github, installationId, accountInfo);\n await syncTeams(mongoStores, github, accountInfo);\n return org;\n }\n\n case 'User': {\n let user = await mongoStores.users.findByKey(accountInfo.id);\n if (user?.installationId) return user;\n\n user = await syncUser(mongoStores, github, installationId, accountInfo);\n return user;\n }\n\n default:\n throw new Error(`Account type not supported ${accountInfo.type}`);\n }\n};\n","import createEmojiRegex from 'emoji-regex';\n\nexport const getKeys = >(\n o: T,\n): (keyof T)[] => Object.keys(o) as (keyof T)[];\n\nconst emojiRegex = createEmojiRegex();\n\nexport const getEmojiFromRepoDescription = (\n description: string | null,\n): string => {\n if (!description) return '';\n if (description.startsWith(':')) {\n const [, emoji] = /^(:\\w+:)/.exec(description) || [];\n return emoji || '';\n }\n const match = emojiRegex.exec(description);\n if (match && description.startsWith(match[0])) return match[0];\n return '';\n};\n","import type { TeamSlack } from './TeamSlack';\n\nexport const voidTeamSlack = (): TeamSlack => ({\n mention: (): string => '',\n postMessage: (): Promise => Promise.resolve(null),\n updateMessage: (): Promise => Promise.resolve(null),\n deleteMessage: (): Promise => Promise.resolve(undefined),\n addReaction: (): Promise => Promise.resolve(undefined),\n updateHome: (): void => undefined,\n});\n","import { WebClient } from '@slack/web-api';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport type { MessageCategory } from '../dm/MessageCategory';\nimport { getUserDmSettings } from '../dm/getUserDmSettings';\nimport type { Org, User } from '../mongo';\nimport type { AppContext } from './AppContext';\nimport type { SlackMessage } from './SlackMessage';\nimport type { TeamSlack, PostSlackMessageResult } from './TeamSlack';\nimport { getKeys } from './utils';\nimport { voidTeamSlack } from './voidTeamSlack';\n\nexport type { TeamSlack };\n\nexport const initTeamSlack = async (\n { mongoStores, slackHome }: AppContext,\n context: Context,\n config: Config,\n account: Org | User,\n): Promise => {\n const owner = context.payload.repository.owner;\n const slackToken = 'slackToken' in account && account.slackToken;\n\n if (!slackToken) {\n return voidTeamSlack();\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 slackEmails = Object.values(githubLoginToSlackEmail);\n const slackClient = new WebClient(slackToken);\n\n const membersInDb = await mongoStores.orgMembers.findAll({\n 'org.id': account._id,\n });\n\n const members: [string, { member: any; im: any }][] = [];\n const foundEmailMembers: string[] = [];\n\n Object.entries(githubLoginToSlackEmail).forEach(([login, email]) => {\n const member = membersInDb.find((m) => m.user.login === login);\n if (member?.slack?.id) {\n foundEmailMembers.push(email);\n members.push([email, { member: { id: member.slack.id }, im: undefined }]);\n }\n });\n\n if (foundEmailMembers.length !== slackEmails.length) {\n const missingEmails = slackEmails.filter(\n (email) => !foundEmailMembers.includes(email),\n );\n\n const memberEmailToMemberId = new Map(\n Object.entries(githubLoginToSlackEmail).map(([login, email]) => [\n email,\n membersInDb.find((m) => m.user.login === login)?._id as any,\n ]),\n );\n\n await slackClient.paginate('users.list', {}, (page: any) => {\n page.members.forEach((member: any) => {\n const email = member.profile?.email;\n if (email && missingEmails.includes(email)) {\n members.push([email, { member, im: undefined }]);\n if (memberEmailToMemberId.has(email)) {\n mongoStores.orgMembers.partialUpdateMany(\n {\n _id: memberEmailToMemberId.get(email),\n },\n { $set: { slack: { id: member.id } } },\n );\n }\n }\n });\n return false;\n });\n }\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.conversations.open({\n users: user.member.id,\n });\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): string => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (\n category: MessageCategory,\n githubId: number,\n githubLogin: string,\n message: SlackMessage,\n ): Promise => {\n context.log.debug('slack: post message', {\n category,\n githubLogin,\n message,\n });\n if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null;\n\n const userDmSettings = await getUserDmSettings(\n mongoStores,\n owner.login,\n owner.id,\n githubId,\n );\n\n if (!userDmSettings[category]) return null;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return null;\n const result = await slackClient.chat.postMessage({\n username: process.env.REVIEWFLOW_NAME,\n channel: user.im.id,\n text: message.text,\n blocks: message.blocks,\n attachments: message.secondaryBlocks\n ? [{ blocks: message.secondaryBlocks }]\n : undefined,\n thread_ts: message.ts,\n });\n if (!result.ok) return null;\n return { ts: result.ts as string, channel: result.channel as string };\n },\n updateMessage: async (\n ts: string,\n channel: string,\n message: SlackMessage,\n ): Promise => {\n context.log.debug('slack: update message', { ts, channel, message });\n if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null;\n\n const result = await slackClient.chat.update({\n ts,\n channel,\n text: message.text,\n blocks: message.blocks,\n attachments: message.secondaryBlocks\n ? [{ blocks: message.secondaryBlocks }]\n : undefined,\n });\n if (!result.ok) return null;\n return { ts: result.ts as string, channel: result.channel as string };\n },\n deleteMessage: async (ts: string, channel: string): Promise => {\n context.log.debug('slack: delete message', { ts, channel });\n await slackClient.chat.delete({\n ts,\n channel,\n });\n },\n addReaction: async (\n ts: string,\n channel: string,\n name: string,\n ): Promise => {\n context.log.debug('slack: add reaction', { ts, channel, name });\n await slackClient.reactions.add({\n timestamp: ts,\n channel,\n name,\n });\n },\n\n updateHome: (githubLogin: string): void => {\n context.log.debug('update slack home', { githubLogin });\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.member) return;\n\n slackHome.scheduleUpdateMember(context.octokit, slackClient, {\n user: { id: null, login: githubLogin },\n org: { id: account._id, login: account.login },\n slack: { id: user.member.id },\n } as any);\n },\n };\n};\n","import { Lock } from 'lock';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport type { Org, User, AccountEmbed, AccountType } from '../mongo';\nimport { ExcludesFalsy } from '../utils/Excludes';\nimport type { AppContext } from './AppContext';\nimport type { AccountInfo } from './getOrCreateAccount';\nimport { getOrCreateAccount } from './getOrCreateAccount';\nimport type { TeamSlack } from './initTeamSlack';\nimport { initTeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface AccountContext<\n GroupNames extends string = any,\n TeamNames extends string = any\n> {\n config: Config;\n accountType: AccountType;\n account: Org | User;\n accountEmbed: AccountEmbed;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => GroupNames | undefined;\n getReviewerGroups: (githubLogins: string[]) => GroupNames[];\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\n approveShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n\n lock: (callback: () => Promise | void) => Promise;\n}\n\nconst initAccountContext = async (\n appContext: AppContext,\n context: Context,\n config: Config,\n accountInfo: AccountInfo,\n): Promise => {\n const account = await getOrCreateAccount(\n appContext,\n context.octokit,\n context.payload.installation.id,\n accountInfo,\n );\n const slackPromise = initTeamSlack(appContext, context, config, account);\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((teamName) => {\n (config.teams as NonNullable)[teamName].logins.forEach(\n (login) => {\n const teams = githubLoginToTeams.get(login);\n if (teams) {\n teams.push(teamName);\n } else {\n githubLoginToTeams.set(login, [teamName]);\n }\n },\n );\n });\n\n const getReviewerGroups = (githubLogins: string[]): string[] => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ];\n\n const lock = Lock();\n\n return {\n config,\n account,\n accountEmbed: {\n id: accountInfo.id,\n login: accountInfo.login,\n type: accountInfo.type as AccountType,\n },\n accountType: accountInfo.type as AccountType,\n lock: (callback: () => Promise | void): Promise => {\n return new Promise((resolve, reject) => {\n const logInfos = { account: accountInfo.login };\n context.log.info('lock: try to lock account', logInfos);\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n lock('_', async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n context.log.info('lock: lock account acquired', logInfos);\n try {\n await callback();\n } catch (err) {\n context.log.info('lock: release account (with error)', logInfos);\n release();\n reject(err);\n return;\n }\n context.log.info('lock: release account', logInfos);\n release();\n resolve();\n });\n });\n },\n getReviewerGroup: (githubLogin): string | undefined =>\n githubLoginToGroup.get(githubLogin),\n getReviewerGroups,\n\n getTeamsForLogin: (githubLogin): string[] =>\n githubLoginToTeams.get(githubLogin) || [],\n\n approveShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ): boolean => {\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 accountContextsPromise = new Map();\nconst accountContexts = new Map();\n\nexport const obtainAccountContext = (\n appContext: AppContext,\n context: Context,\n config: Config,\n accountInfo: AccountInfo,\n): Promise => {\n const existingAccountContext = accountContexts.get(accountInfo.login);\n if (existingAccountContext) return existingAccountContext;\n\n const existingPromise = accountContextsPromise.get(accountInfo.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initAccountContext(appContext, context, config, accountInfo);\n accountContextsPromise.set(accountInfo.login, promise);\n\n return promise.then((accountContext) => {\n accountContextsPromise.delete(accountInfo.login);\n accountContexts.set(accountInfo.login, accountContext);\n return accountContext;\n });\n};\n","import type { Context } from 'probot';\nimport { accountConfigs, defaultConfig } from '../../../accountConfigs';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { AccountContext } from '../../../context/accountContext';\nimport { obtainAccountContext } from '../../../context/accountContext';\n\ntype CallbackContextAndAccountContext = (\n context: Context,\n accountContext: AccountContext,\n) => void | Promise;\n\nexport const handlerOrgChange = async <\n T extends { organization?: { id: number; login: string } }\n>(\n appContext: AppContext,\n context: Context,\n callback: CallbackContextAndAccountContext,\n): Promise => {\n const org = context.payload.organization;\n if (!org) return;\n const config = accountConfigs[org.login] || defaultConfig;\n const accountContext = await obtainAccountContext(\n appContext,\n context,\n config,\n { ...org, type: 'Organization' },\n );\n if (!accountContext) return;\n\n return accountContext.lock(async () => {\n await callback(context, accountContext);\n });\n};\n\nexport const createHandlerOrgChange = <\n T extends { organization?: { id: number; login: string } }\n>(\n appContext: AppContext,\n callback: CallbackContextAndAccountContext,\n) => (context: Context) => {\n return handlerOrgChange(appContext, context, callback);\n};\n","export type OptionsKeys =\n | 'featureBranch'\n | 'autoMergeWithSkipCi'\n | 'autoMerge'\n | 'deleteAfterMerge';\n\nexport type Options = Record;\n\nexport const options: OptionsKeys[] = [\n 'featureBranch',\n 'autoMergeWithSkipCi',\n 'autoMerge',\n 'deleteAfterMerge',\n];\nexport const optionsRegexps: {\n key: OptionsKeys;\n regexp: RegExp;\n}[] = options.map((option) => ({\n key: option,\n regexp: new RegExp(`\\\\[([ xX]?)]\\\\s*`),\n}));\n\nexport const optionsLabels: { key: OptionsKeys; label: string }[] = [\n { key: 'featureBranch', label: 'This PR is a feature branch' },\n {\n key: 'autoMergeWithSkipCi',\n label: 'Add `[skip ci]` on merge commit',\n },\n {\n key: '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 key: 'deleteAfterMerge',\n label: 'Automatic branch delete after this PR is merged',\n },\n];\n","import { optionsRegexps } from './prOptions';\nimport type { Options } from './prOptions';\n\nexport type { Options } from './prOptions';\n\nexport const parseOptions = (\n content: string,\n defaultOptions: Options,\n): Options => {\n return optionsRegexps.reduce((acc, { key, regexp }) => {\n const match = regexp.exec(content);\n acc[key] = !match\n ? defaultOptions[key] || false\n : match[1] === 'x' || match[1] === 'X';\n return acc;\n }, {}) as Options;\n};\n\nexport const parseCommitNotes = (content: string): string => {\n const commitNotes = content.replace(\n /^.*#### Commits Notes:(.*)#### Options:.*$/s,\n '$1',\n );\n\n if (commitNotes === content) {\n return '';\n } else {\n return commitNotes.trim();\n }\n};\n\ninterface ParsedBody {\n options: Options;\n commitNotes: string;\n}\n\nexport const parseBody = (\n content: string,\n defaultOptions: Options,\n): ParsedBody => {\n return {\n options: parseOptions(content, defaultOptions),\n commitNotes: parseCommitNotes(content),\n };\n};\n","import type { PullRequestLabels } from 'events/pr-handlers/utils/PullRequestData';\nimport type { LabelResponse } from '../../../../context/initRepoLabels';\n\nexport default function hasLabelInPR(\n prLabels: PullRequestLabels,\n label: LabelResponse,\n): boolean {\n if (!label) return false;\n return prLabels.some((l): boolean => l.id === label.id);\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { AutomergeLog } from 'mongo';\nimport type {\n PullRequestData,\n PullRequestFromRestEndpoint,\n PullRequestLabels,\n} from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { parseBody } from './utils/body/parseBody';\nimport hasLabelInPR from './utils/hasLabelInPR';\n\nconst hasFailedStatusOrChecks = async (\n pr: PullRequestData,\n context: Context,\n): Promise => {\n const checks = await context.octokit.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.octokit.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 pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n prLabels: PullRequestLabels = pullRequest.labels,\n): Promise => {\n if (reviewflowPrContext === null) return false;\n\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n\n if (!hasLabelInPR(prLabels, autoMergeLabel)) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'no automerge label',\n );\n return false;\n }\n\n const isRenovatePr = pullRequest.head.ref.startsWith('renovate/');\n\n const createMergeLockPrFromPr = () => ({\n id: pullRequest.id,\n number: pullRequest.number,\n branch: pullRequest.head.ref,\n });\n\n if (pullRequest.state !== 'open') {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr is not opened',\n );\n }\n\n const addLog = (\n type: AutomergeLog['type'],\n action: AutomergeLog['action'],\n ): void => {\n const repoFullName = pullRequest.head.repo.full_name;\n context.log.info(`automerge: ${repoFullName}#${pullRequest.id} ${type}`);\n repoContext.appContext.mongoStores.automergeLogs.insertOne({\n account: repoContext.accountEmbed,\n repoFullName,\n pr: {\n id: pullRequest.id,\n number: pullRequest.number,\n isRenovate: isRenovatePr,\n mergeableState: pullRequest.mergeable_state,\n },\n type,\n action,\n });\n };\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'blocking labels',\n );\n return false;\n }\n\n if (pullRequest.requested_reviewers.length > 0) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested reviewers',\n );\n return false;\n }\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (lockedPr && String(lockedPr.number) !== String(pullRequest.number)) {\n context.log.info('automerge not possible: locked pr', {\n prId: pullRequest.id,\n prNumber: pullRequest.number,\n });\n repoContext.pushAutomergeQueue(createMergeLockPrFromPr());\n return false;\n }\n\n repoContext.addMergeLockPr(createMergeLockPrFromPr());\n\n if (pullRequest.mergeable == null) {\n const prResult = await context.octokit.pulls.get(\n context.repo({\n pull_number: pullRequest.number,\n }),\n );\n pullRequest = prResult.data;\n }\n\n if (pullRequest.merged) {\n addLog('already merged', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr already merged',\n );\n return false;\n }\n\n context.log.info(\n `automerge?: ${pullRequest.id}, #${pullRequest.number}, mergeable=${pullRequest.mergeable} state=${pullRequest.mergeable_state}`,\n );\n\n // https://github.com/octokit/octokit.net/issues/1763\n if (\n !(\n pullRequest.mergeable_state === 'clean' ||\n pullRequest.mergeable_state === 'has_hooks' ||\n pullRequest.mergeable_state === 'unstable'\n )\n ) {\n if (\n !pullRequest.mergeable_state ||\n pullRequest.mergeable_state === 'unknown'\n ) {\n addLog('unknown mergeable_state', 'reschedule');\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n\n if (isRenovatePr) {\n if (\n pullRequest.mergeable_state === 'behind' ||\n pullRequest.mergeable_state === 'dirty'\n ) {\n addLog('rebase-renovate', 'wait');\n\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n if (pullRequest.body.includes('')) {\n if (pullRequest.body.includes('[x] ')) {\n return false;\n }\n\n const renovateRebaseBody = pullRequest.body.replace(\n '[ ] ',\n '[x] ',\n );\n await context.octokit.issues.update(\n context.repo({\n issue_number: pullRequest.number,\n body: renovateRebaseBody,\n }),\n );\n } else if (!pullRequest.title.startsWith('rebase!')) {\n await context.octokit.issues.update(\n context.repo({\n issue_number: pullRequest.number,\n title: `rebase!${pullRequest.title}`,\n }),\n );\n }\n return false;\n }\n\n if (await hasFailedStatusOrChecks(pullRequest, context)) {\n addLog('failed status or checks', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'failed status or checks',\n );\n return false;\n } else if (pullRequest.mergeable_state === 'blocked') {\n addLog('blocked mergeable_state', 'wait');\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=${pullRequest.mergeable_state}`,\n );\n return false;\n }\n\n if (pullRequest.mergeable_state === 'blocked') {\n if (await hasFailedStatusOrChecks(pullRequest, context)) {\n addLog('failed status or checks', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'failed status or checks',\n );\n return false;\n } else {\n addLog('blocked mergeable_state', 'wait');\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n }\n\n if (pullRequest.mergeable_state === 'behind') {\n addLog('behind mergeable_state', 'update branch');\n context.log.info('automerge not possible: update branch', {\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n });\n\n await context.octokit.repos.merge({\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n head: pullRequest.base.ref,\n base: pullRequest.head.ref,\n });\n\n return false;\n }\n\n addLog('not mergeable', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n `mergeable_state=${pullRequest.mergeable_state}`,\n );\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${pullRequest.mergeable_state}`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pullRequest.number}`);\n\n const parsedBody = parseBody(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n );\n const options = parsedBody?.options || repoContext.config.prDefaultOptions;\n\n const mergeResult = await context.octokit.pulls.merge({\n merge_method: options.featureBranch ? 'merge' : 'squash',\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n pull_number: pullRequest.number,\n commit_title: options.featureBranch\n ? undefined\n : `${pullRequest.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pullRequest.number})`,\n commit_message: options.featureBranch ? undefined : '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'merged',\n );\n return Boolean('merged' in mergeResult.data && 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 type { StatusInfo } from 'accountConfigs/types';\nimport type { Options } from './parseBody';\nimport { parseOptions } from './parseBody';\nimport { optionsLabels } from './prOptions';\n\nexport const defaultCommentBody = 'This will be auto filled by reviewflow.';\n\nconst toMarkdownOptions = (options: Options) => {\n return optionsLabels\n .map(\n ({ key, label }) =>\n `- [${options[key] ? 'x' : ' '}] ${label}`,\n )\n .join('\\n');\n};\n\nconst toMarkdownInfos = (infos: StatusInfo[]): string => {\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 commentBody: string;\n options?: Options;\n}\n\nconst getReplacement = (infos?: StatusInfo[]): string => {\n if (!infos) return '$1$2';\n return infos.length > 0\n ? `#### Infos:\\n\\n${toMarkdownInfos(infos)}\\n\\n$2`\n : '$2';\n};\n\nconst updateOptions = (\n options: Options,\n optionsToUpdate?: Partial,\n): Options => {\n if (!optionsToUpdate) return options;\n return { ...options, ...optionsToUpdate };\n};\n\nconst internalUpdateBodyOptionsAndInfos = (\n body: string,\n options: Options,\n infos?: StatusInfo[],\n): string => {\n const infosAndCommitNotesParagraph = body.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*)?(#### Commits Notes:.*)?#### Options:)?.*$/s,\n getReplacement(infos),\n );\n\n return `${infosAndCommitNotesParagraph}#### Options:\\n${toMarkdownOptions(\n options,\n )}`;\n};\n\nexport const createCommentBody = (\n defaultOptions: Options,\n infos?: StatusInfo[],\n): string => {\n return internalUpdateBodyOptionsAndInfos('', defaultOptions, infos);\n};\n\nexport const updateCommentOptions = (\n commentBody: string,\n defaultOptions: Options,\n optionsToUpdate?: Partial,\n): UpdatedBodyWithOptions => {\n const options = parseOptions(commentBody, defaultOptions);\n const updatedOptions = updateOptions(options, optionsToUpdate);\n\n return {\n options: updatedOptions,\n commentBody: internalUpdateBodyOptionsAndInfos(commentBody, updatedOptions),\n };\n};\n\nexport const updateCommentBodyInfos = (\n commentBody: string,\n infos?: StatusInfo[],\n): string => {\n return commentBody.replace(\n // * - zero or more\n // *? - zero or more (non-greedy)\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*?)?(#### Commits Notes:.*?)?(#### Options:.*?)?)?$/s,\n `${getReplacement(infos)}$3`,\n );\n};\n\nexport const updateCommentBodyCommitsNotes = (\n commentBody: string,\n commitNotes?: string,\n): string => {\n return commentBody.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /(?:#### Commits Notes:.*?)?(#### Options:)/s,\n // eslint-disable-next-line no-nested-ternary\n !commitNotes ? '$1' : `#### Commits Notes:\\n\\n${commitNotes}\\n\\n$1`,\n );\n};\n\nexport const removeDeprecatedReviewflowInPrBody = (prBody: string): string => {\n return prBody.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(.*)(.*)(.*)$/is,\n // eslint-disable-next-line no-nested-ternary\n '$1$3',\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\n\nexport const createReviewflowComment = (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n body: string,\n): Promise<\n RestEndpointMethodTypes['issues']['createComment']['response']['data']\n> => {\n return context.octokit.issues\n .createComment(context.repo({ issue_number: pullRequestNumber, body }))\n .then(({ data }) => data);\n};\n\nexport const getReviewflowCommentById = (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n commentId: number,\n): Promise<\n RestEndpointMethodTypes['issues']['getComment']['response']['data'] | null\n> => {\n return context.octokit.issues\n .getComment(\n context.repo({\n issue_number: pullRequestNumber,\n comment_id: commentId,\n }),\n )\n .then(\n ({ data }) => data,\n () => null,\n );\n};\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { ReviewflowPr } from 'mongo';\nimport { defaultCommentBody } from '../actions/utils/body/updateBody';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\nimport {\n createReviewflowComment,\n getReviewflowCommentById,\n} from './reviewflowComment';\n\nexport interface CreatePrContextOptions {\n reviewflowCommentPromise?: ReturnType;\n}\n\nexport interface ReviewflowPrContext {\n reviewflowPr: ReviewflowPr;\n commentBody: string;\n}\n\nexport const getReviewflowPrContext = async (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n repoContext: RepoContext,\n reviewflowCommentPromise?: ReturnType,\n): Promise => {\n const appContext = repoContext.appContext;\n const prEmbed = { number: pullRequestNumber };\n\n if (reviewflowCommentPromise) {\n const comment = await reviewflowCommentPromise;\n const reviewflowPr = await appContext.mongoStores.prs.insertOne({\n account: repoContext.accountEmbed,\n repo: repoContext.repoEmbed,\n pr: prEmbed,\n commentId: comment.id,\n });\n return { reviewflowPr, commentBody: comment.body };\n }\n\n const existing = await appContext.mongoStores.prs.findOne({\n 'account.id': repoContext.accountEmbed.id,\n 'repo.id': repoContext.repoEmbed.id,\n 'pr.number': pullRequestNumber,\n });\n const comment =\n existing &&\n (await getReviewflowCommentById(\n pullRequestNumber,\n context,\n existing.commentId,\n ));\n\n if (!comment || !existing) {\n const comment = await createReviewflowComment(\n pullRequestNumber,\n context,\n defaultCommentBody,\n );\n\n if (!existing) {\n const reviewflowPr = await appContext.mongoStores.prs.insertOne({\n account: repoContext.accountEmbed,\n repo: repoContext.repoEmbed,\n pr: prEmbed,\n commentId: comment.id,\n });\n return { reviewflowPr, commentBody: comment.body };\n } else {\n await appContext.mongoStores.prs.partialUpdateByKey(existing._id, {\n $set: { commentId: comment.id },\n });\n }\n }\n\n return { reviewflowPr: existing, commentBody: comment!.body };\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\n\nexport const fetchPr = async (\n context: Context,\n prNumber: number,\n): Promise => {\n const prResult = await context.octokit.pulls.get(\n context.repo({ pull_number: prNumber }),\n );\n\n return prResult.data;\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\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 LabelsRecord {\n [key: string]: LabelResponse;\n}\n\nexport const getLabelsForRepo = async (\n context: Context,\n): Promise<\n RestEndpointMethodTypes['issues']['listLabelsForRepo']['response']['data']\n> => {\n const { data: labels } = await context.octokit.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n return labels;\n};\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const labels = await getLabelsForRepo(context);\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 = labelConfig.description\n ? `${labelConfig.description} - Synced by reviewflow`\n : `Synced by reviewflow 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 if (labelKey === 'teams/ops') {\n existingLabel = labels.find((label) => label.name === 'archi');\n }\n }\n\n if (!existingLabel) {\n const result = await context.octokit.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 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.octokit.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","import { Lock } from 'lock';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport { accountConfigs, defaultConfig } from '../accountConfigs';\nimport type { GroupLabels } from '../accountConfigs/types';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../events/pr-handlers/actions/autoMergeIfPossible';\nimport type {\n PullRequestData,\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../events/pr-handlers/utils/PullRequestData';\nimport { getReviewflowPrContext } from '../events/pr-handlers/utils/createPullRequestContext';\nimport { fetchPr } from '../events/pr-handlers/utils/fetchPr';\nimport { ExcludesFalsy } from '../utils/Excludes';\nimport type { AppContext } from './AppContext';\nimport type { AccountContext } from './accountContext';\nimport { obtainAccountContext } from './accountContext';\nimport type { LabelResponse, LabelsRecord } from './initRepoLabels';\nimport { initRepoLabels } from './initRepoLabels';\nimport { getEmojiFromRepoDescription } from './utils';\n\nexport interface LockedMergePr {\n id: number;\n number: number;\n branch: string;\n}\n\ninterface RepoContextWithoutTeamContext {\n appContext: AppContext;\n repoFullName: string;\n repoEmbed: { id: number; name: string };\n repoEmoji: string | undefined;\n labels: LabelsRecord;\n protectedLabelIds: readonly LabelResponse['id'][];\n shouldIgnore: boolean;\n\n hasNeedsReview: (labels: PullRequestLabels) => boolean;\n hasRequestedReview: (labels: PullRequestLabels) => boolean;\n hasChangesRequestedReview: (labels: PullRequestLabels) => boolean;\n hasApprovesReview: (labels: PullRequestLabels) => boolean;\n getNeedsReviewGroupNames: (labels: PullRequestLabels) => GroupNames[];\n\n lockPullRequest: (\n pullRequest: PullRequestData,\n callback: () => Promise | void,\n ) => Promise;\n\n /** @deprecated */\n lockPR: (\n prId: string,\n prNumber: number,\n callback: () => Promise | void,\n ) => Promise;\n\n getMergeLockedPr: () => LockedMergePr;\n addMergeLockPr: (pr: LockedMergePr) => void;\n removePrFromAutomergeQueue: (\n context: Context,\n prNumber: number,\n reason: string,\n ) => void;\n reschedule: (context: Context, pr: LockedMergePr) => void;\n pushAutomergeQueue: (pr: LockedMergePr) => void;\n}\n\nexport type RepoContext = AccountContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nexport const shouldIgnoreRepo = (\n repoName: string,\n accountConfig: Config,\n): boolean => {\n const ignoreRepoRegexp =\n accountConfig.ignoreRepoPattern &&\n new RegExp(`^${accountConfig.ignoreRepoPattern}$`);\n\n if (repoName === 'reviewflow-test') {\n return process.env.REVIEWFLOW_NAME !== 'reviewflow-dev';\n }\n\n if (ignoreRepoRegexp) {\n return ignoreRepoRegexp.test(repoName);\n }\n\n return false;\n};\n\nconst createGetReviewLabelIds = (\n shouldIgnore: boolean,\n config: Config,\n reviewGroupNames: GroupNames[],\n labels: LabelsRecord,\n): ((labelKey: GroupLabels) => number[]) => {\n if (shouldIgnore) return (labelKey: GroupLabels): number[] => [];\n return (labelKey: GroupLabels): number[] =>\n reviewGroupNames\n .map((key) => config.labels.review[key][labelKey])\n .filter(Boolean)\n .map((name) => labels[name].id);\n};\n\nasync function initRepoContext(\n appContext: AppContext,\n context: Context,\n config: Config,\n): Promise> {\n const {\n id,\n name,\n full_name: fullName,\n owner: org,\n description,\n } = context.payload.repository;\n const repoEmoji = getEmojiFromRepoDescription(description);\n\n const accountContext = await obtainAccountContext(\n appContext,\n context,\n config,\n org,\n );\n const repoContext = Object.create(accountContext);\n\n const shouldIgnore = shouldIgnoreRepo(name, config);\n\n const labels = shouldIgnore ? {} : await initRepoLabels(context, config);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const getReviewLabelIds = createGetReviewLabelIds(\n shouldIgnore,\n config,\n reviewGroupNames,\n labels,\n );\n\n const needsReviewLabelIds = getReviewLabelIds('needsReview');\n const requestedReviewLabelIds = getReviewLabelIds('requested');\n const changesRequestedLabelIds = getReviewLabelIds('changesRequested');\n const approvedReviewLabelIds = getReviewLabelIds('approved');\n\n const protectedLabelIds = [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ];\n\n const labelIdToGroupName = new Map();\n if (!shouldIgnore) {\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\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: PullRequestLabels): 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 lockPR = (\n prOrPrIssueId: string,\n prNumber: number,\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n const logInfos = {\n repo: fullName,\n prOrPrIssueId,\n prNumber,\n };\n context.log.debug('lock: try to lock pr', logInfos);\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n lock(String(prNumber), async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n context.log.info('lock: lock pr acquired', logInfos);\n try {\n await callback();\n } catch (err) {\n context.log.info('lock: release pr (with error)', logInfos);\n release();\n reject(err);\n return;\n }\n context.log.info('lock: release pr', logInfos);\n release();\n resolve();\n });\n });\n\n const lockPullRequest = (\n pullRequest: PullRequestWithDecentData,\n callback: () => Promise | void,\n ): Promise => {\n return lockPR(String(pullRequest.id), pullRequest.number, callback);\n };\n\n const reschedule = (context: Context, pr: LockedMergePr): void => {\n if (!pr) throw new Error('Cannot reschedule undefined');\n context.log.info('reschedule', pr);\n setTimeout(() => {\n lockPR('reschedule', -1, () => {\n return lockPR(String(pr.id), pr.number, async () => {\n const [pullRequest, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pr.number),\n getReviewflowPrContext(pr.number, context, repoContext),\n ]);\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n });\n });\n }, 10_000);\n };\n\n return Object.assign(repoContext, {\n appContext,\n labels,\n repoFullName: fullName,\n repoEmbed: { id, name },\n repoEmoji,\n protectedLabelIds,\n shouldIgnore,\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', {\n repo: fullName,\n pr,\n });\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: (\n context,\n prNumber: number | string,\n reason: string,\n ): void => {\n if (lockMergePr && String(lockMergePr.number) === String(prNumber)) {\n lockMergePr = automergeQueue.shift();\n context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`);\n context.log(`merge lock: next ${fullName}`, lockMergePr);\n if (lockMergePr) {\n reschedule(context, lockMergePr);\n }\n } else {\n const previousLength = automergeQueue.length;\n automergeQueue = automergeQueue.filter(\n (value) => String(value.number) !== String(prNumber),\n );\n if (automergeQueue.length !== previousLength) {\n context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`);\n }\n }\n },\n pushAutomergeQueue: (pr: LockedMergePr): void => {\n context.log('merge lock: push queue', {\n repo: fullName,\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 lockPR,\n lockPullRequest,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n appContext: AppContext,\n context: Context,\n): Promise | RepoContext | null => {\n const repo = context.payload.repository;\n const owner = repo.owner;\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 let accountConfig = accountConfigs[owner.login];\n\n if (!accountConfig) {\n console.warn(`using default config for ${owner.login}`);\n accountConfig = defaultConfig as Config;\n }\n\n const promise = initRepoContext(appContext, context, accountConfig);\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 type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { OnCallback } from 'probot/lib/application';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { RepoContext } from '../../../context/repoContext';\nimport { obtainRepoContext } from '../../../context/repoContext';\n\nexport const createRepoHandler = <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n appContext: AppContext,\n callback: (\n context: Context,\n repoContext: RepoContext,\n ) => Promise | void,\n): OnCallback => {\n return async (context): Promise => {\n const repoContext = await obtainRepoContext(appContext, context);\n if (!repoContext) return;\n\n return callback(context, repoContext);\n };\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { OnCallback } from 'probot/lib/application';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { RepoContext, LockedMergePr } from '../../../context/repoContext';\nimport { createRepoHandler } from '../../repository-handlers/utils/createRepoHandler';\nimport type {\n PullRequestData,\n PullRequestFromWebhook,\n} from './PullRequestData';\nimport type {\n CreatePrContextOptions,\n ReviewflowPrContext,\n} from './createPullRequestContext';\nimport { getReviewflowPrContext } from './createPullRequestContext';\n\nexport type CallbackWithPRAndRepoContext = (\n pullRequest: T,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createPullRequestHandler = <\n T extends\n | EventPayloads.WebhookPayloadPullRequest\n | EventPayloads.WebhookPayloadPullRequestReview\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n | EventPayloads.WebhookPayloadPullRequestReviewComment,\n U extends PullRequestFromWebhook\n>(\n appContext: AppContext,\n getPullRequestInPayload: (\n payload: Context['payload'],\n context: Context,\n repoContext: RepoContext,\n ) => U | null,\n callbackPr: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext | null,\n ) => void | Promise,\n callbackBeforeLock?: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n ) => CreatePrContextOptions,\n): OnCallback => {\n return createRepoHandler(appContext, async (context, repoContext) => {\n const pullRequest: U | null = getPullRequestInPayload(\n context.payload,\n context,\n repoContext,\n );\n if (pullRequest === null) return;\n const options = callbackBeforeLock\n ? callbackBeforeLock(pullRequest, context, repoContext)\n : {};\n\n await repoContext.lockPullRequest(pullRequest, async () => {\n /*\n * When repo are ignored, only slack notifications are sent.\n * PR is not linted, commented, nor auto merged.\n */\n const reviewflowPrContext = repoContext.shouldIgnore\n ? null\n : await getReviewflowPrContext(\n pullRequest.number,\n context,\n repoContext,\n options.reviewflowCommentPromise,\n );\n\n return callbackPr(pullRequest, context, repoContext, reviewflowPrContext);\n });\n });\n};\n\nexport const createPullRequestsHandler = <\n T extends { repository: EventPayloads.PayloadRepository },\n U extends PullRequestFromWebhook | LockedMergePr\n>(\n appContext: AppContext,\n getPrs: (payload: Context['payload'], repoContext: RepoContext) => U[],\n callbackPr: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n ) => void | Promise,\n): OnCallback => {\n return createRepoHandler(appContext, async (context, repoContext) => {\n const prs = getPrs(context.payload, repoContext);\n if (prs.length === 0) return;\n\n await Promise.all(\n prs.map((pr) =>\n repoContext.lockPR(String(pr.id), pr.number, async () => {\n return callbackPr(pr, context, repoContext);\n }),\n ),\n );\n });\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { getReviewflowPrContext } from './utils/createPullRequestContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function checkrunCompleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'check_run.completed',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext) => {\n if (repoContext.shouldIgnore) return [];\n return payload.check_run.pull_requests;\n },\n async (pullRequest, context, repoContext) => {\n const [updatedPr, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pullRequest.number),\n getReviewflowPrContext(pullRequest.number, context, repoContext),\n ]);\n\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { getReviewflowPrContext } from './utils/createPullRequestContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function checksuiteCompleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'check_suite.completed',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext) => {\n if (repoContext.shouldIgnore) return [];\n return payload.check_suite.pull_requests;\n },\n async (pullRequest, context, repoContext) => {\n const [updatedPr, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pullRequest.number),\n getReviewflowPrContext(pullRequest.number, context, repoContext),\n ]);\n\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\n\nexport default async function createStatus<\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n context: Context,\n name: string,\n sha: string,\n type: 'failure' | 'success',\n description: string,\n url?: string,\n): Promise {\n await context.octokit.repos.createCommitStatus(\n context.repo({\n context:\n name === ''\n ? process.env.REVIEWFLOW_NAME\n : `${process.env.REVIEWFLOW_NAME}/${name}`,\n sha,\n state: type,\n description,\n target_url: url,\n }),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport createStatus from './utils/createStatus';\n\nconst addStatusCheck = async function <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n { state, description }: { state: 'failure' | 'success'; description: string },\n previousSha?: string,\n): Promise {\n const hasPrCheck = (\n await context.octokit.checks.listForRef(\n context.repo({\n ref: pullRequest.head.sha,\n }),\n )\n ).data.check_runs.find((check) => check.name === process.env.REVIEWFLOW_NAME);\n\n context.log.debug('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.octokit.checks.create(\n context.repo({\n name: process.env.REVIEWFLOW_NAME as string,\n head_sha: pullRequest.head.sha,\n started_at: pullRequest.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 if (previousSha && state === 'failure') {\n await Promise.all([\n createStatus(\n context,\n '',\n previousSha,\n 'success',\n 'New commits have been pushed',\n ),\n createStatus(context, '', pullRequest.head.sha, state, description),\n ]);\n } else {\n await createStatus(context, '', pullRequest.head.sha, state, description);\n }\n};\n\nexport const updateStatusCheckFromLabels = <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n labels: PullRequestLabels = pullRequest.labels || [],\n previousSha?: string,\n): Promise => {\n context.log.debug('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l?.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n const createFailedStatusCheck = (description: string): Promise =>\n addStatusCheck(\n pullRequest,\n context,\n {\n state: 'failure',\n description,\n },\n previousSha,\n );\n\n if (pullRequest.requested_reviewers.length > 0) {\n return createFailedStatusCheck(\n // TODO remove `as`\n // https://github.com/probot/probot/issues/1219\n `Awaiting review from: ${pullRequest.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\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 `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 '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(\n pullRequest,\n context,\n {\n state: 'success',\n description: '✓ PR ready to merge !',\n },\n previousSha,\n );\n // }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { GroupLabels } from '../../../accountConfigs/types';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends { repository: EventPayloads.PayloadRepository },\n GroupNames extends string = any\n>(\n pullRequest: PullRequestWithDecentData,\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.debug('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n let prLabels: PullRequestLabels = pullRequest.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(prLabels.map((label) => label.name));\n\n const toAdd = new Set();\n const toAddNames = new Set();\n const toDelete = new Set();\n const toDeleteNames = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (\n key: GroupLabels,\n ): undefined | PullRequestLabels[number] => {\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 toAddNames.add(label.name);\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 toDeleteNames.add(existing.name);\n }\n });\n }\n\n // TODO move that elsewhere\n\n repoContext.getTeamsForLogin(pullRequest.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 toAddNames.add(label.name);\n }\n });\n }\n });\n\n // if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return;\n\n if (toAdd.size !== 0 || toDelete.size !== 0) {\n if (toDelete.size === 0 || toDelete.size < 4) {\n context.log.debug('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n toAddNames: [...toAddNames],\n toDeleteNames: [...toDeleteNames],\n });\n\n if (toAdd.size !== 0) {\n const result = await context.octokit.issues.addLabels(\n context.issue({\n labels: [...toAddNames],\n }),\n );\n prLabels = result.data;\n }\n\n if (toDelete.size !== 0) {\n for (const toDeleteName of [...toDeleteNames]) {\n try {\n const result = await context.octokit.issues.removeLabel(\n context.issue({\n name: toDeleteName,\n }),\n );\n prLabels = result.data;\n } catch (err) {\n context.log.warn('error removing label', {\n err: err?.message,\n });\n }\n }\n }\n } else {\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.debug('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n const result = await context.octokit.issues.setLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(\n pullRequest,\n context,\n repoContext,\n prLabels,\n );\n // }\n\n return prLabels;\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseOptions } from './actions/utils/body/parseBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function closed(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.closed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n if (!repoContext.shouldIgnore && reviewflowPrContext) {\n const repo = context.payload.repository;\n\n if (pullRequest.merged) {\n const isNotFork = pullRequest.head.repo.id === repo.id;\n const options = parseOptions(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n );\n\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr closed',\n ),\n isNotFork && options.deleteAfterMerge\n ? context.octokit.git\n .deleteRef(\n context.repo({ ref: `heads/${pullRequest.head.ref}` }),\n )\n .catch(() => {})\n : undefined,\n ]);\n } else {\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr closed',\n ),\n updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n },\n ),\n );\n}\n","import type { RepoContext } from '../context/repoContext';\n\nexport const createLink = (url: string, text: string): string => {\n return `<${url}|${text}>`;\n};\n\nexport const createPrLink = (\n pr: { html_url: string; number: number },\n repoContext: RepoContext,\n): string => {\n return createLink(\n pr.html_url,\n `${repoContext.repoEmoji ? `${repoContext.repoEmoji} ` : ''}${\n repoContext.repoFullName\n }#${pr.number}`,\n );\n};\n","import type { KnownBlock } from '@slack/web-api';\nimport type { SlackMessage } from '../../../context/SlackMessage';\n\nexport const createMrkdwnSectionBlock = (text: string): KnownBlock => ({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text,\n },\n});\n\nexport const createSlackMessageWithSecondaryBlock = (\n message: string,\n secondaryBlockText?: string | null,\n): SlackMessage => {\n return {\n text: message,\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: message,\n },\n },\n ],\n secondaryBlocks: !secondaryBlockText\n ? undefined\n : [createMrkdwnSectionBlock(secondaryBlockText)],\n };\n};\n","import type { EventPayloads } from '@octokit/webhooks';\n\ntype WebhookPr =\n | EventPayloads.WebhookPayloadPullRequest['pull_request']\n | EventPayloads.WebhookPayloadPullRequestReviewPullRequest;\n\ntype PullRequestHandlerAllowedPayloads =\n | {\n repository: EventPayloads.PayloadRepository;\n pull_request: WebhookPr;\n }\n | {\n repository: EventPayloads.PayloadRepository;\n issue: EventPayloads.WebhookPayloadIssueCommentIssue;\n };\n\nexport type PullRequestFromPayload<\n T extends PullRequestHandlerAllowedPayloads\n> = T extends { pull_request: WebhookPr }\n ? T['pull_request']\n : T extends { issue: EventPayloads.WebhookPayloadIssueCommentIssue }\n ? T['issue'] /* & T['issue']['pull_request'] */\n : never;\n\n/** deprecated */\nexport const getPullRequestFromPayload = <\n T extends PullRequestHandlerAllowedPayloads\n>(\n payload: T,\n): PullRequestFromPayload => {\n const pullRequest: WebhookPr = (payload as any).pull_request;\n if (pullRequest) {\n return pullRequest as PullRequestFromPayload;\n }\n\n const issue = (payload as any).issue;\n if (issue?.pull_request) {\n return {\n ...issue,\n ...issue.pull_request,\n };\n }\n\n throw new Error('No pull_request in payload');\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { RepoContext } from '../../../context/repoContext';\nimport { getKeys } from '../../../context/utils';\n\ntype ReviewState = 'CHANGES_REQUESTED' | 'APPROVED' | 'DISMISSED';\n\ninterface ReviewStates {\n approved: number;\n changesRequested: number;\n dismissed: number;\n}\ninterface Reviewer {\n id: number;\n login: string;\n}\n\nexport const getReviewersAndReviewStates = async (\n context: Context,\n repoContext: RepoContext,\n): Promise<{\n reviewers: Reviewer[];\n reviewStates: Record;\n}> => {\n const userIds = new Set();\n const reviewers: Reviewer[] = [];\n const reviewStatesByUser = new Map();\n\n await context.octokit.paginate(\n context.octokit.pulls.listReviews,\n context.pullRequest(),\n ({\n data: reviews,\n }: RestEndpointMethodTypes['pulls']['listReviews']['response']) => {\n reviews.forEach((review) => {\n if (!userIds.has(review.user.id)) {\n userIds.add(review.user.id);\n reviewers.push({ id: review.user.id, login: review.user.login });\n }\n const state = review.state.toUpperCase();\n if (state !== 'COMMENTED') {\n reviewStatesByUser.set(review.user.id, state as ReviewState);\n }\n });\n\n return [];\n },\n );\n\n const reviewStates: Record = {} as Record<\n GroupNames,\n ReviewStates\n >;\n\n getKeys(repoContext.config.groups).forEach((groupName) => {\n reviewStates[groupName] = {\n approved: 0,\n changesRequested: 0,\n dismissed: 0,\n };\n });\n\n reviewers.forEach((reviewer) => {\n const group = repoContext.getReviewerGroup(reviewer.login);\n if (group) {\n const state = reviewStatesByUser.get(reviewer.id);\n switch (state) {\n case 'APPROVED':\n reviewStates[group].approved++;\n break;\n case 'CHANGES_REQUESTED':\n reviewStates[group].changesRequested++;\n break;\n case 'DISMISSED':\n reviewStates[group].dismissed++;\n break;\n }\n }\n });\n\n return { reviewers, reviewStates };\n};\n","import type { RepoContext } from '../../../context/repoContext';\n\nexport const checkIfUserIsBot = (\n repoContext: RepoContext,\n user: { login: string; type: string },\n): boolean => {\n if (user.type === 'Bot') return true;\n if (repoContext.config.botUsers) {\n return repoContext.config.botUsers.includes(user.login);\n }\n return false;\n};\n\nexport const checkIfIsThisBot = (user: {\n login: string;\n type: string;\n}): boolean => {\n return (\n user.type === 'Bot' && user.login === `${process.env.REVIEWFLOW_NAME}[bot]`\n );\n};\n","import issueParser from 'issue-parser';\n\nconst parse = issueParser('github', { actions: {}, issuePrefixes: [] });\n\nexport const parseMentions = (body: string): readonly string[] => {\n return parse(body).mentions.map((m) => m.user);\n};\n","import slackifyMarkdown from 'slackify-markdown';\n\nexport const slackifyCommentBody = (\n body: string,\n multipleLines: boolean,\n): string => {\n return slackifyMarkdown(\n body\n .replace('```suggestion', '_Suggested change:_\\n```suggestion')\n .replace(\n '```suggestion\\r\\n```',\n `_Suggestion to remove line${multipleLines ? 's' : ''}._\\n`,\n ),\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport type { SlackMessage } from '../../context/SlackMessage';\nimport type { PostSlackMessageResult } from '../../context/TeamSlack';\nimport type { AccountEmbed } from '../../mongo';\nimport * as slackUtils from '../../slack/utils';\nimport { ExcludesNullish } from '../../utils/Excludes';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createSlackMessageWithSecondaryBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport type { PullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getPullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { checkIfUserIsBot, checkIfIsThisBot } from './utils/isBotUser';\nimport { parseMentions } from './utils/parseMentions';\nimport { slackifyCommentBody } from './utils/slackifyCommentBody';\n\nconst getDiscussion = async (\n context: Context,\n comment: any,\n): Promise<\n RestEndpointMethodTypes['pulls']['listComments']['response']['data']\n> => {\n if (!comment.in_reply_to_id) return [comment];\n return context.octokit.paginate(\n context.octokit.pulls.listComments.endpoint.merge(context.pullRequest()),\n ({\n data,\n }: RestEndpointMethodTypes['pulls']['listComments']['response']) => {\n return data.filter(\n (c) =>\n c.in_reply_to_id === comment.in_reply_to_id ||\n c.id === comment.in_reply_to_id,\n );\n },\n );\n};\n\nconst getMentions = (\n discussion: RestEndpointMethodTypes['pulls']['listComments']['response']['data'],\n): string[] => {\n const mentions = new Set();\n\n discussion.forEach((c) => {\n parseMentions(c.body).forEach((m) => mentions.add(m));\n });\n\n return [...mentions];\n};\n\nconst getUsersInThread = (\n discussion: RestEndpointMethodTypes['pulls']['listComments']['response']['data'],\n): { id: number; login: string }[] => {\n const userIds = new Set();\n const users: { id: number; login: string }[] = [];\n\n discussion.forEach((c) => {\n if (userIds.has(c.user.id)) return;\n userIds.add(c.user.id);\n users.push({ id: c.user.id, login: c.user.login });\n });\n\n return users;\n};\n\nexport default function prCommentCreated(\n app: Probot,\n appContext: AppContext,\n): void {\n const saveInDb = async (\n type: 'review-comment' | 'issue-comment',\n commentId: number,\n accountEmbed: AccountEmbed,\n results: PostSlackMessageResult[],\n message: SlackMessage,\n ): Promise => {\n const filtered = results.filter(ExcludesNullish);\n if (filtered.length === 0) return;\n\n await appContext.mongoStores.slackSentMessages.insertOne({\n type,\n typeId: commentId,\n message,\n account: accountEmbed,\n sentTo: filtered,\n });\n };\n\n app.on(\n [\n 'pull_request_review_comment.created',\n // comments without review and without path are sent with issue_comment.created.\n // createHandlerPullRequestChange checks if pull_request event is present, removing real issues comments.\n 'issue_comment.created',\n ],\n createPullRequestHandler<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment,\n | PullRequestFromPayload<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n >\n | any\n >(\n appContext,\n (payload, context) => {\n if (checkIfIsThisBot(payload.comment.user)) {\n // ignore comments from this bot\n return null;\n }\n return getPullRequestFromPayload(payload);\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const pr = await fetchPr(context, pullRequest.number);\n const { comment } = context.payload;\n const type = (comment as any).pull_request_review_id\n ? 'review-comment'\n : 'issue-comment';\n\n const body = comment.body;\n if (!body) return;\n\n const commentByOwner = pr.user.login === comment.user.login;\n const [discussion, { reviewers }] = await Promise.all([\n getDiscussion(context, comment),\n getReviewersAndReviewStates(context, repoContext),\n ]);\n\n const followers = reviewers.filter(\n (u) => u.id !== pr.user.id && u.id !== comment.user.id,\n );\n\n if (pr.requested_reviewers) {\n followers.push(\n ...pr.requested_reviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== comment.user.id &&\n rr.id !== pr.user.id\n );\n }),\n );\n }\n\n const usersInThread = getUsersInThread(discussion).filter(\n (u) =>\n u.id !== pr.user.id &&\n u.id !== comment.user.id &&\n !followers.find((f) => f.id === u.id),\n );\n const mentions = getMentions(discussion).filter(\n (m) =>\n m !== pr.user.login &&\n m !== comment.user.login &&\n !followers.find((f) => f.login === m) &&\n !usersInThread.find((u) => u.login === m),\n );\n\n const mention = repoContext.slack.mention(comment.user.login);\n const prUrl = slackUtils.createPrLink(pr, repoContext);\n const ownerMention = repoContext.slack.mention(pr.user.login);\n const commentLink = slackUtils.createLink(\n comment.html_url,\n (comment as any).in_reply_to_id ? 'replied' : 'commented',\n );\n\n const createMessage = (toOwner?: boolean): string => {\n const ownerPart = toOwner\n ? 'your PR'\n : `${\n pr.user.id === comment.user.id ? 'his' : `${ownerMention}'s`\n } PR`;\n return `:speech_balloon: ${mention} ${commentLink} on ${ownerPart} ${prUrl}`;\n };\n\n const promisesOwner = [];\n const promisesNotOwner = [];\n const slackifiedBody = slackifyCommentBody(\n comment.body,\n (comment as any).start_line !== null,\n );\n const isBotUser = checkIfUserIsBot(repoContext, comment.user);\n\n if (!commentByOwner) {\n const slackMessage = createSlackMessageWithSecondaryBlock(\n createMessage(true),\n slackifiedBody,\n );\n\n promisesOwner.push(\n repoContext.slack\n .postMessage(\n isBotUser ? 'pr-comment-bots' : 'pr-comment',\n pr.user.id,\n pr.user.login,\n slackMessage,\n )\n .then((res) =>\n saveInDb(\n type,\n comment.id,\n repoContext.accountEmbed,\n [res],\n slackMessage,\n ),\n ),\n );\n }\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n promisesNotOwner.push(\n ...followers.map((follower) =>\n repoContext.slack.postMessage(\n isBotUser ? 'pr-comment-follow-bots' : 'pr-comment-follow',\n follower.id,\n follower.login,\n message,\n ),\n ),\n );\n\n promisesNotOwner.push(\n ...usersInThread.map((user) =>\n repoContext.slack.postMessage(\n 'pr-comment-thread',\n user.id,\n user.login,\n message,\n ),\n ),\n );\n\n if (mentions.length > 0) {\n await appContext.mongoStores.users\n .findAll({ login: { $in: mentions } })\n .then((users) => {\n promisesNotOwner.push(\n ...users.map((u) =>\n repoContext.slack.postMessage(\n 'pr-comment-mention',\n u._id,\n u.login,\n message,\n ),\n ),\n );\n });\n }\n\n await Promise.all([\n Promise.all(promisesOwner),\n Promise.all(promisesNotOwner).then((results) =>\n saveInDb(\n type,\n comment.id,\n repoContext.accountEmbed,\n results,\n message,\n ),\n ),\n ]);\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport type { Options } from './utils/body/prOptions';\nimport { updateCommentOptions } from './utils/body/updateBody';\n\nconst updatePrCommentBody = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n reviewflowPrContext: ReviewflowPrContext,\n newBody: string,\n): Promise => {\n await context.octokit.issues.updateComment(\n context.repo({\n comment_id: reviewflowPrContext.reviewflowPr.commentId,\n body: newBody,\n }),\n );\n reviewflowPrContext.commentBody = newBody;\n};\n\nexport const updatePrCommentBodyIfNeeded = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n reviewflowPrContext: ReviewflowPrContext,\n newBody: string,\n): Promise => {\n if (reviewflowPrContext.commentBody !== newBody) {\n await updatePrCommentBody(context, reviewflowPrContext, newBody);\n }\n};\n\nexport const updatePrCommentBodyOptions = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n updateOptions: Partial,\n): Promise => {\n const { commentBody: newBody } = updateCommentOptions(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n updateOptions,\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newBody);\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from 'events/pr-handlers/utils/PullRequestData';\nimport type { LabelResponse } from '../../../../context/initRepoLabels';\nimport hasLabelInPR from './hasLabelInPR';\n\ninterface SyncLabelOptions {\n onRemove?: () => void | Promise;\n onAdd?: (prLabels: LabelResponse[]) => void | Promise;\n}\n\nexport default async function syncLabel<\n T extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n shouldHaveLabel: boolean,\n label: LabelResponse,\n prHasLabel = hasLabelInPR(pullRequest.labels, label),\n { onRemove, onAdd }: SyncLabelOptions = {},\n): Promise {\n if (prHasLabel && !shouldHaveLabel) {\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n if (onRemove) await onRemove();\n }\n if (shouldHaveLabel && !prHasLabel) {\n const response = await context.octokit.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n if (onAdd) await onAdd(response.data);\n }\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type {\n PullRequestFromRestEndpoint,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport type { Options } from './utils/body/prOptions';\nimport { updateCommentOptions } from './utils/body/updateBody';\nimport hasLabelInPR from './utils/hasLabelInPR';\nimport syncLabel from './utils/syncLabel';\n\nexport const calcDefaultOptions = (\n repoContext: RepoContext,\n pullRequest: PullRequestWithDecentData,\n): Options => {\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasFeatureBranchLabel = hasLabelInPR(\n pullRequest.labels,\n featureBranchLabel,\n );\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n return {\n ...repoContext.config.prDefaultOptions,\n featureBranch: prHasFeatureBranchLabel,\n autoMergeWithSkipCi: prHasSkipCiLabel,\n autoMerge: prHasAutoMergeLabel,\n };\n};\n\nexport const syncLabelsAfterCommentBodyEdited = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n): Promise => {\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasFeatureBranchLabel = hasLabelInPR(\n pullRequest.labels,\n featureBranchLabel,\n );\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n const { commentBody, options } = updateCommentOptions(\n reviewflowPrContext.commentBody,\n calcDefaultOptions(repoContext, pullRequest),\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, commentBody);\n\n if (options && (featureBranchLabel || automergeLabel)) {\n await Promise.all([\n featureBranchLabel &&\n syncLabel(\n pullRequest,\n context,\n options.featureBranch,\n featureBranchLabel,\n prHasFeatureBranchLabel,\n ),\n skipCiLabel &&\n syncLabel(\n pullRequest,\n context,\n options.autoMergeWithSkipCi,\n skipCiLabel,\n prHasSkipCiLabel,\n ),\n automergeLabel &&\n syncLabel(\n pullRequest,\n context,\n options.autoMerge,\n automergeLabel,\n prHasAutoMergeLabel,\n {\n onAdd: async (prLabels) => {\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n prLabels,\n );\n },\n onRemove: () => {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'label removed',\n );\n },\n },\n ),\n ]);\n }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { syncLabelsAfterCommentBodyEdited } from './actions/syncLabelsAfterCommentBodyEdited';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createMrkdwnSectionBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport type { PullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getPullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { checkIfIsThisBot } from './utils/isBotUser';\nimport { slackifyCommentBody } from './utils/slackifyCommentBody';\n\nexport default function prCommentEditedOrDeleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n [\n 'pull_request_review_comment.edited',\n 'pull_request_review_comment.deleted',\n // comments without review and without path are sent with issue_comment.created.\n // createHandlerPullRequestChange checks if pull_request event is present, removing real issues comments.\n 'issue_comment.edited',\n 'issue_comment.deleted',\n ],\n createPullRequestHandler<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment,\n | PullRequestFromPayload<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n >\n | any\n >(\n appContext,\n (payload) => {\n if (checkIfIsThisBot(payload.sender)) {\n // ignore edits made from this bot\n return null;\n }\n return getPullRequestFromPayload(payload);\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const { comment } = context.payload;\n\n if (\n reviewflowPrContext !== null &&\n context.payload.action === 'edited' &&\n checkIfIsThisBot(comment.user)\n ) {\n const updatedPr = await fetchPr(context, pullRequest.number);\n if (!updatedPr.closed_at) {\n await syncLabelsAfterCommentBodyEdited(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n }\n return;\n }\n\n const type = (comment as any).pull_request_review_id\n ? 'review-comment'\n : 'issue-comment';\n\n const criteria = {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type,\n typeId: comment.id,\n };\n\n const sentMessages = await appContext.mongoStores.slackSentMessages.findAll(\n criteria,\n );\n\n if (sentMessages.length === 0) return;\n\n if (context.payload.action === 'deleted') {\n await Promise.all([\n Promise.all(\n sentMessages.map((sentMessage) =>\n Promise.all(\n sentMessage.sentTo.map((sentTo) =>\n repoContext.slack.deleteMessage(sentTo.ts, sentTo.channel),\n ),\n ),\n ),\n ),\n appContext.mongoStores.slackSentMessages.deleteMany(criteria),\n ]);\n } else {\n const secondaryBlocks = [\n createMrkdwnSectionBlock(\n slackifyCommentBody(\n comment.body,\n (comment as any).start_line !== null,\n ),\n ),\n ];\n\n await Promise.all([\n Promise.all(\n sentMessages.map((sentMessage) =>\n Promise.all(\n sentMessage.sentTo.map((sentTo) =>\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...sentMessage.message,\n secondaryBlocks,\n }),\n ),\n ),\n ),\n ),\n appContext.mongoStores.slackSentMessages.partialUpdateMany(\n criteria,\n { $set: { 'message.secondaryBlocks': secondaryBlocks } },\n ),\n ]);\n }\n },\n ),\n );\n}\n","import type { CommitNote } from '@commitlint/parse';\nimport parse from '@commitlint/parse';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport { updateCommentBodyCommitsNotes } from './utils/body/updateBody';\nimport syncLabel from './utils/syncLabel';\n\ninterface BreakingChangesCommits {\n commit: RestEndpointMethodTypes['pulls']['listCommits']['response']['data'][number];\n breakingChangesNotes: CommitNote[];\n}\n\nexport const readCommitsAndUpdateInfos = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n commentBody = reviewflowPrContext.commentBody,\n): Promise => {\n // tmp.data[0].sha\n // tmp.data[0].commit.message\n\n const commits = await context.octokit.paginate(\n context.octokit.pulls.listCommits,\n context.pullRequest({\n // A custom page size up to 100. Default is 30.\n per_page: 100,\n }),\n (res) => res.data,\n );\n\n const conventionalCommits = await Promise.all(\n commits.map((c) => parse(c.commit.message)),\n );\n\n const breakingChangesCommits: BreakingChangesCommits[] = [];\n conventionalCommits.forEach((c, index) => {\n const breakingChangesNotes = c.notes.filter(\n (note) => note.title === 'BREAKING CHANGE',\n );\n if (breakingChangesNotes.length > 0) {\n breakingChangesCommits.push({\n commit: commits[index],\n breakingChangesNotes,\n });\n }\n });\n\n const breakingChangesLabel = repoContext.labels['breaking-changes'];\n const newCommentBody = updateCommentBodyCommitsNotes(\n commentBody,\n breakingChangesCommits.length === 0\n ? ''\n : `Breaking Changes:\\n${breakingChangesCommits\n .map(({ commit, breakingChangesNotes }) =>\n breakingChangesNotes.map(\n (note) => `- ${note.text.replace('\\n', ' ')} (${commit.sha})`,\n ),\n )\n .join('')}`,\n );\n\n await Promise.all([\n syncLabel(\n pullRequest,\n context,\n breakingChangesCommits.length !== 0,\n breakingChangesLabel,\n ),\n updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newCommentBody),\n ]);\n\n // TODO auto update ! in front of : to signal a breaking change when https://github.com/conventional-changelog/commitlint/issues/658 is closed\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\n\ninterface UpdatePr {\n title?: string;\n body?: string;\n}\n\nconst cleanNewLines = (text: string): string => text.replace(/\\r\\n/g, '\\n');\nconst checkIfHasDiff = (text1: string, text2: string): boolean =>\n cleanNewLines(text1) !== cleanNewLines(text2);\n\nexport const updatePrIfNeeded = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n update: UpdatePr,\n): Promise => {\n const hasDiffInTitle = update.title && pullRequest.title !== update.title;\n const hasDiffInBody =\n update.body && checkIfHasDiff(pullRequest.body, update.body);\n\n if (hasDiffInTitle || hasDiffInBody) {\n const diff: Partial> = {};\n if (hasDiffInTitle) {\n diff.title = update.title;\n pullRequest.title = update.title as string;\n }\n if (hasDiffInBody) {\n diff.body = update.body;\n pullRequest.body = update.body as string;\n }\n\n await context.octokit.pulls.update(\n context.repo({\n pull_number: pullRequest.number,\n ...diff,\n }),\n );\n }\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(\n /[\\s-]+\\[?\\s*([A-Za-z][\\dA-Za-z]+)[ -](\\d+)\\s*]?\\s*$/,\n (s, arg1, arg2) => ` ${arg1.toUpperCase()}-${arg2}`,\n )\n .replace(/^([A-Za-z]+)[/:]\\s*/, (s, arg1) => `${arg1.toLowerCase()}: `)\n .replace(/^Revert \"([^\"]+)\"$/, 'revert: $1')\n .replace(/\\s+[[\\]]\\s*no\\s*issue\\s*[[\\]]$/i, ' [no issue]')\n // eslint-disable-next-line unicorn/no-unsafe-regex\n .replace(/^(revert:.*)(\\s+\\(#\\d+\\))$/, '$1');\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { StatusError, StatusInfo } from '../../../accountConfigs/types';\nimport { ExcludesFalsy } from '../../../utils/Excludes';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { readCommitsAndUpdateInfos } from './readCommitsAndUpdateInfos';\nimport { calcDefaultOptions } from './syncLabelsAfterCommentBodyEdited';\nimport { updatePrIfNeeded } from './updatePr';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport {\n updateCommentBodyInfos,\n defaultCommentBody,\n createCommentBody,\n removeDeprecatedReviewflowInPrBody,\n} from './utils/body/updateBody';\nimport { cleanTitle } from './utils/cleanTitle';\nimport createStatus from './utils/createStatus';\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\nexport const editOpenedPR = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext | null,\n shouldUpdateCommentBodyInfos: boolean,\n previousSha?: string,\n): Promise => {\n if (reviewflowPrContext === null) return;\n\n const title = repoContext.config.trimTitle\n ? cleanTitle(pullRequest.title)\n : pullRequest.title;\n\n const isPrFromBot = pullRequest.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(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 = (\n await context.octokit.checks.listForRef(\n context.repo({\n ref: pullRequest.head.sha,\n }),\n )\n ).data.check_runs.find(\n (check): boolean => check.name === `${process.env.REVIEWFLOW_NAME}/lint-pr`,\n );\n\n const promises: Promise[] = [\n ...statuses.map(\n ({ name, error, info }): Promise =>\n createStatus(\n context,\n name,\n pullRequest.head.sha,\n error ? 'failure' : 'success',\n error ? error.title : (info as StatusInfo).title,\n error ? undefined : (info as StatusInfo).url,\n ),\n ),\n ...(previousSha\n ? statuses\n .map(({ name, error, info }): Promise | undefined =>\n error\n ? createStatus(\n context,\n name,\n previousSha,\n 'success',\n 'New commits have been pushed',\n )\n : undefined,\n )\n .filter(ExcludesFalsy)\n : []),\n hasLintPrCheck &&\n context.octokit.checks.create(\n context.repo({\n name: `${process.env.REVIEWFLOW_NAME}/lint-pr`,\n head_sha: pullRequest.head.sha,\n status: 'completed' as const,\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 && previousSha && errorRule\n ? createStatus(\n context,\n 'lint-pr',\n previousSha,\n 'success',\n 'New commits have been pushed',\n )\n : undefined,\n !hasLintPrCheck &&\n createStatus(\n context,\n 'lint-pr',\n pullRequest.head.sha,\n errorRule ? 'failure' : 'success',\n errorRule ? errorRule.error.title : '✓ Your PR is valid',\n ),\n ].filter(ExcludesFalsy);\n\n const body = removeDeprecatedReviewflowInPrBody(pullRequest.body);\n promises.push(updatePrIfNeeded(pullRequest, context, { title, body }));\n\n const commentBodyInfos = statuses\n .filter((status) => status.info?.inBody)\n .map((status) => status.info) as StatusInfo[];\n\n const shouldCreateCommentBody =\n reviewflowPrContext.commentBody === defaultCommentBody;\n\n const newBody = shouldCreateCommentBody\n ? createCommentBody(\n calcDefaultOptions(repoContext, pullRequest),\n commentBodyInfos,\n )\n : updateCommentBodyInfos(reviewflowPrContext.commentBody, commentBodyInfos);\n\n if (shouldCreateCommentBody || shouldUpdateCommentBodyInfos) {\n promises.push(\n readCommitsAndUpdateInfos(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n newBody,\n ),\n );\n } else {\n promises.push(\n updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newBody),\n );\n }\n\n await Promise.all(promises);\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { checkIfIsThisBot } from './utils/isBotUser';\n\nexport default function edited(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.edited',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n if (reviewflowPrContext == null) return;\n\n const sender = context.payload.sender;\n if (checkIfIsThisBot(sender)) {\n return;\n }\n\n const updatedPullRequest = await fetchPr(\n context,\n context.payload.pull_request.number,\n );\n\n await editOpenedPR(\n updatedPullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n false,\n );\n await autoMergeIfPossible(\n updatedPullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\n\nexport const updateBranch = async (\n pullRequest: PullRequestWithDecentData,\n context: Context,\n login: string,\n): Promise => {\n context.log.info('update branch', {\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n });\n\n const result = await context.octokit.repos\n .merge({\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n head: pullRequest.base.ref,\n base: pullRequest.head.ref,\n })\n .catch((err) => ({ error: err } as any));\n\n context.log.info('update branch result', {\n status: result.status,\n sha: result.data?.sha,\n error: result.error,\n });\n\n if (result.status === 204) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch: base already contains the head, nothing to merge.`,\n }),\n );\n } else if (result.status === 409) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch: merge conflict. Please resolve manually.`,\n }),\n );\n } else if (!result || !result.data || !result.data.sha) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch (unknown error)`,\n }),\n );\n } else {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} branch updated: ${result.data.sha}`,\n }),\n );\n }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateBranch } from './actions/updateBranch';\nimport { updatePrCommentBodyOptions } from './actions/updatePrCommentBody';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport hasLabelInPR from './actions/utils/hasLabelInPR';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nconst isFromRenovate = (\n payload: EventPayloads.WebhookPayloadPullRequest,\n): boolean => {\n const sender = payload.sender;\n return (\n sender.type === 'Bot' &&\n sender.login === 'renovate[bot]' &&\n payload.pull_request.head.ref.startsWith('renovate/')\n );\n};\n\nexport default function labelsChanged(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n createPullRequestHandler<\n EventPayloads.WebhookPayloadPullRequest,\n EventPayloads.WebhookPayloadPullRequest['pull_request']\n >(\n appContext,\n (payload, context, repoContext) => {\n if (payload.sender.type === 'Bot' && !isFromRenovate(payload)) {\n return null;\n }\n\n if (repoContext.shouldIgnore) return null;\n\n return payload.pull_request;\n },\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n if (reviewflowPrContext === null) return;\n\n const fromRenovate = isFromRenovate(context.payload);\n const updatedPr = await fetchPr(context, pullRequest.number);\n\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 const autoMergeSkipCiLabel = repoContext.labels['merge/skip-ci'];\n if (context.payload.action === 'labeled') {\n if (codeApprovedLabel && label.id === codeApprovedLabel.id) {\n // const { data: reviews } = await context.octokit.pulls.listReviews(\n // context.pullRequest({ per_page: 1 }),\n // );\n // if (reviews.length !== 0) {\n await context.octokit.pulls.createReview(\n context.pullRequest({ event: 'APPROVE' }),\n );\n\n let labels = updatedPr.labels;\n const autoMergeWithSkipCi =\n autoMergeSkipCiLabel &&\n repoContext.config.autoMergeRenovateWithSkipCi;\n if (autoMergeWithSkipCi) {\n const result = await context.octokit.issues.addLabels(\n context.issue({\n labels: [autoMergeSkipCiLabel.name],\n }),\n );\n labels = result.data;\n }\n await updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n labels,\n );\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n autoMergeWithSkipCi,\n // force label to avoid racing events (when both events are sent in the same time, reviewflow treats them one by one but the second event wont have its body updated)\n autoMerge: hasLabelInPR(labels, autoMergeLabel)\n ? true\n : repoContext.config.prDefaultOptions.autoMerge,\n },\n );\n // }\n } else if (autoMergeLabel && label.id === autoMergeLabel.id) {\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n autoMerge: true,\n // force label to avoid racing events (when both events are sent in the same time, reviewflow treats them one by one but the second event wont have its body updated)\n // Note: si c'est renovate qui ajoute le label autoMerge, le label codeApprovedLabel n'aurait pu etre ajouté que par renovate également (on est a quelques secondes de l'ouverture de la pr par renovate)\n autoMergeWithSkipCi: hasLabelInPR(\n pullRequest.labels,\n codeApprovedLabel,\n )\n ? true\n : repoContext.config.prDefaultOptions.autoMergeWithSkipCi,\n },\n );\n }\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n }\n return;\n }\n\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.octokit.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(updatedPr, context, repoContext);\n\n const updateBranchLabel = repoContext.labels['merge/update-branch'];\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const option = (() => {\n if (featureBranchLabel && label.id === featureBranchLabel.id) {\n return 'featureBranch';\n }\n if (automergeLabel && label.id === automergeLabel.id) {\n return 'autoMerge';\n }\n if (skipCiLabel && label.id === skipCiLabel.id) {\n return 'autoMergeWithSkipCi';\n }\n return null;\n })();\n\n if (option) {\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n [option]: context.payload.action === 'labeled',\n },\n );\n } // not an else if\n if (automergeLabel && label.id === automergeLabel.id) {\n if (context.payload.action === 'labeled') {\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n } else {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'automerge label removed',\n );\n }\n }\n if (updateBranchLabel && label.id === updateBranchLabel.id) {\n if (context.payload.action === 'labeled') {\n await updateBranch(\n updatedPr,\n context,\n context.payload.sender.login,\n );\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n }\n }\n },\n ),\n );\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestFromRestEndpoint } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\nimport hasLabelInPR from './utils/hasLabelInPR';\n\nexport const autoApproveAndAutoMerge = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n): Promise => {\n // const autoMergeLabel = repoContext.labels['merge/automerge'];\n const codeApprovedLabel = repoContext.labels['code/approved'];\n if (hasLabelInPR(pullRequest.labels, codeApprovedLabel)) {\n await context.octokit.pulls.createReview(\n context.pullRequest({ event: 'APPROVE' }),\n );\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n return true;\n }\n\n return false;\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestFromRestEndpoint } from '../utils/PullRequestData';\n\nexport const autoAssignPRToCreator = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: E['pull_request'] | PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n): Promise => {\n if (!repoContext.config.autoAssignToCreator) return;\n if (pullRequest.assignees.length > 0) return;\n if (pullRequest.user.type === 'Bot') return;\n\n await context.octokit.issues.addAssignees(\n context.issue({\n assignees: [pullRequest.user.login],\n }),\n );\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from 'context/AppContext';\nimport { autoApproveAndAutoMerge } from './actions/autoApproveAndAutoMerge';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { defaultCommentBody } from './actions/utils/body/updateBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { createReviewflowComment } from './utils/reviewflowComment';\n\nexport default function opened(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.opened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n const fromRenovate = pullRequest.head.ref.startsWith('renovate/');\n if (reviewflowPrContext === null) return;\n\n await Promise.all([\n autoAssignPRToCreator(pullRequest, context, repoContext),\n editOpenedPR(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n ),\n fromRenovate\n ? fetchPr(context, pullRequest.number).then((updatedPr) =>\n autoApproveAndAutoMerge(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n ).then(\n async (approved: boolean): Promise => {\n if (!approved && repoContext.config.requiresReviewRequest) {\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n 'dev',\n {\n add: ['needsReview'],\n },\n );\n }\n },\n ),\n )\n : updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n add: repoContext.config.requiresReviewRequest\n ? ['needsReview']\n : [],\n remove: ['approved', 'changesRequested'],\n }),\n ]);\n },\n (pullRequest, context, repoContext) => {\n return {\n reviewflowCommentPromise: createReviewflowComment(\n pullRequest.number,\n context,\n defaultCommentBody,\n ),\n };\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function closed(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.reopened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n await Promise.all([\n updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n add: ['needsReview'],\n remove: ['approved'],\n }),\n editOpenedPR(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n ),\n ]);\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nexport default function reviewDismissed(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request_review.dismissed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n const reviewer = (context.payload as any).review.user;\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const updatedPr = await fetchPr(context, pullRequest.number);\n\n const { reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n const hasApprovals = reviewStates[reviewerGroup].approved !== 0;\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n updatedPr.requested_reviewers,\n { includesReviewerGroup: true },\n );\n\n await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n !hasApprovals && 'needsReview',\n hasApprovals &&\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'approved',\n ],\n remove: [\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n !hasChangesRequestedInReviews && 'changesRequested',\n !hasApprovals && 'approved',\n ],\n },\n );\n\n if (updatedPr.assignees) {\n updatedPr.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !updatedPr.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.postMessage(\n 'pr-review',\n assignee.id,\n assignee.login,\n {\n text: `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n } else {\n repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n {\n text: `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n }\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nexport default function reviewRequestRemoved(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request.review_request_removed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n\n const hasApprovedInReviews =\n reviewStates[reviewerGroup].approved !== 0;\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n // if changes requested by the one which requests was removed (should still be in changed requested anyway, but we never know)\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 && 'requested',\n ],\n },\n );\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n\n const sentMessageRequestedReview = await appContext.mongoStores.slackSentMessages.findOne(\n {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n },\n );\n\n if (sentMessageRequestedReview) {\n const sentTo = sentMessageRequestedReview.sentTo[0];\n const message = sentMessageRequestedReview.message;\n await Promise.all([\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...message,\n text: message.text\n .split('\\n')\n .map((l) => `~${l}~`)\n .join('\\n'),\n }),\n repoContext.slack.addReaction(\n sentTo.ts,\n sentTo.channel,\n 'skull_and_crossbones',\n ),\n appContext.mongoStores.slackSentMessages.deleteOne(\n sentMessageRequestedReview,\n ),\n ]);\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function reviewRequested(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request.review_requested',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n const shouldWait = false;\n // repoContext.approveShouldWait(reviewerGroup, pr.requested_reviewers, { includesWaitForGroups: true });\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n reviewerGroup,\n {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved'],\n },\n );\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n const text = `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )} !\\n> ${pullRequest.title}`;\n const message = { text };\n const result = await repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n message,\n );\n if (result) {\n await appContext.mongoStores.slackSentMessages.insertOne({\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n message,\n account: repoContext.accountEmbed,\n sentTo: [result],\n });\n }\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport slackifyMarkdown from 'slackify-markdown';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createSlackMessageWithSecondaryBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nconst getEmojiFromState = (state: string): string => {\n switch (state) {\n case 'changes_requested':\n return 'x';\n case 'approved':\n return 'white_check_mark';\n default:\n return 'speech_balloon';\n }\n};\n\nexport default function reviewSubmitted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request_review.submitted',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const { payload } = context;\n\n const {\n user: reviewer,\n state,\n body,\n html_url: reviewUrl,\n } = payload.review;\n\n const reviewByOwner = pullRequest.user.login === reviewer.login;\n const { reviewers, reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const followers = reviewers.filter(\n (user) => user.id !== reviewer.id && user.id !== pullRequest.user.id,\n );\n\n if (pullRequest.requested_reviewers) {\n followers.push(\n ...pullRequest.requested_reviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== reviewer.id &&\n rr.id !== pullRequest.user.id\n );\n }),\n );\n }\n\n if (!reviewByOwner) {\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged: boolean;\n\n if (\n reviewflowPrContext &&\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest.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\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const updatedPr = await fetchPr(context, pullRequest.number);\n\n const newLabels = await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'needsReview',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup && '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 updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n newLabels,\n );\n }\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n\n const sentMessageRequestedReview = await appContext.mongoStores.slackSentMessages.findOne(\n {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n },\n );\n\n const emoji = getEmojiFromState(state);\n\n if (sentMessageRequestedReview) {\n const sentTo = sentMessageRequestedReview.sentTo[0];\n const message = sentMessageRequestedReview.message;\n await Promise.all([\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...message,\n text: message.text\n .split('\\n')\n .map((l) => `~${l}~`)\n .join('\\n'),\n }),\n repoContext.slack.addReaction(sentTo.ts, sentTo.channel, emoji),\n appContext.mongoStores.slackSentMessages.deleteOne(\n sentMessageRequestedReview,\n ),\n ]);\n }\n\n if (!body && state !== 'changes_requested' && state !== 'approved') {\n return;\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = slackUtils.createPrLink(pullRequest, repoContext);\n const ownerMention = repoContext.slack.mention(\n pullRequest.user.login,\n );\n\n const createMessage = (toOwner?: boolean): string => {\n const ownerPart = toOwner ? 'your PR' : `${ownerMention}'s PR`;\n\n if (state === 'changes_requested') {\n return `:${emoji}: ${mention} requests changes on ${ownerPart} ${prUrl}`;\n }\n if (state === 'approved') {\n return `${\n toOwner ? ':clap: ' : ''\n }:${emoji}: ${mention} approves ${ownerPart} ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n\n const commentLink = slackUtils.createLink(reviewUrl, 'commented');\n return `:${emoji}: ${mention} ${commentLink} on ${ownerPart} ${prUrl}`;\n };\n\n const slackifiedBody = slackifyMarkdown((body as unknown) as string);\n\n repoContext.slack.postMessage(\n 'pr-review',\n pullRequest.user.id,\n pullRequest.user.login,\n createSlackMessageWithSecondaryBlock(\n createMessage(true),\n slackifiedBody,\n ),\n );\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n followers.forEach((follower) => {\n repoContext.slack.postMessage(\n 'pr-review-follow',\n follower.id,\n follower.login,\n message,\n );\n });\n } else if (body) {\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = slackUtils.createPrLink(pullRequest, repoContext);\n const commentLink = slackUtils.createLink(reviewUrl, 'commented');\n\n const message = createSlackMessageWithSecondaryBlock(\n `:speech_balloon: ${mention} ${commentLink} on his PR ${prUrl}`,\n body,\n );\n\n followers.forEach((follower) => {\n repoContext.slack.postMessage(\n 'pr-review-follow',\n follower.id,\n follower.login,\n message,\n );\n });\n }\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport type { LockedMergePr } from '../../context/repoContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\n\nconst isSameBranch = (\n payload: Context['payload'],\n lockedPr: LockedMergePr,\n): boolean => {\n if (!lockedPr) return false;\n return !!payload.branches.find((b) => b.name === lockedPr.branch);\n};\n\nexport default function status(app: Probot, appContext: AppContext): void {\n app.on(\n 'status',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext): LockedMergePr[] => {\n if (repoContext.shouldIgnore) return [];\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (!lockedPr) return [];\n\n if (payload.state !== 'loading' && isSameBranch(payload, lockedPr)) {\n return [lockedPr];\n }\n\n return [];\n },\n (pr, context, repoContext): void => {\n const lockedPr = repoContext.getMergeLockedPr();\n // check if changed\n if (isSameBranch(context.payload, lockedPr)) {\n repoContext.reschedule(context, lockedPr);\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function synchronize(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.synchronize',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n if (!reviewflowPrContext) return;\n\n const updatedPr = await fetchPr(context, pullRequest.number);\n // old and new sha\n // const { before, after } = context.payload;\n const previousSha = (context.payload as any).before as string;\n\n await Promise.all([\n editOpenedPR(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n previousSha,\n ),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n updatedPr.labels,\n previousSha,\n ),\n ]);\n\n // call autoMergeIfPossible to re-add to the queue when push is fixed\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { obtainRepoContext } from '../../context/repoContext';\nimport { getEmojiFromRepoDescription } from '../../context/utils';\nimport { createHandlerOrgChange } from '../account-handlers/utils/handler';\n\nexport default function repoEdited(app: Probot, appContext: AppContext): void {\n app.on(\n 'repository.edited',\n createHandlerOrgChange(\n appContext,\n async (context, orgContext): Promise => {\n const repoContext = await obtainRepoContext(appContext, context);\n if (!repoContext) return;\n const repo = context.payload.repository;\n repoContext.repoFullName = repo.full_name;\n repoContext.repoEmoji = getEmojiFromRepoDescription(repo.description);\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\n// import commands from 'probot-commands';\nimport type { AppContext } from './context/AppContext';\nimport { syncOrg } from './events/account-handlers/actions/syncOrg';\nimport { syncTeams } from './events/account-handlers/actions/syncTeams';\nimport { createHandlerOrgChange } from './events/account-handlers/utils/handler';\nimport checkrunCompleted from './events/pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './events/pr-handlers/checksuiteCompleted';\nimport closedHandler from './events/pr-handlers/closed';\nimport commentCreated from './events/pr-handlers/commentCreated';\nimport commentEditedOrDeleted from './events/pr-handlers/commentEditedOrDeleted';\nimport editedHandler from './events/pr-handlers/edited';\nimport labelsChanged from './events/pr-handlers/labelsChanged';\nimport openedHandler from './events/pr-handlers/opened';\nimport reopenedHandler from './events/pr-handlers/reopened';\nimport reviewDismissedHandler from './events/pr-handlers/reviewDismissed';\nimport reviewRequestRemovedHandler from './events/pr-handlers/reviewRequestRemoved';\nimport reviewRequestedHandler from './events/pr-handlers/reviewRequested';\nimport reviewSubmittedHandler from './events/pr-handlers/reviewSubmitted';\nimport status from './events/pr-handlers/status';\nimport synchronizeHandler from './events/pr-handlers/synchronize';\nimport repoEdited from './events/repository-handlers/repoEdited';\n\nexport default function initApp(app: Probot, appContext: AppContext): void {\n /* https://developer.github.com/webhooks/event-payloads/#organization */\n app.on(\n ['organization.member_added', 'organization.member_removed'],\n createHandlerOrgChange(\n appContext,\n async (context, accountContext) => {\n await syncOrg(\n appContext.mongoStores,\n context.octokit,\n accountContext.account.installationId as number,\n context.payload.organization,\n );\n },\n ),\n );\n\n /* https://developer.github.com/webhooks/event-payloads/#team */\n app.on(\n ['team.created', 'team.deleted', 'team.edited'],\n createHandlerOrgChange(\n appContext,\n async (context, accountContext) => {\n await syncTeams(\n appContext.mongoStores,\n context.octokit,\n context.payload.organization,\n );\n },\n ),\n );\n\n // /* https://developer.github.com/webhooks/event-payloads/#membership */\n // app.on(\n // ['membership.added', 'membership.removed'],\n // createHandlerOrgChange(\n // mongoStores,\n // async (context, accountContext) => {\n // await syncTeamMembers(\n // mongoStores,\n // context.octokit,\n // context.payload.organization,\n // context.payload.team,\n // );\n // },\n // ),\n // );\n\n // Repo\n /* https://developer.github.com/webhooks/event-payloads/#repository */\n repoEdited(app, appContext);\n\n // PR\n /* https://developer.github.com/webhooks/event-payloads/#pull_request */\n openedHandler(app, appContext);\n editedHandler(app, appContext);\n closedHandler(app, appContext);\n reopenedHandler(app, appContext);\n\n reviewRequestedHandler(app, appContext);\n reviewRequestRemovedHandler(app, appContext);\n reviewSubmittedHandler(app, appContext);\n reviewDismissedHandler(app, appContext);\n labelsChanged(app, appContext);\n synchronizeHandler(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#pull_request_review_comment */\n /* https://developer.github.com/webhooks/event-payloads/#issue_comment */\n commentCreated(app, appContext);\n commentEditedOrDeleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#check_run */\n checkrunCompleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#check_suite */\n checksuiteCompleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#status */\n status(app, appContext);\n\n /* commands */\n // commands(app, 'update-branch', () => {});\n}\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { MongoBaseModel } from 'liwi-mongo';\nimport { MongoStore, MongoConnection } from 'liwi-mongo';\nimport type { SlackMessage } from './context/SlackMessage';\nimport type { MessageCategory } from './dm/MessageCategory';\n\n// export interface PrEventsModel extends MongoModel {\n// owner: string;\n// repo: string;\n// prId: string;\n// prNumber: string;\n// event: string;\n// }\n\nexport type AccountType = 'Organization' | 'User';\n\nexport interface AccountEmbed {\n id: number;\n login: string;\n type: AccountType;\n}\n\ninterface RepoEmbed {\n id: number;\n name: string;\n}\n\ninterface PrEmbed {\n number: number;\n}\n\ntype AccountEmbedWithoutType = Omit;\n\nexport interface UserDmSettings extends MongoBaseModel {\n userId: number;\n orgId: number;\n settings: Record;\n}\n\n// TODO _id is number\ninterface BaseAccount extends MongoBaseModel {\n login: string;\n installationId?: number;\n}\n\nexport interface User extends BaseAccount {\n type: string;\n}\n\nexport interface Org extends BaseAccount {\n slackToken?: string;\n}\n\nexport interface OrgMember extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n user: AccountEmbedWithoutType;\n slack?: { id: string };\n}\n\nexport interface OrgTeam extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n name: string;\n slug: string;\n description: string;\n}\n\nexport type SlackMessageType =\n | 'review-comment'\n | 'issue-comment'\n | 'review-submitted'\n | 'review-requested';\n\nexport interface SlackSentMessage extends MongoBaseModel {\n type: SlackMessageType;\n typeId: number | string;\n account: AccountEmbed;\n message: SlackMessage;\n sentTo: {\n channel: string;\n ts: string;\n }[];\n}\n\nexport interface AutomergeLog extends MongoBaseModel {\n account: AccountEmbed;\n repoFullName: string;\n pr: {\n id: number;\n number: number;\n isRenovate: boolean;\n mergeableState: string;\n };\n type:\n | 'rebase-renovate'\n | 'unknown mergeable_state'\n | 'blocked mergeable_state'\n | 'behind mergeable_state'\n | 'not mergeable'\n | 'failed status or checks'\n | 'already merged';\n action: 'remove' | 'reschedule' | 'wait' | 'update branch';\n}\n\nexport interface ReviewflowPr extends MongoBaseModel {\n account: AccountEmbed;\n repo: RepoEmbed;\n pr: PrEmbed;\n commentId: number;\n}\n\nexport interface MongoStores {\n connection: MongoConnection;\n userDmSettings: MongoStore;\n users: MongoStore;\n orgs: MongoStore;\n orgMembers: MongoStore;\n orgTeams: MongoStore;\n slackSentMessages: MongoStore;\n automergeLogs: MongoStore;\n prs: MongoStore;\n // prEvents: MongoStore;\n}\n\nif (!process.env.MONGO_DB) {\n throw new Error('MONGO_DB is missing in process.env');\n}\n\nexport default function init(): MongoStores {\n const config = new Map([\n ['host', process.env.MONGO_HOST || 'localhost'],\n ['port', process.env.MONGO_PORT || '27017'],\n ['database', process.env.MONGO_DB as string],\n ]);\n if (process.env.MONGO_USER) {\n config.set('user', process.env.MONGO_USER);\n config.set('password', process.env.MONGO_PASSWORD as string);\n }\n const connection = new MongoConnection(config);\n\n // const prEvents = new MongoStore(connection, 'prEvents');\n // prEvents.collection.then((coll) => {\n // coll.createIndex({ owner: 1, repo: 1, ???: 1 });\n // });\n\n const userDmSettings = new MongoStore(\n connection,\n 'userDmSettings',\n );\n userDmSettings.collection.then((coll) => {\n coll.createIndex({ userId: 1, orgId: 1 }, { unique: true });\n });\n\n const users = new MongoStore(connection, 'users');\n users.collection.then((coll) => {\n coll.createIndex({ login: 1 }, { unique: true });\n });\n\n const orgs = new MongoStore(connection, 'orgs');\n orgs.collection.then((coll) => {\n coll.createIndex({ login: 1 }, { unique: true });\n });\n\n const orgMembers = new MongoStore(connection, 'orgMembers');\n orgMembers.collection.then((coll) => {\n coll.createIndex({ 'user.id': 1, 'org.id': 1 }, { unique: true });\n });\n\n const orgTeams = new MongoStore(connection, 'orgTeams');\n orgTeams.collection.then((coll) => {\n coll.createIndex({ 'org.id': 1 });\n });\n\n const slackSentMessages = new MongoStore(\n connection,\n 'slackSentMessages',\n );\n slackSentMessages.collection.then((coll) => {\n coll.createIndex({\n 'account.id': 1,\n 'account.type': 1,\n type: 1,\n typeId: 1,\n });\n // remove older than 14 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 14 * 24 * 60 * 60 * 1000) },\n });\n });\n\n const automergeLogs = new MongoStore(\n connection,\n 'automergeLogs',\n );\n automergeLogs.collection.then((coll) => {\n coll.createIndex({\n repoFullName: 1,\n type: 1,\n });\n coll.createIndex({\n repoFullName: 1,\n 'pr.number': 1,\n });\n // remove older than 30 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) },\n });\n });\n\n const prs = new MongoStore(connection, 'prs');\n prs.collection.then((coll) => {\n coll.createIndex(\n {\n 'account.id': 1,\n 'repo.id': 1,\n 'pr.number': 1,\n },\n { unique: true },\n );\n // remove older than 12 * 30 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 12 * 30 * 24 * 60 * 60 * 1000) },\n });\n });\n\n // return { connection, prEvents };\n return {\n connection,\n userDmSettings,\n users,\n orgs,\n orgMembers,\n orgTeams,\n slackSentMessages,\n automergeLogs,\n prs,\n };\n}\n","import type { Octokit } from '@octokit/core';\nimport { WebClient } from '@slack/web-api';\nimport type { MongoStores, Org, OrgMember } from '../mongo';\nimport { createLink } from './utils';\n\ninterface QueueItem {\n github: Octokit;\n slackClient: WebClient;\n member: OrgMember;\n}\n\nexport const createSlackHomeWorker = (mongoStores: MongoStores) => {\n const updateMember = async (\n github: Octokit,\n slackClient: WebClient,\n member: OrgMember,\n ): Promise => {\n if (!member.slack?.id) return;\n // console.log('update member', member.org.login, member.user.login);\n\n /* search limit: 30 requests per minute = 7 update/min max */\n const [\n prsWithRequestedReviews,\n prsToMerge,\n prsWithRequestedChanges,\n prsInDraft,\n ] = await Promise.all([\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open review-requested:${member.user.login} `,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} label:\":ok_hand: code/approved\"`,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} label:\":ok_hand: code/changes-requested\"`,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} draft:true`,\n sort: 'created',\n order: 'desc',\n per_page: 5,\n }),\n ]);\n\n const blocks: any[] = [];\n\n const buildBlocks = (title: string, results: any) => {\n if (!results.total_count) return;\n\n blocks.push(\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*${title}*`,\n },\n },\n {\n type: 'divider',\n },\n ...results.items\n .map((pr: any) => {\n const repoName = pr.repository_url.slice(\n 'https://api.github.com/repos/'.length,\n );\n const prFullName = `${repoName}#${pr.number}`;\n\n return [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*${createLink(pr.html_url, pr.title)}*`,\n // ${pr.labels.map((l) => `{${l.name}}`).join(' · ')}\n },\n },\n {\n type: 'context',\n elements: [\n {\n type: 'mrkdwn',\n text: `${createLink(pr.html_url, prFullName)} ${\n pr.draft ? '· _Draft_' : ''\n }`,\n },\n {\n type: 'image',\n image_url: pr.user.avatar_url,\n alt_text: pr.user.login,\n },\n {\n type: 'mrkdwn',\n text: `${pr.user.login}`,\n },\n ],\n },\n ];\n })\n .flat(),\n {\n type: 'context',\n elements: [\n {\n type: 'image',\n image_url:\n 'https://api.slack.com/img/blocks/bkb_template_images/placeholder.png',\n alt_text: 'placeholder',\n },\n ],\n },\n );\n };\n\n buildBlocks(':eyes: Requested Reviews', prsWithRequestedReviews.data);\n buildBlocks(':white_check_mark: Ready to Merge', prsToMerge.data);\n buildBlocks(':x: Changes Requested', prsWithRequestedChanges.data);\n buildBlocks(':construction: Drafts', prsInDraft.data);\n\n if (blocks.length === 0) {\n blocks.push({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: \":tada: It looks like you don't have any PR to review!\",\n },\n });\n }\n\n slackClient.views.publish({\n user_id: member.slack.id,\n view: {\n type: 'home',\n blocks,\n },\n });\n };\n\n let workerInterval: ReturnType | undefined;\n const queueKeys = new Set();\n const queue: QueueItem[] = [];\n\n const stop = (): void => {\n if (workerInterval !== undefined) {\n clearInterval(workerInterval);\n workerInterval = undefined;\n }\n };\n\n const start = (): void => {\n if (workerInterval !== undefined) return;\n workerInterval = setInterval(() => {\n const item = queue.shift();\n if (!item) {\n stop();\n return;\n }\n\n const { github, slackClient, member } = item;\n const memberId = member.slack?.id;\n\n const key = `${member.org.id}_${memberId}`;\n queueKeys.delete(key);\n\n updateMember(github, slackClient, member);\n }, 9000); // 7/min 60s 1min = 1 ttes les 8.5s max\n };\n\n const scheduleUpdateMember = (\n github: Octokit,\n slackClient: WebClient,\n member: OrgMember,\n ): void => {\n const memberId = member.slack?.id;\n if (!memberId) return;\n\n const key = `${member.org.id}_${memberId}`;\n\n if (!queueKeys.has(key)) {\n queueKeys.add(key);\n queue.push({\n github,\n slackClient,\n member,\n });\n start();\n }\n };\n\n const scheduleUpdateOrg = async (\n github: Octokit,\n org: Org,\n slackClient = new WebClient(org.slackToken),\n ): Promise => {\n const cursor = await mongoStores.orgMembers.cursor();\n cursor.forEach((member) => {\n scheduleUpdateMember(github, slackClient, member);\n });\n };\n\n const scheduleUpdateAllOrgs = async (\n auth: (installationId: number) => Promise,\n ): Promise => {\n const cursor = await mongoStores.orgs.cursor();\n cursor.forEach(async (org) => {\n if (!org.slackToken || !org.installationId) return;\n const github = await auth(org.installationId);\n await scheduleUpdateOrg(github, org);\n });\n };\n\n return {\n scheduleUpdateMember,\n scheduleUpdateOrg,\n scheduleUpdateAllOrgs,\n };\n};\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport 'dotenv/config';\nimport { run } from 'probot';\nimport appRouter from './appRouter';\nimport type { AppContext } from './context/AppContext';\nimport initApp from './initApp';\nimport mongoInit from './mongo';\nimport { createSlackHomeWorker } from './slack/home';\n\nif (!process.env.REVIEWFLOW_NAME) process.env.REVIEWFLOW_NAME = 'reviewflow';\nconsole.log({ name: process.env.REVIEWFLOW_NAME });\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\nrun(({ app, getRouter }) => {\n const mongoStores = mongoInit();\n const slackHome = createSlackHomeWorker(mongoStores);\n const appContext: AppContext = { mongoStores, slackHome };\n appRouter(app, getRouter, appContext);\n initApp(app, appContext);\n slackHome.scheduleUpdateAllOrgs((id: number) => app.auth(id));\n});\n"],"names":["process","env","GITHUB_CLIENT_ID","Error","GITHUB_CLIENT_SECRET","oauth2","create","client","id","secret","auth","tokenHost","tokenPath","authorizePath","Layout","lang","title","REVIEWFLOW_NAME","children","React","padding","AUTH_SECRET_KEY","signPromisified","promisify","sign","verifyPromisified","verify","secure","SECURE_COOKIE","createRedirectUri","req","host","hostname","PORT","readAuthCookie","strategy","cookie","cookies","algorithm","audience","headers","getAuthInfoFromCookie","res","authInfo","clearCookie","undefined","createApi","accessToken","Octokit","getUser","redirect","api","router","get","redirectUri","githubAuth","authorizationCode","authorizeURL","redirect_uri","scope","query","error","send","error_description","code","result","getToken","renderToStaticMarkup","access_token","user","users","getAuthenticated","data","login","time","Date","now","token","expiresIn","httpOnly","home","orgs","listForAuthenticatedUser","display","flexGrow","map","org","config","autoAssignToCreator","trimTitle","requiresReviewRequest","prDefaultOptions","featureBranch","autoMergeWithSkipCi","autoMerge","deleteAfterMerge","parsePR","regExp","summary","groups","dev","christophehurpeau","tilap","waitForGroups","teams","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","ignoreRepoPattern","autoMergeRenovateWithSkipCi","bot","status","statusInfoFromMatch","match","issue","inBody","url","botUsers","JulienBreux","ORNIKAR_EMAIL_DOMAIN","TheR3aLp3nGuinJM","abarreir","damienorny","darame07","Pixy","machartier","HugoGarrido","CorentinAndre","Mxime","vlbr","mdcarter","ChibiBlasphem","PSniezak","design","jperriere","CoralineColasse","Lenamari","loicleser","ops","logins","backends","frontends","description","duplicate","documentation","rfc","bug","enhancement","question","wontfix","chrisconfig","accountConfigs","ornikar","reviewflow","defaultDmSettings","cache","Map","getDefaultDmSettings","accountConfig","defaultConfig","updateCache","userId","newSettings","orgCache","set","getUserDmSettings","mongoStores","orgId","orgDefaultDmSettings","userDmSettingsConfig","userDmSettings","findOne","settings","syncOrg","github","installationId","orgInStore","upsertOne","_id","orgEmbed","memberIds","Promise","all","paginate","listMembers","endpoint","merge","member","push","orgMembers","type","deleteMany","$not","$in","syncTeams","teamIds","team","orgTeams","slug","dmMessages","orgSettings","octokitApp","find","o","params","findByKey","installation","apps","getOrgInstallation","catch","err","width","Object","entries","key","__html","patch","bodyParser","json","body","collection","updateOne","$set","value","updated","$setOnInsert","created","upsert","repository","repos","per_page","repo","owner","length","permissions","admin","data2","getRepoInstallation","syncUser","userInfo","userSettings","u","getUserInstallation","username","appRouter","app","getRouter","use","cookieParser","ExcludesFalsy","Boolean","ExcludesNullish","getOrCreateAccount","accountInfo","getKeys","keys","emojiRegex","createEmojiRegex","getEmojiFromRepoDescription","startsWith","emoji","exec","voidTeamSlack","mention","postMessage","resolve","updateMessage","deleteMessage","addReaction","updateHome","initTeamSlack","slackHome","context","account","payload","slackToken","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackEmails","values","slackClient","WebClient","membersInDb","findAll","members","foundEmailMembers","forEach","email","m","slack","im","missingEmails","filter","includes","memberEmailToMemberId","page","profile","has","partialUpdateMany","conversations","open","channel","console","membersMap","getUserFromGithubLogin","githubLogin","category","githubId","message","log","debug","DRY_RUN","chat","text","blocks","attachments","secondaryBlocks","thread_ts","ts","ok","update","delete","reactions","add","timestamp","scheduleUpdateMember","octokit","initAccountContext","appContext","slackPromise","githubLoginToGroup","githubLoginToTeams","teamName","getReviewerGroups","githubLogins","Set","lock","Lock","accountEmbed","accountType","callback","reject","logInfos","info","createReleaseCallback","release","getReviewerGroup","getTeamsForLogin","approveShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","some","group","accountContextsPromise","accountContexts","obtainAccountContext","existingAccountContext","existingPromise","promise","then","accountContext","handlerOrgChange","organization","createHandlerOrgChange","options","optionsRegexps","option","regexp","RegExp","optionsLabels","label","parseOptions","content","defaultOptions","parseCommitNotes","commitNotes","replace","trim","parseBody","hasLabelInPR","prLabels","l","hasFailedStatusOrChecks","pr","checks","listForRef","ref","head","sha","failedChecks","check_runs","check","conclusion","combinedStatus","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","pullRequest","repoContext","reviewflowPrContext","autoMergeLabel","removePrFromAutomergeQueue","number","isRenovatePr","createMergeLockPrFromPr","branch","addLog","action","repoFullName","full_name","automergeLogs","insertOne","isRenovate","mergeableState","mergeable_state","hasNeedsReview","hasRequestedReview","requested_reviewers","lockedPr","getMergeLockedPr","String","prId","prNumber","pushAutomergeQueue","addMergeLockPr","mergeable","prResult","pulls","pull_number","merged","reschedule","renovateRebaseBody","issues","issue_number","base","parsedBody","commentBody","mergeResult","merge_method","commit_title","commit_message","defaultCommentBody","toMarkdownOptions","join","toMarkdownInfos","infos","getReplacement","updateOptions","optionsToUpdate","internalUpdateBodyOptionsAndInfos","infosAndCommitNotesParagraph","createCommentBody","updateCommentOptions","updatedOptions","updateCommentBodyInfos","updateCommentBodyCommitsNotes","removeDeprecatedReviewflowInPrBody","prBody","createReviewflowComment","pullRequestNumber","createComment","getReviewflowCommentById","commentId","getComment","comment_id","getReviewflowPrContext","reviewflowCommentPromise","prEmbed","comment","reviewflowPr","prs","repoEmbed","existing","partialUpdateByKey","fetchPr","getLabelsForRepo","listLabelsForRepo","initRepoLabels","finalLabels","labelKey","labelConfig","labelColor","slice","existingLabel","createLabel","current_name","updateLabel","shouldIgnoreRepo","repoName","ignoreRepoRegexp","test","createGetReviewLabelIds","shouldIgnore","reviewGroupNames","initRepoContext","fullName","repoEmoji","getReviewLabelIds","needsReviewLabelIds","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","protectedLabelIds","labelIdToGroupName","reviewGroupLabels","lockMergePr","automergeQueue","lockPR","prOrPrIssueId","setTimeout","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","reason","shift","previousLength","p","lockPullRequest","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","warn","createRepoHandler","createPullRequestHandler","getPullRequestInPayload","callbackPr","callbackBeforeLock","createPullRequestsHandler","getPrs","checkrunCompleted","on","check_run","pull_requests","updatedPr","checksuiteCompleted","check_suite","createStatus","createCommitStatus","target_url","addStatusCheck","previousSha","hasPrCheck","head_sha","started_at","created_at","completed_at","toISOString","output","updateStatusCheckFromLabels","createFailedStatusCheck","rr","needsReviewGroupNames","updateReviewStatus","reviewGroup","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toAddNames","toDelete","toDeleteNames","getLabelFromKey","reviewConfig","prLabel","size","addLabels","toDeleteName","removeLabel","newLabelNamesArray","oldLabels","setLabels","closed","pull_request","isNotFork","git","deleteRef","assignees","assignee","createLink","createPrLink","html_url","createMrkdwnSectionBlock","createSlackMessageWithSecondaryBlock","secondaryBlockText","getPullRequestFromPayload","getReviewersAndReviewStates","userIds","reviewers","reviewStatesByUser","listReviews","reviews","toUpperCase","reviewStates","dismissed","reviewer","checkIfUserIsBot","checkIfIsThisBot","parse","issueParser","actions","issuePrefixes","parseMentions","mentions","slackifyCommentBody","multipleLines","slackifyMarkdown","getDiscussion","in_reply_to_id","listComments","c","getMentions","discussion","getUsersInThread","prCommentCreated","saveInDb","results","filtered","slackSentMessages","typeId","sentTo","pull_request_review_id","commentByOwner","followers","f","usersInThread","prUrl","slackUtils","ownerMention","commentLink","createMessage","toOwner","ownerPart","promisesOwner","promisesNotOwner","slackifiedBody","start_line","isBotUser","slackMessage","follower","updatePrCommentBody","newBody","updateComment","updatePrCommentBodyIfNeeded","updatePrCommentBodyOptions","syncLabel","shouldHaveLabel","prHasLabel","onRemove","onAdd","response","calcDefaultOptions","featureBranchLabel","automergeLabel","skipCiLabel","prHasFeatureBranchLabel","prHasSkipCiLabel","prHasAutoMergeLabel","syncLabelsAfterCommentBodyEdited","prCommentEditedOrDeleted","sender","closed_at","criteria","sentMessages","sentMessage","readCommitsAndUpdateInfos","commits","listCommits","conventionalCommits","commit","breakingChangesCommits","index","breakingChangesNotes","notes","note","breakingChangesLabel","newCommentBody","cleanNewLines","checkIfHasDiff","text1","text2","updatePrIfNeeded","hasDiffInTitle","hasDiffInBody","diff","cleanTitle","s","arg1","arg2","toLowerCase","editOpenedPR","shouldUpdateCommentBodyInfos","isPrFromBot","errorRule","rule","date","hasLintPrCheck","promises","commentBodyInfos","shouldCreateCommentBody","edited","updatedPullRequest","updateBranch","isFromRenovate","labelsChanged","fromRenovate","codeApprovedLabel","autoMergeSkipCiLabel","createReview","event","updateBranchLabel","autoApproveAndAutoMerge","autoAssignPRToCreator","addAssignees","opened","reviewDismissed","hasChangesRequestedInReviews","hasApprovals","hasRequestedReviewsForGroup","reviewRequestRemoved","requested_reviewer","hasApprovedInReviews","sentMessageRequestedReview","split","deleteOne","reviewRequested","getEmojiFromState","reviewSubmitted","reviewUrl","reviewByOwner","newLabels","isSameBranch","branches","b","synchronize","before","repoEdited","initApp","openedHandler","editedHandler","closedHandler","reopenedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","synchronizeHandler","commentCreated","commentEditedOrDeleted","MONGO_DB","init","MONGO_HOST","MONGO_PORT","MONGO_USER","MONGO_PASSWORD","connection","MongoConnection","MongoStore","coll","createIndex","unique","$lt","createSlackHomeWorker","updateMember","prsWithRequestedReviews","prsToMerge","prsWithRequestedChanges","prsInDraft","search","issuesAndPullRequests","q","sort","order","buildBlocks","total_count","items","repository_url","prFullName","elements","draft","image_url","avatar_url","alt_text","flat","views","publish","user_id","view","workerInterval","queueKeys","queue","stop","clearInterval","start","setInterval","item","memberId","scheduleUpdateOrg","cursor","scheduleUpdateAllOrgs","run","mongoInit"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAI,CAACA,OAAO,CAACC,GAAR,CAAYC,gBAAjB,EAAmC;AACjC,QAAM,IAAIC,KAAJ,CAAU,wCAAV,CAAN;AACD;;AAED,IAAI,CAACH,OAAO,CAACC,GAAR,CAAYG,oBAAjB,EAAuC;AACrC,QAAM,IAAID,KAAJ,CAAU,4CAAV,CAAN;AACD;;AAEM,MAAME,MAAM,GAAGC,mBAAM,CAAC;AAC3BC,EAAAA,MAAM,EAAE;AACNC,IAAAA,EAAE,EAAER,OAAO,CAACC,GAAR,CAAYC,gBADV;AAENO,IAAAA,MAAM,EAAET,OAAO,CAACC,GAAR,CAAYG;AAFd,GADmB;AAK3BM,EAAAA,IAAI,EAAE;AACJC,IAAAA,SAAS,EAAE,oBADP;AAEJC,IAAAA,SAAS,EAAE,2BAFP;AAGJC,IAAAA,aAAa,EAAE;AAHX;AALqB,CAAD,CAArB;;ACDQ,SAASC,MAAT,CAAgB;AAC7BC,EAAAA,IAAI,GAAG,IADsB;AAE7BC,EAAAA,KAAK,GAAGhB,OAAO,CAACC,GAAR,CAAYgB,eAFS;AAG7BC,EAAAA;AAH6B,CAAhB,EAIe;AAC5B,sBACEC;AAAM,IAAA,IAAI,EAAEJ;AAAZ,kBACEI,wDACEA;AAAM,IAAA,OAAO,EAAC;AAAd,IADF,eAEEA;AAAM,IAAA,IAAI,EAAC,QAAX;AAAoB,IAAA,OAAO,EAAC;AAA5B,IAFF,eAGEA,4CAAQH,KAAR,CAHF,eAIEG;AACE,IAAA,GAAG,EAAC,YADN;AAEE,IAAA,IAAI,EAAC,UAFP;AAGE,IAAA,IAAI,EAAC;AAHP,IAJF,eASEA,4CAAS;AACjB,yFADQ,CATF,CADF,eAaEA,wDACEA;AAAK,IAAA,KAAK,EAAE;AAAEC,MAAAA,OAAO,EAAE;AAAX;AAAZ,KAAuCF,QAAvC,CADF,CAbF,CADF;AAmBD;;ACxBD,IAAI,CAAClB,OAAO,CAACC,GAAR,CAAYoB,eAAjB,EAAkC;AAChC,QAAM,IAAIlB,KAAJ,CAAU,uCAAV,CAAN;AACD;;AAED,MAAMkB,eAAuB,GAAGrB,OAAO,CAACC,GAAR,CAAYoB,eAA5C;AAEA,MAAMC,eAAoB,GAAGC,cAAS,CAACC,iBAAD,CAAtC;AACA,MAAMC,iBAAsB,GAAGF,cAAS,CAACG,mBAAD,CAAxC;AAEA,MAAMC,MAAM,GACV,CAAC,CAAC3B,OAAO,CAACC,GAAR,CAAY2B,aAAd,IAA+B5B,OAAO,CAACC,GAAR,CAAY2B,aAAZ,KAA8B,OAD/D;;AAGA,MAAMC,iBAAiB,GAAIC,GAAD,IAA0B;AAClD,QAAMC,IAAI,GAAI,OAAMJ,MAAM,GAAG,GAAH,GAAS,EAAG,MAAKG,GAAG,CAACE,QAAS,GACtDF,GAAG,CAACE,QAAJ,KAAiB,WAAjB,GAAgC,IAAGhC,OAAO,CAACC,GAAR,CAAYgC,IAAK,EAApD,GAAwD,EACzD,EAFD;AAGA,SAAQ,GAAEF,IAAK,qBAAf;AACD,CALD;;AAcA,MAAMG,cAAc,GAAG,CACrBJ,GADqB,EAErBK,QAFqB,KAGyB;AAC9C,QAAMC,MAAM,GAAGN,GAAG,CAACO,OAAJ,CAAa,QAAOF,QAAS,EAA7B,CAAf;AACA,MAAI,CAACC,MAAL,EAAa;AAEb,SAAOX,iBAAiB,CAACW,MAAD,EAASf,eAAT,EAA0B;AAChDiB,IAAAA,SAAS,EAAE,OADqC;AAEhDC,IAAAA,QAAQ,EAAET,GAAG,CAACU,OAAJ,CAAY,YAAZ;AAFsC,GAA1B,CAAxB;AAID,CAXD;;AAaA,MAAMC,qBAAqB,GAAG,OAC5BX,GAD4B,EAE5BY,GAF4B,KAGM;AACX;AACvB,QAAMC,QAAQ,GAAG,MAAMT,cAAc,CAACJ,GAAD,OAArC;;AAEA,MAAIa,QAAJ,aAAIA,QAAJ,eAAIA,QAAQ,CAAEnC,EAAd,EAAkB;AAChB,WAAOmC,QAAP;AACD;;AAEDD,EAAAA,GAAG,CAACE,WAAJ,CAAiB,QAAD,IAAiB,EAAjC;AACA,SAAOC,SAAP;AACD,CAbD;;AAeA,SAASC,SAAT,CAAmBC,WAAnB,EAAiD;AAC/C,SAAO,IAAIC,YAAJ,CAAY;AAAEtC,IAAAA,IAAI,EAAEqC;AAAR,GAAZ,CAAP;AACD;;AAEM,MAAME,OAAO,GAAG,OACrBnB,GADqB,EAErBY,GAFqB,KAMV;AACX,QAAMC,QAAQ,GAAG,MAAMF,qBAAqB,CAACX,GAAD,EAAMY,GAAN,CAA5C;;AACA,MAAI,CAACC,QAAL,EAAe;AACbD,IAAAA,GAAG,CAACQ,QAAJ,CAAa,YAAb;AACA,WAAO,IAAP;AACD;;AAED,QAAMC,GAAG,GAAGL,SAAS,CAACH,QAAQ,CAACI,WAAV,CAArB;AAEA,SAAO;AACLJ,IAAAA,QADK;AAELQ,IAAAA;AAFK,GAAP;AAID,CAnBM;AAqBQ,SAASzC,IAAT,CAAc0C,MAAd,EAAoC;AACjDA,EAAAA,MAAM,CAACC,GAAP,CAAW,QAAX,EAAqB,OAAOvB,GAAP,EAAqBY,GAArB,KAAuC;AAC1D,QAAI,MAAMD,qBAAqB,CAACX,GAAD,EAAMY,GAAN,CAA/B,EAA2C;AACzC,aAAOA,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AACD,KAHyD;AAM1D;AACA;AACA;AACA;AACA;;;AAEA,UAAMI,WAAW,GAAGC,MAAA,CAAkBC,iBAAlB,CAAoCC,YAApC,CAAiD;AACnEC,MAAAA,YAAY,EAAE7B,iBAAiB,CAACC,GAAD,CADoC;AAEnE6B,MAAAA,KAAK,EAAE,gBAF4D;AAInE;AACA;AACA;AACA;;AAPmE,KAAjD,CAApB,CAZ0D;;AAwB1DjB,IAAAA,GAAG,CAACQ,QAAJ,CAAaI,WAAb;AACD,GAzBD;AA2BAF,EAAAA,MAAM,CAACC,GAAP,CAAW,iBAAX,EAA8B,OAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAChD,QAAIZ,GAAG,CAAC8B,KAAJ,CAAUC,KAAd,EAAqB;AACnBnB,MAAAA,GAAG,CAACoB,IAAJ,CAAShC,GAAG,CAAC8B,KAAJ,CAAUG,iBAAnB;AACA;AACD;;AAGD,UAAMC,IAAY,GAAGlC,GAAG,CAAC8B,KAAJ,CAAUI,IAA/B,CAPgD;AAShD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAMC,MAAM,GAAG,MAAMV,MAAA,CAAkBC,iBAAlB,CAAoCU,QAApC,CAA6C;AAChEF,MAAAA,IADgE;AAEhEN,MAAAA,YAAY,EAAE7B,iBAAiB,CAACC,GAAD;AAFiC,KAA7C,CAArB;;AAKA,QAAI,CAACmC,MAAL,EAAa;AACXvB,MAAAA,GAAG,CAACoB,IAAJ,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,uFAC8BA;AAAG,QAAA,IAAI,EAAC;AAAR,mBAD9B,CADF,CADkB,CADtB;AASA;AACD;;AAED,UAAM4B,WAAW,GAAGkB,MAAM,CAACG,YAA3B;AACA,UAAMjB,GAAG,GAAGL,SAAS,CAACC,WAAD,CAArB;AACA,UAAMsB,IAAI,GAAG,MAAMlB,GAAG,CAACmB,KAAJ,CAAUC,gBAAV,CAA2B,EAA3B,CAAnB;AACA,UAAM/D,EAAE,GAAG6D,IAAI,CAACG,IAAL,CAAUhE,EAArB;AACA,UAAMiE,KAAK,GAAGJ,IAAI,CAACG,IAAL,CAAUC,KAAxB;AAEA,UAAM9B,QAAkB,GAAG;AAAEnC,MAAAA,EAAF;AAAMiE,MAAAA,KAAN;AAAa1B,MAAAA,WAAb;AAA0B2B,MAAAA,IAAI,EAAEC,IAAI,CAACC,GAAL;AAAhC,KAA3B;AACA,UAAMC,KAAK,GAAG,MAAMvD,eAAe,CAACqB,QAAD,EAAWtB,eAAX,EAA4B;AAC7DiB,MAAAA,SAAS,EAAE,OADkD;AAE7DC,MAAAA,QAAQ,EAAET,GAAG,CAACU,OAAJ,CAAY,YAAZ,CAFmD;AAG7DsC,MAAAA,SAAS,EAAE;AAHkD,KAA5B,CAAnC;AAMApC,IAAAA,GAAG,CAACN,MAAJ,CAAY,QAAD,IAAiB,EAA5B,EAA+ByC,KAA/B,EAAsC;AACpCE,MAAAA,QAAQ,EAAE,IAD0B;AAEpCpD,MAAAA;AAFoC,KAAtC;AAKAe,IAAAA,GAAG,CAACQ,QAAJ,CAAa,MAAb;AACD,GAzDD;AA0DD;;ACtKc,SAAS8B,IAAT,CACb5B,MADa,EAIP;AACNA,EAAAA,MAAM,CAACC,GAAP,CAAW,GAAX,EAAgB,OAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAClC,UAAM2B,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW;AAEX,UAAMY,IAAI,GAAG,MAAMZ,IAAI,CAAClB,GAAL,CAAS8B,IAAT,CAAcC,wBAAd,EAAnB;AAEAxC,IAAAA,GAAG,CAACoB,IAAJ,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,uDACEA,yCAAKnB,OAAO,CAACC,GAAR,CAAYgB,eAAjB,CADF,eAEEE;AAAK,MAAA,KAAK,EAAE;AAAEgE,QAAAA,OAAO,EAAE;AAAX;AAAZ,oBACEhE;AAAK,MAAA,KAAK,EAAE;AAAEiE,QAAAA,QAAQ,EAAE;AAAZ;AAAZ,oBACEjE,+DADF,eAEEA,sDACEA,sDACEA;AAAG,MAAA,IAAI,EAAC;AAAR,OAAqBkD,IAAI,CAAC1B,QAAL,CAAc8B,KAAnC,CADF,CADF,EAIGQ,IAAI,CAACT,IAAL,CAAUa,GAAV,CAAeC,GAAD,iBACbnE;AAAI,MAAA,GAAG,EAAEmE,GAAG,CAAC9E;AAAb,oBACEW;AAAG,MAAA,IAAI,EAAG,YAAWmE,GAAG,CAACb,KAAM;AAA/B,OAAmCa,GAAG,CAACb,KAAvC,CADF,CADD,CAJH,CAFF,CADF,CAFF,CADF,CADkB,CADtB;AAwBD,GA9BD;AA+BD;;AC1CD,MAAMc,MAA4B,GAAG;AACnCC,EAAAA,mBAAmB,EAAE,IADc;AAEnCC,EAAAA,SAAS,EAAE,IAFwB;AAGnCC,EAAAA,qBAAqB,EAAE,KAHY;AAInCC,EAAAA,gBAAgB,EAAE;AAChBC,IAAAA,aAAa,EAAE,KADC;AAEhBC,IAAAA,mBAAmB,EAAE,KAFL;AAGhBC,IAAAA,SAAS,EAAE,KAHK;AAIhBC,IAAAA,gBAAgB,EAAE;AAJF,GAJiB;AAUnCC,EAAAA,OAAO,EAAE;AACPhF,IAAAA,KAAK,EAAE,CACL;AACEiF,MAAAA,MAAM;AAEJ,mGAHJ;AAIEpC,MAAAA,KAAK,EAAE;AACL7C,QAAAA,KAAK,EAAE,8CADF;AAELkF,QAAAA,OAAO,EACL;AAHG;AAJT,KADK;AADA,GAV0B;AAwBnCC,EAAAA,MAAM,EAAE;AACNC,IAAAA,GAAG,EAAE;AACHC,MAAAA,iBAAiB,EAAE,wBADhB;AAEHC,MAAAA,KAAK,EAAE;AAFJ;AADC,GAxB2B;AA8BnCC,EAAAA,aAAa,EAAE;AACbH,IAAAA,GAAG,EAAE;AADQ,GA9BoB;AAiCnCI,EAAAA,KAAK,EAAE,EAjC4B;AAkCnCC,EAAAA,MAAM,EAAE;AACNC,IAAAA,IAAI,EAAE;AACJ;AACA;AACA;AACA;;AAEA;AACA,2BAAqB;AACnBC,QAAAA,IAAI,EAAE,6BADa;AAEnBC,QAAAA,KAAK,EAAE;AAFY,OAPjB;AAWJ,+BAAyB;AACvBD,QAAAA,IAAI,EAAE,iCADiB;AAEvBC,QAAAA,KAAK,EAAE;AAFgB,OAXrB;AAeJ,gCAA0B;AACxBD,QAAAA,IAAI,EAAE,kCADkB;AAExBC,QAAAA,KAAK,EAAE;AAFiB,OAftB;AAmBJ,uBAAiB;AACfD,QAAAA,IAAI,EAAE,yBADS;AAEfC,QAAAA,KAAK,EAAE;AAFQ,OAnBb;;AAwBJ;AACA,yBAAmB;AACjBD,QAAAA,IAAI,EAAE,kBADW;AAEjBC,QAAAA,KAAK,EAAE;AAFU,OAzBf;AA6BJ,uBAAiB;AACfD,QAAAA,IAAI,EAAE,mBADS;AAEfC,QAAAA,KAAK,EAAE;AAFQ,OA7Bb;AAiCJ,6BAAuB;AACrBD,QAAAA,IAAI,EAAE,yCADe;AAErBC,QAAAA,KAAK,EAAE;AAFc,OAjCnB;;AAsCJ;AACA,wBAAkB;AAChBD,QAAAA,IAAI,EAAE,gBADU;AAEhBC,QAAAA,KAAK,EAAE;AAFS,OAvCd;;AA4CJ;AACA,0BAAoB;AAClBD,QAAAA,IAAI,EAAE,4BADY;AAElBC,QAAAA,KAAK,EAAE;AAFW;AA7ChB,KADA;AAoDNC,IAAAA,MAAM,EAAE;AACNC,MAAAA,EAAE,EAAE;AACFC,QAAAA,UAAU,EAAE,gBADV;AAEFC,QAAAA,SAAS,EAAE,YAFT;AAGFC,QAAAA,MAAM,EAAE;AAHN,OADE;AAMNb,MAAAA,GAAG,EAAE;AACHc,QAAAA,WAAW,EAAE,mBADV;AAEHC,QAAAA,SAAS,EAAE,uBAFR;AAGHC,QAAAA,gBAAgB,EAAE,wBAHf;AAIHC,QAAAA,QAAQ,EAAE;AAJP;AANC;AApDF;AAlC2B,CAArC;;ACAA,MAAM9B,QAA4B,GAAG;AACnCC,EAAAA,mBAAmB,EAAE,IADc;AAEnCC,EAAAA,SAAS,EAAE,IAFwB;AAGnCC,EAAAA,qBAAqB,EAAE,KAHY;AAInCC,EAAAA,gBAAgB,EAAE;AAChBC,IAAAA,aAAa,EAAE,KADC;AAEhBC,IAAAA,mBAAmB,EAAE,KAFL;AAGhBC,IAAAA,SAAS,EAAE,KAHK;AAIhBC,IAAAA,gBAAgB,EAAE;AAJF,GAJiB;AAUnCC,EAAAA,OAAO,EAAE;AACPhF,IAAAA,KAAK,EAAE;AADA,GAV0B;AAanCmF,EAAAA,MAAM,EAAE,EAb2B;AAcnCI,EAAAA,aAAa,EAAE,EAdoB;AAenCC,EAAAA,KAAK,EAAE,EAf4B;AAgBnCC,EAAAA,MAAM,EAAE;AACNC,IAAAA,IAAI,EAAE;AACJ;AACA;AACA;AACA;;AAEA;AACA,0BAAoB;AAClBC,QAAAA,IAAI,EAAE,4BADY;AAElBC,QAAAA,KAAK,EAAE;AAFW;AAPhB,KADA;AAcNC,IAAAA,MAAM,EAAE;AACNC,MAAAA,EAAE,EAAE;AACFC,QAAAA,UAAU,EAAE,gBADV;AAEFC,QAAAA,SAAS,EAAE,YAFT;AAGFC,QAAAA,MAAM,EAAE;AAHN;AADE;AAdF;AAhB2B,CAArC;;ACAA,MAAM1B,QAAkE,GAAG;AACzEC,EAAAA,mBAAmB,EAAE,IADoD;AAEzEC,EAAAA,SAAS,EAAE,IAF8D;AAGzE6B,EAAAA,iBAAiB,EAAE,mBAHsD;AAIzE5B,EAAAA,qBAAqB,EAAE,IAJkD;AAKzE6B,EAAAA,2BAA2B,EAAE,KAL4C;AAMzE5B,EAAAA,gBAAgB,EAAE;AAChBC,IAAAA,aAAa,EAAE,KADC;AAEhBC,IAAAA,mBAAmB,EAAE,KAFL;AAGhBC,IAAAA,SAAS,EAAE,KAHK;AAIhBC,IAAAA,gBAAgB,EAAE;AAJF,GANuD;AAYzEC,EAAAA,OAAO,EAAE;AACPhF,IAAAA,KAAK,EAAE,CACL;AACEiF,MAAAA,MAAM;AAEJ,+FAHJ;AAIEpC,MAAAA,KAAK,EAAE;AACL7C,QAAAA,KAAK,EAAE,8CADF;AAELkF,QAAAA,OAAO,EACL;AAHG;AAJT,KADK,EAWL;AACEsB,MAAAA,GAAG,EAAE,KADP;AAEEvB,MAAAA,MAAM,EAAE,sCAFV;AAGEpC,MAAAA,KAAK,EAAE;AACL7C,QAAAA,KAAK,EAAE,gCADF;AAELkF,QAAAA,OAAO,EAAE;AAFJ,OAHT;AAOEuB,MAAAA,MAAM,EAAE,YAPV;AAQEC,MAAAA,mBAAmB,EAAGC,KAAD,IAAW;AAC9B,cAAMC,KAAK,GAAGD,KAAK,CAAC,CAAD,CAAnB;;AACA,YAAIC,KAAK,KAAK,YAAd,EAA4B;AAC1B,iBAAO;AACL5G,YAAAA,KAAK,EAAE,UADF;AAELkF,YAAAA,OAAO,EAAE;AAFJ,WAAP;AAID;;AACD,eAAO;AACL2B,UAAAA,MAAM,EAAE,IADH;AAELC,UAAAA,GAAG,EAAG,wCAAuCF,KAAM,EAF9C;AAGL5G,UAAAA,KAAK,EAAG,eAAc4G,KAAM,EAHvB;AAIL1B,UAAAA,OAAO,EAAG,IAAG0B,KAAM,0CAAyCA,KAAM;AAJ7D,SAAP;AAMD;AAtBH,KAXK;AADA,GAZgE;AAmDzEG,EAAAA,QAAQ,EAAE,CAAC,eAAD,CAnD+D;AAqDzE5B,EAAAA,MAAM,EAAE;AACNC,IAAAA,GAAG,EAAE;AACH;AACA4B,MAAAA,WAAW,EAAG,eAAchI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAF1D;AAGHC,MAAAA,gBAAgB,EAAG,cAAalI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAH9D;;AAKH;AACAE,MAAAA,QAAQ,EAAG,YAAWnI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EANpD;AAOHG,MAAAA,UAAU,EAAG,cAAapI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAPxD;AAQH,uBAAkB,UAASjI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EARzD;AASHI,MAAAA,QAAQ,EAAG,QAAOrI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAThD;AAUHK,MAAAA,IAAI,EAAG,gBAAetI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAVpD;AAWHM,MAAAA,UAAU,EAAG,aAAYvI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAXvD;;AAaH;AACA5B,MAAAA,iBAAiB,EAAG,aAAYrG,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAd9D;AAeHO,MAAAA,WAAW,EAAG,OAAMxI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAflD;AAgBHQ,MAAAA,aAAa,EAAG,WAAUzI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAhBxD;AAiBHS,MAAAA,KAAK,EAAG,SAAQ1I,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAjB9C;AAkBHU,MAAAA,IAAI,EAAG,WAAU3I,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAlB/C;AAmBH,iBAAY,iBAAgBjI,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAnB1D;AAoBHW,MAAAA,QAAQ,EAAG,gBAAe5I,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EApBxD;AAqBHY,MAAAA,aAAa,EAAG,cAAa7I,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EArB3D;AAsBHa,MAAAA,QAAQ,EAAG,eAAc9I,OAAO,CAACC,GAAR,CAAYgI,oBAAqB;AAtBvD,KADC;AAyBNc,IAAAA,MAAM,EAAE;AACNC,MAAAA,SAAS,EAAG,SAAQhJ,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAD/C;AAENgB,MAAAA,eAAe,EAAG,WAAUjJ,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAFvD;AAGNiB,MAAAA,QAAQ,EAAG,OAAMlJ,OAAO,CAACC,GAAR,CAAYgI,oBAAqB,EAH5C;AAINkB,MAAAA,SAAS,EAAE;AAJL;AAzBF,GArDiE;AAsFzE3C,EAAAA,KAAK,EAAE;AACL4C,IAAAA,GAAG,EAAE;AACHC,MAAAA,MAAM,EAAE,CAAC,aAAD,EAAgB,UAAhB,EAA4B,aAA5B,EAA2C,QAA3C,CADL;AAEH5C,MAAAA,MAAM,EAAE,CAAC,WAAD;AAFL,KADA;AAML6C,IAAAA,QAAQ,EAAE;AACRD,MAAAA,MAAM,EAAE,CACN,UADM,EAEN,cAFM,EAGN,YAHM,EAIN,eAJM,EAKN,UALM,EAMN,MANM,EAON,QAPM,CADA;AAUR5C,MAAAA,MAAM,EAAE,CAAC,eAAD;AAVA,KANL;AAmBL8C,IAAAA,SAAS,EAAE;AACTF,MAAAA,MAAM,EAAE,CACN,mBADM,EAEN,aAFM,EAGN,eAHM,EAIN,eAJM,EAKN,OALM,EAMN,MANM,EAON,SAPM,EAQN,UARM,EASN,eATM,EAUN,UAVM,CADC;AAaT5C,MAAAA,MAAM,EAAE,CAAC,gBAAD;AAbC;AAnBN,GAtFkE;AA0HzEF,EAAAA,aAAa,EAAE;AACbH,IAAAA,GAAG,EAAE,EADQ;AAEb2C,IAAAA,MAAM,EAAE,CAAC,KAAD;AAFK,GA1H0D;AA8HzEtC,EAAAA,MAAM,EAAE;AACNC,IAAAA,IAAI,EAAE;AACJ;AACA;AACA;AACA;;AAEA;AACA,2BAAqB;AACnBC,QAAAA,IAAI,EAAE,6BADa;AAEnBC,QAAAA,KAAK,EAAE;AAFY,OAPjB;AAWJ,+BAAyB;AACvBD,QAAAA,IAAI,EAAE,iCADiB;AAEvBC,QAAAA,KAAK,EAAE;AAFgB,OAXrB;AAeJ,gCAA0B;AACxBD,QAAAA,IAAI,EAAE,kCADkB;AAExBC,QAAAA,KAAK,EAAE;AAFiB,OAftB;AAmBJ,uBAAiB;AACfD,QAAAA,IAAI,EAAE,yBADS;AAEfC,QAAAA,KAAK,EAAE;AAFQ,OAnBb;;AAwBJ;AACA,6BAAuB;AACrBD,QAAAA,IAAI,EAAE,2BADe;AAErBC,QAAAA,KAAK,EAAE;AAFc,OAzBnB;AA6BJ,iCAA2B;AACzBD,QAAAA,IAAI,EAAE,+BADmB;AAEzBC,QAAAA,KAAK,EAAE;AAFkB,OA7BvB;AAiCJ,kCAA4B;AAC1BD,QAAAA,IAAI,EAAE,gCADoB;AAE1BC,QAAAA,KAAK,EAAE;AAFmB,OAjCxB;AAqCJ,yBAAmB;AACjBD,QAAAA,IAAI,EAAE,uBADW;AAEjBC,QAAAA,KAAK,EAAE;AAFU,OArCf;;AA0CJ;AACA,mBAAa;AACXD,QAAAA,IAAI,EAAE,KADK;AAEXC,QAAAA,KAAK,EAAE;AAFI,OA3CT;AA+CJ,uBAAiB;AACfD,QAAAA,IAAI,EAAE,SADS;AAEfC,QAAAA,KAAK,EAAE;AAFQ,OA/Cb;AAmDJ,wBAAkB;AAChBD,QAAAA,IAAI,EAAE,UADU;AAEhBC,QAAAA,KAAK,EAAE;AAFS,OAnDd;;AAwDJ;AACA,yBAAmB;AACjBD,QAAAA,IAAI,EAAE,kBADW;AAEjBC,QAAAA,KAAK,EAAE;AAFU,OAzDf;AA6DJ,uBAAiB;AACfD,QAAAA,IAAI,EAAE,mBADS;AAEfC,QAAAA,KAAK,EAAE;AAFQ,OA7Db;AAiEJ,6BAAuB;AACrBD,QAAAA,IAAI,EAAE,yCADe;AAErBC,QAAAA,KAAK,EAAE;AAFc,OAjEnB;;AAsEJ;AACA,wBAAkB;AAChBD,QAAAA,IAAI,EAAE,gBADU;AAEhBC,QAAAA,KAAK,EAAE;AAFS,OAvEd;;AA4EJ;AACA,0BAAoB;AAClBD,QAAAA,IAAI,EAAE,4BADY;AAElB6C,QAAAA,WAAW,EAAE,0DAFK;AAGlB5C,QAAAA,KAAK,EAAE;AAHW,OA7EhB;AAkFJ6C,MAAAA,SAAS,EAAE;AACT9C,QAAAA,IAAI,EAAE,WADG;AAET6C,QAAAA,WAAW,EAAE,2CAFJ;AAGT5C,QAAAA,KAAK,EAAE;AAHE,OAlFP;AAuFJ8C,MAAAA,aAAa,EAAE;AACb/C,QAAAA,IAAI,EAAE,eADO;AAEb6C,QAAAA,WAAW,EAAE,4CAFA;AAGb5C,QAAAA,KAAK,EAAE;AAHM,OAvFX;AA4FJ+C,MAAAA,GAAG,EAAE;AACHhD,QAAAA,IAAI,EAAE,KADH;AAEH6C,QAAAA,WAAW,EAAE,sBAFV;AAGH5C,QAAAA,KAAK,EAAE;AAHJ,OA5FD;AAiGJgD,MAAAA,GAAG,EAAE;AACHjD,QAAAA,IAAI,EAAE,KADH;AAEH6C,QAAAA,WAAW,EAAE,yBAFV;AAGH5C,QAAAA,KAAK,EAAE;AAHJ,OAjGD;AAsGJiD,MAAAA,WAAW,EAAE;AACXlD,QAAAA,IAAI,EAAE,aADK;AAEX6C,QAAAA,WAAW,EAAE,wBAFF;AAGX5C,QAAAA,KAAK,EAAE;AAHI,OAtGT;AA2GJ,qBAAe;AACbD,QAAAA,IAAI,EAAE,aADO;AAEb6C,QAAAA,WAAW,EAAE,2BAFA;AAGb5C,QAAAA,KAAK,EAAE;AAHM,OA3GX;AAgHJkD,MAAAA,QAAQ,EAAE;AACRnD,QAAAA,IAAI,EAAE,UADE;AAER6C,QAAAA,WAAW,EAAE,kCAFL;AAGR5C,QAAAA,KAAK,EAAE;AAHC,OAhHN;AAqHJmD,MAAAA,OAAO,EAAE;AACPpD,QAAAA,IAAI,EAAE,SADC;AAEP6C,QAAAA,WAAW,EAAE,4BAFN;AAGP5C,QAAAA,KAAK,EAAE;AAHA;AArHL,KADA;AA6HNC,IAAAA,MAAM,EAAE;AACNC,MAAAA,EAAE,EAAE;AACFC,QAAAA,UAAU,EAAE,gBADV;AAEFC,QAAAA,SAAS,EAAE,YAFT;AAGFC,QAAAA,MAAM,EAAE;AAHN,OADE;AAMNb,MAAAA,GAAG,EAAE;AACHc,QAAAA,WAAW,EAAE,mBADV;AAEHC,QAAAA,SAAS,EAAE,uBAFR;AAGHC,QAAAA,gBAAgB,EAAE,wBAHf;AAIHC,QAAAA,QAAQ,EAAE;AAJP,OANC;AAYN0B,MAAAA,MAAM,EAAE;AACN7B,QAAAA,WAAW,EAAE,qBADP;AAENC,QAAAA,SAAS,EAAE,yBAFL;AAGNC,QAAAA,gBAAgB,EAAE,0BAHZ;AAINC,QAAAA,QAAQ,EAAE;AAJJ;AAZF;AA7HF;AA9HiE,CAA3E;;ACCA,MAAM9B,QAA4B,GAAG,EACnC,GAAGyE,MADgC;AAEnCtE,EAAAA,qBAAqB,EAAE,IAFY;AAGnCS,EAAAA,MAAM,EAAE;AACNC,IAAAA,GAAG,EAAE;AACHC,MAAAA,iBAAiB,EAAE,wBADhB;AAEH,0BAAoB;AAFjB;AADC;AAH2B,CAArC;;ACQO,MAAM4D,cAA2C,GAAG;AACzDC,WAAAA,QADyD;AAEzD7D,qBAAAA,MAFyD;AAGzD8D,cAAAA;AAHyD,CAApD;AASP;AACA;AACA;AACA;AACA;;ACtBO,MAAMC,iBAAmD,GAAG;AACjE,eAAa,IADoD;AAEjE,sBAAoB,IAF6C;AAGjE,gBAAc,IAHmD;AAIjE,qBAAmB,IAJ8C;AAKjE,uBAAqB,IAL4C;AAMjE,4BAA0B,KANuC;AAOjE,wBAAsB,IAP2C;AAQjE,uBAAqB,IAR4C;AASjE,wBAAsB,IAT2C;AAUjE,2BAAyB;AAVwC,CAA5D;;ACIP,MAAMC,KAAK,GAAG,IAAIC,GAAJ,EAAd;;AAEA,MAAMC,oBAAoB,GAAIjF,GAAD,IAAiC;AAC5D,QAAMkF,aAAa,GAAGP,cAAc,CAAC3E,GAAD,CAAd,IAAuBmF,QAA7C;AACA,SAAOD,aAAa,CAACJ,iBAAd,GACH,EAAE,GAAGA,iBAAL;AAAwB,OAAGI,aAAa,CAACJ;AAAzC,GADG,GAEHA,iBAFJ;AAGD,CALD;;AAOO,MAAMM,WAAW,GAAG,CACzBpF,GADyB,EAEzBqF,MAFyB,EAGzBC,WAHyB,KAIhB;AACT,MAAIC,QAAQ,GAAGR,KAAK,CAAChH,GAAN,CAAUiC,GAAV,CAAf;;AACA,MAAI,CAACuF,QAAL,EAAe;AACbA,IAAAA,QAAQ,GAAG,IAAIP,GAAJ,EAAX;AACAD,IAAAA,KAAK,CAACS,GAAN,CAAUxF,GAAV,EAAeuF,QAAf;AACD;;AACDA,EAAAA,QAAQ,CAACC,GAAT,CAAaH,MAAb,EAAqB,EAAE,GAAGJ,oBAAoB,CAACjF,GAAD,CAAzB;AAAgC,OAAGsF;AAAnC,GAArB;AACD,CAXM;AAaA,MAAMG,iBAAiB,GAAG,OAC/BC,WAD+B,EAE/B1F,GAF+B,EAG/B2F,KAH+B,EAI/BN,MAJ+B,KAKH;AAC5B,QAAMO,oBAAoB,GAAGX,oBAAoB,CAACjF,GAAD,CAAjD;AAEA,QAAM6F,oBAAoB,GAAG,MAAMH,WAAW,CAACI,cAAZ,CAA2BC,OAA3B,CAAmC;AACpEJ,IAAAA,KADoE;AAEpEN,IAAAA;AAFoE,GAAnC,CAAnC;AAKA,QAAMpF,MAAM,GAAG4F,oBAAoB,GAC/B,EACE,GAAGD,oBADL;AAEE,OAAGC,oBAAoB,CAACG;AAF1B,GAD+B,GAK/BJ,oBALJ;AAOAR,EAAAA,WAAW,CAACpF,GAAD,EAAMqF,MAAN,EAAcpF,MAAd,CAAX;AACA,SAAOA,MAAP;AACD,CAtBM;;ACnBA,MAAMgG,OAAO,GAAG,OACrBP,WADqB,EAErBQ,MAFqB,EAGrBC,cAHqB,EAIrBnG,GAJqB,KAKJ;AACjB,QAAMoG,UAAU,GAAG,MAAMV,WAAW,CAAC/F,IAAZ,CAAiB0G,SAAjB,CAA2B;AAClDC,IAAAA,GAAG,EAAEtG,GAAG,CAAC9E,EADyC;AAC9B;AACpBiE,IAAAA,KAAK,EAAEa,GAAG,CAACb,KAFuC;AAGlDgH,IAAAA;AAHkD,GAA3B,CAAzB;AAMA,QAAMI,QAAQ,GAAG;AAAErL,IAAAA,EAAE,EAAE8E,GAAG,CAAC9E,EAAV;AAAciE,IAAAA,KAAK,EAAEa,GAAG,CAACb;AAAzB,GAAjB;AAEA,QAAMqH,SAAmB,GAAG,EAA5B;AAEA,QAAMC,OAAO,CAACC,GAAR,CACJ,MAAMR,MAAM,CAACS,QAAP,CACJT,MAAM,CAACvG,IAAP,CAAYiH,WAAZ,CAAwBC,QAAxB,CAAiCC,KAAjC,CAAuC;AACrC9G,IAAAA,GAAG,EAAEA,GAAG,CAACb;AAD4B,GAAvC,CADI,EAIJ,CAAC;AACCD,IAAAA;AADD,GAAD,KAEkE;AAChE,WAAOuH,OAAO,CAACC,GAAR,CACLxH,IAAI,CAACa,GAAL,CAAS,MAAOgH,MAAP,IAAkB;AACzBP,MAAAA,SAAS,CAACQ,IAAV,CAAeD,MAAM,CAAC7L,EAAtB;AACA,aAAOuL,OAAO,CAACC,GAAR,CAAY,CACjBhB,WAAW,CAACuB,UAAZ,CAAuBZ,SAAvB,CAAiC;AAC/BC,QAAAA,GAAG,EAAG,GAAEtG,GAAG,CAAC9E,EAAG,IAAG6L,MAAM,CAAC7L,EAAG,EADG;AAE/B8E,QAAAA,GAAG,EAAEuG,QAF0B;AAG/BxH,QAAAA,IAAI,EAAE;AACJ7D,UAAAA,EAAE,EAAE6L,MAAM,CAAC7L,EADP;AAEJiE,UAAAA,KAAK,EAAE4H,MAAM,CAAC5H;AAFV;AAHyB,OAAjC,CADiB,EASjBuG,WAAW,CAAC1G,KAAZ,CAAkBqH,SAAlB,CAA4B;AAC1BC,QAAAA,GAAG,EAAES,MAAM,CAAC7L,EADc;AAE1BiE,QAAAA,KAAK,EAAE4H,MAAM,CAAC5H,KAFY;AAG1B+H,QAAAA,IAAI,EAAEH,MAAM,CAACG;AAHa,OAA5B,CATiB,CAAZ,CAAP;AAeD,KAjBD,CADK,CAAP;AAoBD,GA3BG,CADF,CAAN;AAgCA,QAAMxB,WAAW,CAACuB,UAAZ,CAAuBE,UAAvB,CAAkC;AACtC,cAAUnH,GAAG,CAAC9E,EADwB;AAEtC,eAAW;AAAEkM,MAAAA,IAAI,EAAE;AAAEC,QAAAA,GAAG,EAAEb;AAAP;AAAR;AAF2B,GAAlC,CAAN;AAKA,SAAOJ,UAAP;AACD,CAtDM;;ACLA,MAAMkB,SAAS,GAAG,OACvB5B,WADuB,EAEvBQ,MAFuB,EAGvBlG,GAHuB,KAIL;AAClB,QAAMuG,QAAQ,GAAG;AAAErL,IAAAA,EAAE,EAAE8E,GAAG,CAAC9E,EAAV;AAAciE,IAAAA,KAAK,EAAEa,GAAG,CAACb;AAAzB,GAAjB;AAEA,QAAMoI,OAAiB,GAAG,EAA1B;AAEA,QAAMd,OAAO,CAACC,GAAR,CACJ,MAAMR,MAAM,CAACS,QAAP,CACJT,MAAM,CAAChF,KAAP,CAAaE,IAAb,CAAkByF,QAAlB,CAA2BC,KAA3B,CAAiC;AAC/B9G,IAAAA,GAAG,EAAEA,GAAG,CAACb;AADsB,GAAjC,CADI,EAIJ,CAAC;AAAED,IAAAA;AAAF,GAAD,KAAoE;AAClE,WAAOuH,OAAO,CAACC,GAAR,CACLxH,IAAI,CAACa,GAAL,CAAUyH,IAAD,IAAU;AACjBD,MAAAA,OAAO,CAACP,IAAR,CAAaQ,IAAI,CAACtM,EAAlB;AACA,aAAOwK,WAAW,CAAC+B,QAAZ,CAAqBpB,SAArB,CAA+B;AACpCC,QAAAA,GAAG,EAAEkB,IAAI,CAACtM,EAD0B;AAEpC8E,QAAAA,GAAG,EAAEuG,QAF+B;AAGpClF,QAAAA,IAAI,EAAEmG,IAAI,CAACnG,IAHyB;AAIpCqG,QAAAA,IAAI,EAAEF,IAAI,CAACE,IAJyB;AAKpCxD,QAAAA,WAAW,EAAEsD,IAAI,CAACtD;AALkB,OAA/B,CAAP;AAOD,KATD,CADK,CAAP;AAYD,GAjBG,CADF,CAAN;AAsBA,QAAMwB,WAAW,CAAC+B,QAAZ,CAAqBN,UAArB,CAAgC;AACpC,cAAUnH,GAAG,CAAC9E,EADsB;AAEpCoL,IAAAA,GAAG,EAAE;AAAEc,MAAAA,IAAI,EAAE;AAAEC,QAAAA,GAAG,EAAEE;AAAP;AAAR;AAF+B,GAAhC,CAAN;AAID,CAnCM;;ACUP,MAAMI,UAA2C,GAAG;AAClD,eAAa,wDADqC;AAElD,sBAAoB,6CAF8B;AAGlD,gBAAc,8BAHoC;AAIlD,qBAAmB,4BAJ+B;AAKlD,uBAAqB,4CAL6B;AAMlD,4BAA0B,0CANwB;AAOlD,wBAAsB,+BAP4B;AAQlD,uBAAqB,2CAR6B;AASlD,wBAAsB,gDAT4B;AAUlD,2BACE;AAXgD,CAApD;AAce,SAASC,WAAT,CACb9J,MADa,EAEb+J,UAFa,EAGbnC,WAHa,EAIP;AACN5H,EAAAA,MAAM,CAACC,GAAP,CAAW,sBAAX,EAAmC,OAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AACrD,UAAM2B,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW;AAEX,UAAMY,IAAI,GAAG,MAAMZ,IAAI,CAAClB,GAAL,CAAS8B,IAAT,CAAcC,wBAAd,EAAnB;AACA,UAAMI,GAAG,GAAGL,IAAI,CAACT,IAAL,CAAU4I,IAAV,CAAgBC,CAAD,IAAOA,CAAC,CAAC5I,KAAF,KAAY3C,GAAG,CAACwL,MAAJ,CAAWhI,GAA7C,CAAZ;AACA,QAAI,CAACA,GAAL,EAAU,OAAO5C,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAEV,UAAMmK,CAAC,GAAG,MAAMrC,WAAW,CAAC/F,IAAZ,CAAiBsI,SAAjB,CAA2BjI,GAAG,CAAC9E,EAA/B,CAAhB;AACA,QAAI,CAAC6M,CAAL,EAAQ,OAAO3K,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAER,UAAMqI,OAAO,CAACP,WAAD,EAAc3G,IAAI,CAAClB,GAAnB,EAAwBkK,CAAC,CAAC5B,cAA1B,EAAoDnG,GAApD,CAAb;AACA,UAAMsH,SAAS,CAAC5B,WAAD,EAAc3G,IAAI,CAAClB,GAAnB,EAAwBmC,GAAxB,CAAf;AAEA5C,IAAAA,GAAG,CAACQ,QAAJ,CAAc,YAAWpB,GAAG,CAACwL,MAAJ,CAAWhI,GAAI,EAAxC;AACD,GAfD;AAiBAlC,EAAAA,MAAM,CAACC,GAAP,CAAW,WAAX,EAAwB,OAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAC1C,UAAM2B,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW;AAEX,UAAMY,IAAI,GAAG,MAAMZ,IAAI,CAAClB,GAAL,CAAS8B,IAAT,CAAcC,wBAAd,EAAnB;AACA,UAAMI,GAAG,GAAGL,IAAI,CAACT,IAAL,CAAU4I,IAAV,CAAgBC,CAAD,IAAOA,CAAC,CAAC5I,KAAF,KAAY3C,GAAG,CAACwL,MAAJ,CAAWhI,GAA7C,CAAZ;AACA,QAAI,CAACA,GAAL,EAAU,OAAO5C,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAEV,UAAMsK,YAAY,GAAG,MAAML,UAAU,CAACM,IAAX,CACxBC,kBADwB,CACL;AAAEpI,MAAAA,GAAG,EAAEA,GAAG,CAACb;AAAX,KADK,EAExBkJ,KAFwB,CAEjBC,GAAD,IAAS;AACd,aAAO;AAAEnG,QAAAA,MAAM,EAAEmG,GAAG,CAACnG,MAAd;AAAsBjD,QAAAA,IAAI,EAAE3B;AAA5B,OAAP;AACD,KAJwB,CAA3B;;AAMA,QAAI,CAAC2K,YAAL,EAAmB;AACjB,aAAO9K,GAAG,CAACoB,IAAJ,CACLK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,0CACGnB,OAAO,CAACC,GAAR,CAAYgB,eADf,EACgC,GADhC,EAEG,uCAFH,eAGEE;AACE,QAAA,IAAI,EAAG,oCAAmCnB,OAAO,CAACC,GAAR,CAAYgB,eAAgB;AADxE,gCAHF,EAOO,GAPP,mBADF,CADkB,CADf,CAAP;AAgBD;;AAED,UAAMuJ,aAAa,GAAGP,cAAc,CAAC3E,GAAG,CAACb,KAAL,CAApC;AACA,UAAM2G,cAAc,GAAG,MAAML,iBAAiB,CAC5CC,WAD4C,EAE5C1F,GAAG,CAACb,KAFwC,EAG5Ca,GAAG,CAAC9E,EAHwC,EAI5C6D,IAAI,CAAC1B,QAAL,CAAcnC,EAJ8B,CAA9C;AAOAkC,IAAAA,GAAG,CAACoB,IAAJ,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,uDACEA,yCAAKnB,OAAO,CAACC,GAAR,CAAYgB,eAAjB,CADF,eAEEE;AAAK,MAAA,KAAK,EAAE;AAAEgE,QAAAA,OAAO,EAAE;AAAX;AAAZ,oBACEhE;AAAI,MAAA,KAAK,EAAE;AAAEiE,QAAAA,QAAQ,EAAE;AAAZ;AAAX,OAA6BE,GAAG,CAACb,KAAjC,CADF,eAEEtD;AAAG,MAAA,IAAI,EAAC;AAAR,wBAFF,CAFF,eAOEA;AAAK,MAAA,KAAK,EAAE;AAAEgE,QAAAA,OAAO,EAAE;AAAX;AAAZ,oBACEhE;AAAK,MAAA,KAAK,EAAE;AAAEiE,QAAAA,QAAQ,EAAE;AAAZ;AAAZ,oBACEjE,uDADF,EAEG,CAACqJ,aAAD,GACG,yHADH,GAEI,iGAAgGlF,GAAG,CAACb,KAAM,KAJjH,CADF,eAOEtD;AAAK,MAAA,KAAK,EAAE;AAAE0M,QAAAA,KAAK,EAAE;AAAT;AAAZ,oBACE1M,0DADF,EAEG2M,MAAM,CAACC,OAAP,CAAed,UAAf,EAA2B5H,GAA3B,CAA+B,CAAC,CAAC2I,GAAD,EAAMrH,IAAN,CAAD,kBAC9BxF;AAAK,MAAA,GAAG,EAAE6M;AAAV,oBACE7M;AAAO,MAAA,OAAO,EAAE6M;AAAhB,oBACE7M;AACE;AACA,MAAA,uBAAuB,EAAE;AACvB8M,QAAAA,MAAM,EAAG,cAAaD,GAAI,wCACxB5C,cAAc,CAAC4C,GAAD,CAAd,GACI,oBADJ,GAEI,EACL,sIAAqIA,GAAI;AALnH;AAF3B,MADF,EAWGrH,IAXH,CADF,CADD,CAFH,CAPF,CAPF,CADF,CADkB,CADtB;AA0CD,GAnFD;AAqFAvD,EAAAA,MAAM,CAAC8K,KAAP,CAAa,WAAb,EAA0BC,mBAAU,CAACC,IAAX,EAA1B,EAA6C,OAAOtM,GAAP,EAAYY,GAAZ,KAAoB;AAC/D,QAAI,CAACZ,GAAG,CAACuM,IAAT,EAAe;AACb3L,MAAAA,GAAG,CAAC+E,MAAJ,CAAW,GAAX,EAAgB3D,IAAhB,CAAqB,QAArB;AACA;AACD;;AAED,UAAMO,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW;AAEX,UAAMY,IAAI,GAAG,MAAMZ,IAAI,CAAClB,GAAL,CAAS8B,IAAT,CAAcC,wBAAd,EAAnB;AACA,UAAMI,GAAG,GAAGL,IAAI,CAACT,IAAL,CAAU4I,IAAV,CAAgBC,CAAD,IAAOA,CAAC,CAAC5I,KAAF,KAAY3C,GAAG,CAACwL,MAAJ,CAAWhI,GAA7C,CAAZ;AACA,QAAI,CAACA,GAAL,EAAU,OAAO5C,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAEV,KAAC,MAAM8H,WAAW,CAACI,cAAZ,CAA2BkD,UAAlC,EAA8CC,SAA9C,CACE;AACE3C,MAAAA,GAAG,EAAG,GAAEtG,GAAG,CAAC9E,EAAG,IAAG6D,IAAI,CAAC1B,QAAL,CAAcnC,EAAG;AADrC,KADF,EAIE;AACEgO,MAAAA,IAAI,EAAE;AACJ,SAAE,YAAW1M,GAAG,CAACuM,IAAJ,CAASL,GAAI,EAA1B,GAA8BlM,GAAG,CAACuM,IAAJ,CAASI,KADnC;AAEJC,QAAAA,OAAO,EAAE,IAAI/J,IAAJ;AAFL,OADR;AAKEgK,MAAAA,YAAY,EAAE;AACZ1D,QAAAA,KAAK,EAAE3F,GAAG,CAAC9E,EADC;AAEZmK,QAAAA,MAAM,EAAEtG,IAAI,CAAC1B,QAAL,CAAcnC,EAFV;AAGZoO,QAAAA,OAAO,EAAE,IAAIjK,IAAJ;AAHG;AALhB,KAJF,EAeE;AAAEkK,MAAAA,MAAM,EAAE;AAAV,KAfF;AAkBA,UAAM1D,oBAAoB,GAAG,MAAMH,WAAW,CAACI,cAAZ,CAA2BC,OAA3B,CAAmC;AACpEJ,MAAAA,KAAK,EAAE3F,GAAG,CAAC9E,EADyD;AAEpEmK,MAAAA,MAAM,EAAEtG,IAAI,CAAC1B,QAAL,CAAcnC;AAF8C,KAAnC,CAAnC;;AAKA,QAAI2K,oBAAJ,EAA0B;AACxBT,MAAAA,WAAW,CAACpF,GAAG,CAACb,KAAL,EAAYJ,IAAI,CAAC1B,QAAL,CAAcnC,EAA1B,EAA8B2K,oBAAoB,CAACG,QAAnD,CAAX;AACD;;AAED5I,IAAAA,GAAG,CAACoB,IAAJ,CAAS,IAAT;AACD,GAzCD;AA0CD;;AC1Kc,SAASgL,UAAT,CACb1L,MADa,EAEb+J,UAFa,EAGP;AACN/J,EAAAA,MAAM,CAACC,GAAP,CAAW,eAAX,EAA4B,OAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAC9C,UAAM2B,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW;AACX,UAAM;AAAEG,MAAAA;AAAF,QAAW,MAAMH,IAAI,CAAClB,GAAL,CAAS4L,KAAT,CAAe7J,wBAAf,CAAwC;AAC7D8J,MAAAA,QAAQ,EAAE;AADmD,KAAxC,CAAvB;AAIAtM,IAAAA,GAAG,CAACoB,IAAJ,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,uDACEA,6DADF,eAEEA,yCACGqD,IAAI,CAACa,GAAL,CAAU4J,IAAD,iBACR9N;AAAI,MAAA,GAAG,EAAE8N,IAAI,CAACzO;AAAd,oBACEW;AAAG,MAAA,IAAI,EAAG,mBAAkB8N,IAAI,CAACC,KAAL,CAAWzK,KAAM,IAAGwK,IAAI,CAACtI,IAAK;AAA1D,OACGsI,IAAI,CAACtI,IADR,CADF,CADD,CADH,CAFF,EAYGnC,IAAI,CAAC2K,MAAL,KAAgB,GAAhB,iBACChO,0FAbJ,CADF,CADkB,CADtB;AAsBD,GA7BD;AA+BAiC,EAAAA,MAAM,CAACC,GAAP,CAAW,gCAAX,EAA6C,OAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAC/D,UAAM2B,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW;AACX,UAAM;AAAEG,MAAAA;AAAF,QAAW,MAAMH,IAAI,CAAClB,GAAL,CAAS4L,KAAT,CAAe1L,GAAf,CAAmB;AACxC6L,MAAAA,KAAK,EAAEpN,GAAG,CAACwL,MAAJ,CAAW4B,KADsB;AAExCD,MAAAA,IAAI,EAAEnN,GAAG,CAACwL,MAAJ,CAAWwB;AAFuB,KAAnB,CAAvB;;AAKA,QAAI,CAACtK,IAAL,EAAW;AACT9B,MAAAA,GAAG,CAAC+E,MAAJ,CAAW,GAAX,EAAgB3D,IAAhB,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,2DADF,CADkB,CADtB;AAOA;AACD;;AAED,QAAI,CAACqD,IAAI,CAAC4K,WAAN,IAAqB,CAAC5K,IAAI,CAAC4K,WAAL,CAAiBC,KAA3C,EAAkD;AAChD3M,MAAAA,GAAG,CAAC+E,MAAJ,CAAW,GAAX,EAAgB3D,IAAhB,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,+GADF,CADkB,CADtB;AASA;AACD;;AAED,UAAM;AAAEqD,MAAAA,IAAI,EAAE8K;AAAR,QAAkB,MAAMnC,UAAU,CAACM,IAAX,CAC3B8B,mBAD2B,CACP;AACnBL,MAAAA,KAAK,EAAEpN,GAAG,CAACwL,MAAJ,CAAW4B,KADC;AAEnBD,MAAAA,IAAI,EAAEnN,GAAG,CAACwL,MAAJ,CAAWwB;AAFE,KADO,EAK3BnB,KAL2B,CAKpBC,GAAD,IAAS;AACd,aAAO;AAAEnG,QAAAA,MAAM,EAAEmG,GAAG,CAACnG,MAAd;AAAsBjD,QAAAA,IAAI,EAAE3B;AAA5B,OAAP;AACD,KAP2B,CAA9B;;AASA,QAAI,CAACyM,KAAL,EAAY;AACV5M,MAAAA,GAAG,CAACoB,IAAJ,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,0CACGnB,OAAO,CAACC,GAAR,CAAYgB,eADf,EACgC,GADhC,EAEG,sCAFH,eAGEE;AACE,QAAA,IAAI,EAAG,2BAA0BnB,OAAO,CAACC,GAAR,CAAYgB,eAAgB;AAD/D,gCAHF,EAOO,GAPP,eADF,CADkB,CADtB;AAgBA;AACD;;AAEDyB,IAAAA,GAAG,CAACoB,IAAJ,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,uDACEA,yCAAKW,GAAG,CAACwL,MAAJ,CAAWwB,UAAhB,CADF,CADF,CADkB,CADtB;AASD,GAtED;AAuED;;ACzGM,MAAMU,QAAQ,GAAG,OACtBxE,WADsB,EAEtBQ,MAFsB,EAGtBC,cAHsB,EAItBgE,QAJsB,KAKJ;AAClB,QAAMpL,IAAI,GAAG,MAAM2G,WAAW,CAAC1G,KAAZ,CAAkBqH,SAAlB,CAA4B;AAC7CC,IAAAA,GAAG,EAAE6D,QAAQ,CAACjP,EAD+B;AAE7CiE,IAAAA,KAAK,EAAEgL,QAAQ,CAAChL,KAF6B;AAG7C+H,IAAAA,IAAI,EAAE,MAHuC;AAI7Cf,IAAAA;AAJ6C,GAA5B,CAAnB;AAOA,SAAOpH,IAAP;AACD,CAdM;;ACCQ,SAASqL,YAAT,CACbtM,MADa,EAEb+J,UAFa,EAGbnC,WAHa,EAIP;AACN5H,EAAAA,MAAM,CAACC,GAAP,CAAW,kBAAX,EAA+B,OAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AACjD,UAAM2B,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW,OAFsC;AAKjD;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA,UAAMsL,CAAC,GAAG,MAAM3E,WAAW,CAAC1G,KAAZ,CAAkBiJ,SAAlB,CAA4BlJ,IAAI,CAAC1B,QAAL,CAAcnC,EAA1C,CAAhB;AACA,QAAI,CAACmP,CAAD,IAAM,CAACA,CAAC,CAAClE,cAAb,EAA6B,OAAO/I,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAE7B,UAAMsM,QAAQ,CACZxE,WADY,EAEZ3G,IAAI,CAAClB,GAFO,EAGZwM,CAAC,CAAClE,cAHU,EAIZpH,IAAI,CAAC1B,QAJO,CAAd;AAOAD,IAAAA,GAAG,CAACQ,QAAJ,CAAa,WAAb;AACD,GAzBD;AA2BAE,EAAAA,MAAM,CAACC,GAAP,CAAW,OAAX,EAAoB,OAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AACtC,UAAM2B,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW;AAEX,UAAM;AAAEG,MAAAA,IAAI,EAAEgJ;AAAR,QAAyB,MAAML,UAAU,CAACM,IAAX,CAClCmC,mBADkC,CACd;AACnBC,MAAAA,QAAQ,EAAExL,IAAI,CAAC1B,QAAL,CAAc8B;AADL,KADc,EAIlCkJ,KAJkC,CAI3BC,GAAD,IAAS;AACd,aAAO;AAAEnG,QAAAA,MAAM,EAAEmG,GAAG,CAACnG,MAAd;AAAsBjD,QAAAA,IAAI,EAAE3B;AAA5B,OAAP;AACD,KANkC,CAArC;;AAQA,QAAI,CAAC2K,YAAL,EAAmB;AACjB,aAAO9K,GAAG,CAACoB,IAAJ,CACLK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,0CACGnB,OAAO,CAACC,GAAR,CAAYgB,eADf,EACgC,GADhC,EAEG,uCAFH,eAGEE;AACE,QAAA,IAAI,EAAG,oCAAmCnB,OAAO,CAACC,GAAR,CAAYgB,eAAgB;AADxE,gCAHF,EAOO,GAPP,mBADF,CADkB,CADf,CAAP;AAgBD;;AAED,WAAOyB,GAAG,CAACoB,IAAJ,CACLK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,0CAAMnB,OAAO,CAACC,GAAR,CAAYgB,eAAlB,gCADF,CADkB,CADf,CAAP;AAOD,GAtCD;AAuCD;;ACvEc,eAAe6O,SAAf,CACbC,GADa,EAEbC,SAFa,EAMb;AAAEhF,EAAAA;AAAF,CANa,EAOE;AACf,QAAM5H,MAAM,GAAG4M,SAAS,CAAC,MAAD,CAAxB;AACA,QAAM7C,UAAU,GAAG,MAAM4C,GAAG,CAACrP,IAAJ,EAAzB;AAEA0C,EAAAA,MAAM,CAAC6M,GAAP,CAAWC,qBAAY,EAAvB;AAEAxP,EAAAA,IAAI,CAAC0C,MAAD,CAAJ;AACA0L,EAAAA,UAAU,CAAC1L,MAAD,EAAS+J,UAAT,CAAV;AACAnI,EAAAA,IAAI,CAAC5B,MAAD,CAAJ;AACA8J,EAAAA,WAAW,CAAC9J,MAAD,EAAS+J,UAAT,EAAqBnC,WAArB,CAAX;AACA0E,EAAAA,YAAY,CAACtM,MAAD,EAAS+J,UAAT,EAAqBnC,WAArB,CAAZ;AACD;;AC3BM,MAAMmF,aAAa,GAAIC,OAAvB;AAIA,MAAMC,eAAe,GAAM3N,GAAD,IAAcA,GAAG,KAAK,IAAhD;;ACSA,MAAM4N,kBAAkB,GAAG,OAChC;AAAEtF,EAAAA;AAAF,CADgC,EAEhCQ,MAFgC,EAGhCC,cAHgC,EAIhC8E,WAJgC,KAKR;AAAA;;AACxB,UAAQA,WAAW,CAAC/D,IAApB;AACE,SAAK,cAAL;AAAqB;AACnB,YAAIlH,GAAG,GAAG,MAAM0F,WAAW,CAAC/F,IAAZ,CAAiBsI,SAAjB,CAA2BgD,WAAW,CAAC/P,EAAvC,CAAhB;AACA,oBAAI8E,GAAJ,iCAAI,KAAKmG,cAAT,EAAyB,OAAOnG,GAAP,CAFN;;AAKnBA,QAAAA,GAAG,GAAG,MAAMiG,OAAO,CAACP,WAAD,EAAcQ,MAAd,EAAsBC,cAAtB,EAAsC8E,WAAtC,CAAnB;AACA,cAAM3D,SAAS,CAAC5B,WAAD,EAAcQ,MAAd,EAAsB+E,WAAtB,CAAf;AACA,eAAOjL,GAAP;AACD;;AAED,SAAK,MAAL;AAAa;AACX,YAAIjB,IAAI,GAAG,MAAM2G,WAAW,CAAC1G,KAAZ,CAAkBiJ,SAAlB,CAA4BgD,WAAW,CAAC/P,EAAxC,CAAjB;AACA,qBAAI6D,IAAJ,kCAAI,MAAMoH,cAAV,EAA0B,OAAOpH,IAAP;AAE1BA,QAAAA,IAAI,GAAG,MAAMmL,QAAQ,CAACxE,WAAD,EAAcQ,MAAd,EAAsBC,cAAtB,EAAsC8E,WAAtC,CAArB;AACA,eAAOlM,IAAP;AACD;;AAED;AACE,YAAM,IAAIlE,KAAJ,CAAW,8BAA6BoQ,WAAW,CAAC/D,IAAK,EAAzD,CAAN;AApBJ;AAsBD,CA5BM;;ACXA,MAAMgE,OAAO,GAClBnD,CADqB,IAELS,MAAM,CAAC2C,IAAP,CAAYpD,CAAZ,CAFX;AAIP,MAAMqD,UAAU,GAAGC,yBAAgB,EAAnC;AAEO,MAAMC,2BAA2B,GACtCpH,WADyC,IAE9B;AACX,MAAI,CAACA,WAAL,EAAkB,OAAO,EAAP;;AAClB,MAAIA,WAAW,CAACqH,UAAZ,CAAuB,GAAvB,CAAJ,EAAiC;AAC/B,UAAM,GAAGC,KAAH,IAAY,WAAWC,IAAX,CAAgBvH,WAAhB,KAAgC,EAAlD;AACA,WAAOsH,KAAK,IAAI,EAAhB;AACD;;AACD,QAAMnJ,KAAK,GAAG+I,UAAU,CAACK,IAAX,CAAgBvH,WAAhB,CAAd;AACA,MAAI7B,KAAK,IAAI6B,WAAW,CAACqH,UAAZ,CAAuBlJ,KAAK,CAAC,CAAD,CAA5B,CAAb,EAA+C,OAAOA,KAAK,CAAC,CAAD,CAAZ;AAC/C,SAAO,EAAP;AACD,CAXM;;ACNA,MAAMqJ,aAAa,GAAG,OAAkB;AAC7CC,EAAAA,OAAO,EAAE,MAAc,EADsB;AAE7CC,EAAAA,WAAW,EAAE,MAAqBnF,OAAO,CAACoF,OAAR,CAAgB,IAAhB,CAFW;AAG7CC,EAAAA,aAAa,EAAE,MAAqBrF,OAAO,CAACoF,OAAR,CAAgB,IAAhB,CAHS;AAI7CE,EAAAA,aAAa,EAAE,MAA0BtF,OAAO,CAACoF,OAAR,CAAgBtO,SAAhB,CAJI;AAK7CyO,EAAAA,WAAW,EAAE,MAA0BvF,OAAO,CAACoF,OAAR,CAAgBtO,SAAhB,CALM;AAM7C0O,EAAAA,UAAU,EAAE,MAAY1O;AANqB,CAAlB,CAAtB;;ACYA,MAAM2O,aAAa,GAAG,OAC3B;AAAExG,EAAAA,WAAF;AAAeyG,EAAAA;AAAf,CAD2B,EAE3BC,OAF2B,EAG3BnM,MAH2B,EAI3BoM,OAJ2B,KAKJ;AACvB,QAAMzC,KAAK,GAAGwC,OAAO,CAACE,OAAR,CAAgB9C,UAAhB,CAA2BI,KAAzC;AACA,QAAM2C,UAAU,GAAG,gBAAgBF,OAAhB,IAA2BA,OAAO,CAACE,UAAtD;;AAEA,MAAI,CAACA,UAAL,EAAiB;AACf,WAAOb,aAAa,EAApB;AACD;;AAED,QAAMc,uBAAuB,GAAGtB,OAAO,CAACjL,MAAM,CAACY,MAAR,CAAP,CAAuB4L,MAAvB,CAE7B,CAACC,GAAD,EAAMC,SAAN,KAAoB;AACrBnE,IAAAA,MAAM,CAACoE,MAAP,CAAcF,GAAd,EAAmBzM,MAAM,CAACY,MAAP,CAAc8L,SAAd,CAAnB;AACA,WAAOD,GAAP;AACD,GAL+B,EAK7B,EAL6B,CAAhC;AAOA,QAAMG,WAAW,GAAGrE,MAAM,CAACsE,MAAP,CAAcN,uBAAd,CAApB;AACA,QAAMO,WAAW,GAAG,IAAIC,gBAAJ,CAAcT,UAAd,CAApB;AAEA,QAAMU,WAAW,GAAG,MAAMvH,WAAW,CAACuB,UAAZ,CAAuBiG,OAAvB,CAA+B;AACvD,cAAUb,OAAO,CAAC/F;AADqC,GAA/B,CAA1B;AAIA,QAAM6G,OAA6C,GAAG,EAAtD;AACA,QAAMC,iBAA2B,GAAG,EAApC;AAEA5E,EAAAA,MAAM,CAACC,OAAP,CAAe+D,uBAAf,EAAwCa,OAAxC,CAAgD,CAAC,CAAClO,KAAD,EAAQmO,KAAR,CAAD,KAAoB;AAAA;;AAClE,UAAMvG,MAAM,GAAGkG,WAAW,CAACnF,IAAZ,CAAkByF,CAAD,IAAOA,CAAC,CAACxO,IAAF,CAAOI,KAAP,KAAiBA,KAAzC,CAAf;;AACA,QAAI4H,MAAJ,aAAIA,MAAJ,gCAAIA,MAAM,CAAEyG,KAAZ,0CAAI,cAAetS,EAAnB,EAAuB;AACrBkS,MAAAA,iBAAiB,CAACpG,IAAlB,CAAuBsG,KAAvB;AACAH,MAAAA,OAAO,CAACnG,IAAR,CAAa,CAACsG,KAAD,EAAQ;AAAEvG,QAAAA,MAAM,EAAE;AAAE7L,UAAAA,EAAE,EAAE6L,MAAM,CAACyG,KAAP,CAAatS;AAAnB,SAAV;AAAmCuS,QAAAA,EAAE,EAAElQ;AAAvC,OAAR,CAAb;AACD;AACF,GAND;;AAQA,MAAI6P,iBAAiB,CAACvD,MAAlB,KAA6BgD,WAAW,CAAChD,MAA7C,EAAqD;AACnD,UAAM6D,aAAa,GAAGb,WAAW,CAACc,MAAZ,CACnBL,KAAD,IAAW,CAACF,iBAAiB,CAACQ,QAAlB,CAA2BN,KAA3B,CADQ,CAAtB;AAIA,UAAMO,qBAAqB,GAAG,IAAI7I,GAAJ,CAC5BwD,MAAM,CAACC,OAAP,CAAe+D,uBAAf,EAAwCzM,GAAxC,CAA4C,CAAC,CAACZ,KAAD,EAAQmO,KAAR,CAAD;AAAA;;AAAA,aAAoB,CAC9DA,KAD8D,uBAE9DL,WAAW,CAACnF,IAAZ,CAAkByF,CAAD,IAAOA,CAAC,CAACxO,IAAF,CAAOI,KAAP,KAAiBA,KAAzC,CAF8D,sDAE9D,kBAAiDmH,GAFa,CAApB;AAAA,KAA5C,CAD4B,CAA9B;AAOA,UAAMyG,WAAW,CAACpG,QAAZ,CAAqB,YAArB,EAAmC,EAAnC,EAAwCmH,IAAD,IAAe;AAC1DA,MAAAA,IAAI,CAACX,OAAL,CAAaE,OAAb,CAAsBtG,MAAD,IAAiB;AAAA;;AACpC,cAAMuG,KAAK,sBAAGvG,MAAM,CAACgH,OAAV,oDAAG,gBAAgBT,KAA9B;;AACA,YAAIA,KAAK,IAAII,aAAa,CAACE,QAAd,CAAuBN,KAAvB,CAAb,EAA4C;AAC1CH,UAAAA,OAAO,CAACnG,IAAR,CAAa,CAACsG,KAAD,EAAQ;AAAEvG,YAAAA,MAAF;AAAU0G,YAAAA,EAAE,EAAElQ;AAAd,WAAR,CAAb;;AACA,cAAIsQ,qBAAqB,CAACG,GAAtB,CAA0BV,KAA1B,CAAJ,EAAsC;AACpC5H,YAAAA,WAAW,CAACuB,UAAZ,CAAuBgH,iBAAvB,CACE;AACE3H,cAAAA,GAAG,EAAEuH,qBAAqB,CAAC9P,GAAtB,CAA0BuP,KAA1B;AADP,aADF,EAIE;AAAEpE,cAAAA,IAAI,EAAE;AAAEsE,gBAAAA,KAAK,EAAE;AAAEtS,kBAAAA,EAAE,EAAE6L,MAAM,CAAC7L;AAAb;AAAT;AAAR,aAJF;AAMD;AACF;AACF,OAbD;AAcA,aAAO,KAAP;AACD,KAhBK,CAAN;AAiBD;;AAED,OAAK,MAAM,GAAG6D,IAAH,CAAX,IAAuBoO,OAAvB,EAAgC;AAC9B,QAAI;AACF,YAAMM,EAAO,GAAG,MAAMV,WAAW,CAACmB,aAAZ,CAA0BC,IAA1B,CAA+B;AACnDnP,QAAAA,KAAK,EAAED,IAAI,CAACgI,MAAL,CAAY7L;AADgC,OAA/B,CAAtB;AAGA6D,MAAAA,IAAI,CAAC0O,EAAL,GAAUA,EAAE,CAACW,OAAb;AACD,KALD,CAKE,OAAO9F,GAAP,EAAY;AACZ+F,MAAAA,OAAO,CAAC9P,KAAR,CAAc+J,GAAd;AACD;AACF;;AAED,QAAMgG,UAAU,GAAG,IAAItJ,GAAJ,CAAQmI,OAAR,CAAnB;;AAEA,QAAMoB,sBAAsB,GAAIC,WAAD,IAAyB;AACtD,UAAMlB,KAAK,GAAGd,uBAAuB,CAACgC,WAAD,CAArC;AACA,QAAI,CAAClB,KAAL,EAAY,OAAO,IAAP;AACZ,WAAOgB,UAAU,CAACvQ,GAAX,CAAeuP,KAAf,CAAP;AACD,GAJD;;AAMA,SAAO;AACL3B,IAAAA,OAAO,EAAG6C,WAAD,IAAiC;AACxC,YAAMzP,IAAI,GAAGwP,sBAAsB,CAACC,WAAD,CAAnC;AACA,UAAI,CAACzP,IAAL,EAAW,OAAOyP,WAAP;AACX,aAAQ,KAAIzP,IAAI,CAACgI,MAAL,CAAY7L,EAAG,GAA3B;AACD,KALI;AAML0Q,IAAAA,WAAW,EAAE,OACX6C,QADW,EAEXC,QAFW,EAGXF,WAHW,EAIXG,OAJW,KAKyB;AACpCvC,MAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,qBAAlB,EAAyC;AACvCJ,QAAAA,QADuC;AAEvCD,QAAAA,WAFuC;AAGvCG,QAAAA;AAHuC,OAAzC;AAKA,UAAIjU,OAAO,CAACC,GAAR,CAAYmU,OAAZ,IAAuBpU,OAAO,CAACC,GAAR,CAAYmU,OAAZ,KAAwB,OAAnD,EAA4D,OAAO,IAAP;AAE5D,YAAMhJ,cAAc,GAAG,MAAML,iBAAiB,CAC5CC,WAD4C,EAE5CkE,KAAK,CAACzK,KAFsC,EAG5CyK,KAAK,CAAC1O,EAHsC,EAI5CwT,QAJ4C,CAA9C;AAOA,UAAI,CAAC5I,cAAc,CAAC2I,QAAD,CAAnB,EAA+B,OAAO,IAAP;AAE/B,YAAM1P,IAAI,GAAGwP,sBAAsB,CAACC,WAAD,CAAnC;AACA,UAAI,CAACzP,IAAD,IAAS,CAACA,IAAI,CAAC0O,EAAnB,EAAuB,OAAO,IAAP;AACvB,YAAM9O,MAAM,GAAG,MAAMoO,WAAW,CAACgC,IAAZ,CAAiBnD,WAAjB,CAA6B;AAChDrB,QAAAA,QAAQ,EAAE7P,OAAO,CAACC,GAAR,CAAYgB,eAD0B;AAEhDyS,QAAAA,OAAO,EAAErP,IAAI,CAAC0O,EAAL,CAAQvS,EAF+B;AAGhD8T,QAAAA,IAAI,EAAEL,OAAO,CAACK,IAHkC;AAIhDC,QAAAA,MAAM,EAAEN,OAAO,CAACM,MAJgC;AAKhDC,QAAAA,WAAW,EAAEP,OAAO,CAACQ,eAAR,GACT,CAAC;AAAEF,UAAAA,MAAM,EAAEN,OAAO,CAACQ;AAAlB,SAAD,CADS,GAET5R,SAP4C;AAQhD6R,QAAAA,SAAS,EAAET,OAAO,CAACU;AAR6B,OAA7B,CAArB;AAUA,UAAI,CAAC1Q,MAAM,CAAC2Q,EAAZ,EAAgB,OAAO,IAAP;AAChB,aAAO;AAAED,QAAAA,EAAE,EAAE1Q,MAAM,CAAC0Q,EAAb;AAA2BjB,QAAAA,OAAO,EAAEzP,MAAM,CAACyP;AAA3C,OAAP;AACD,KA1CI;AA2CLtC,IAAAA,aAAa,EAAE,OACbuD,EADa,EAEbjB,OAFa,EAGbO,OAHa,KAIuB;AACpCvC,MAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,uBAAlB,EAA2C;AAAEQ,QAAAA,EAAF;AAAMjB,QAAAA,OAAN;AAAeO,QAAAA;AAAf,OAA3C;AACA,UAAIjU,OAAO,CAACC,GAAR,CAAYmU,OAAZ,IAAuBpU,OAAO,CAACC,GAAR,CAAYmU,OAAZ,KAAwB,OAAnD,EAA4D,OAAO,IAAP;AAE5D,YAAMnQ,MAAM,GAAG,MAAMoO,WAAW,CAACgC,IAAZ,CAAiBQ,MAAjB,CAAwB;AAC3CF,QAAAA,EAD2C;AAE3CjB,QAAAA,OAF2C;AAG3CY,QAAAA,IAAI,EAAEL,OAAO,CAACK,IAH6B;AAI3CC,QAAAA,MAAM,EAAEN,OAAO,CAACM,MAJ2B;AAK3CC,QAAAA,WAAW,EAAEP,OAAO,CAACQ,eAAR,GACT,CAAC;AAAEF,UAAAA,MAAM,EAAEN,OAAO,CAACQ;AAAlB,SAAD,CADS,GAET5R;AAPuC,OAAxB,CAArB;AASA,UAAI,CAACoB,MAAM,CAAC2Q,EAAZ,EAAgB,OAAO,IAAP;AAChB,aAAO;AAAED,QAAAA,EAAE,EAAE1Q,MAAM,CAAC0Q,EAAb;AAA2BjB,QAAAA,OAAO,EAAEzP,MAAM,CAACyP;AAA3C,OAAP;AACD,KA9DI;AA+DLrC,IAAAA,aAAa,EAAE,OAAOsD,EAAP,EAAmBjB,OAAnB,KAAsD;AACnEhC,MAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,uBAAlB,EAA2C;AAAEQ,QAAAA,EAAF;AAAMjB,QAAAA;AAAN,OAA3C;AACA,YAAMrB,WAAW,CAACgC,IAAZ,CAAiBS,MAAjB,CAAwB;AAC5BH,QAAAA,EAD4B;AAE5BjB,QAAAA;AAF4B,OAAxB,CAAN;AAID,KArEI;AAsELpC,IAAAA,WAAW,EAAE,OACXqD,EADW,EAEXjB,OAFW,EAGX/M,IAHW,KAIO;AAClB+K,MAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,qBAAlB,EAAyC;AAAEQ,QAAAA,EAAF;AAAMjB,QAAAA,OAAN;AAAe/M,QAAAA;AAAf,OAAzC;AACA,YAAM0L,WAAW,CAAC0C,SAAZ,CAAsBC,GAAtB,CAA0B;AAC9BC,QAAAA,SAAS,EAAEN,EADmB;AAE9BjB,QAAAA,OAF8B;AAG9B/M,QAAAA;AAH8B,OAA1B,CAAN;AAKD,KAjFI;AAmFL4K,IAAAA,UAAU,EAAGuC,WAAD,IAA+B;AACzCpC,MAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,mBAAlB,EAAuC;AAAEL,QAAAA;AAAF,OAAvC;AACA,YAAMzP,IAAI,GAAGwP,sBAAsB,CAACC,WAAD,CAAnC;AACA,UAAI,CAACzP,IAAD,IAAS,CAACA,IAAI,CAACgI,MAAnB,EAA2B;AAE3BoF,MAAAA,SAAS,CAACyD,oBAAV,CAA+BxD,OAAO,CAACyD,OAAvC,EAAgD9C,WAAhD,EAA6D;AAC3DhO,QAAAA,IAAI,EAAE;AAAE7D,UAAAA,EAAE,EAAE,IAAN;AAAYiE,UAAAA,KAAK,EAAEqP;AAAnB,SADqD;AAE3DxO,QAAAA,GAAG,EAAE;AAAE9E,UAAAA,EAAE,EAAEmR,OAAO,CAAC/F,GAAd;AAAmBnH,UAAAA,KAAK,EAAEkN,OAAO,CAAClN;AAAlC,SAFsD;AAG3DqO,QAAAA,KAAK,EAAE;AAAEtS,UAAAA,EAAE,EAAE6D,IAAI,CAACgI,MAAL,CAAY7L;AAAlB;AAHoD,OAA7D;AAKD;AA7FI,GAAP;AA+FD,CAvLM;;ACsBP,MAAM4U,kBAAkB,GAAG,OACzBC,UADyB,EAEzB3D,OAFyB,EAGzBnM,MAHyB,EAIzBgL,WAJyB,KAKG;AAC5B,QAAMoB,OAAO,GAAG,MAAMrB,kBAAkB,CACtC+E,UADsC,EAEtC3D,OAAO,CAACyD,OAF8B,EAGtCzD,OAAO,CAACE,OAAR,CAAgBpE,YAAhB,CAA6BhN,EAHS,EAItC+P,WAJsC,CAAxC;AAMA,QAAM+E,YAAY,GAAG9D,aAAa,CAAC6D,UAAD,EAAa3D,OAAb,EAAsBnM,MAAtB,EAA8BoM,OAA9B,CAAlC;AAEA,QAAM4D,kBAAkB,GAAG,IAAIjL,GAAJ,EAA3B;AACAkG,EAAAA,OAAO,CAACjL,MAAM,CAACY,MAAR,CAAP,CAAuBwM,OAAvB,CAAgCV,SAAD,IAAe;AAC5CnE,IAAAA,MAAM,CAAC2C,IAAP,CAAYlL,MAAM,CAACY,MAAP,CAAc8L,SAAd,CAAZ,EAAsCU,OAAtC,CAA+ClO,KAAD,IAAW;AACvD8Q,MAAAA,kBAAkB,CAACzK,GAAnB,CAAuBrG,KAAvB,EAA8BwN,SAA9B;AACD,KAFD;AAGD,GAJD;AAMA,QAAMuD,kBAAkB,GAAG,IAAIlL,GAAJ,EAA3B;AACAkG,EAAAA,OAAO,CAACjL,MAAM,CAACiB,KAAP,IAAgB,EAAjB,CAAP,CAA4BmM,OAA5B,CAAqC8C,QAAD,IAAc;AAC/ClQ,IAAAA,MAAM,CAACiB,KAAR,CAAmDiP,QAAnD,EAA6DpM,MAA7D,CAAoEsJ,OAApE,CACGlO,KAAD,IAAW;AACT,YAAM+B,KAAK,GAAGgP,kBAAkB,CAACnS,GAAnB,CAAuBoB,KAAvB,CAAd;;AACA,UAAI+B,KAAJ,EAAW;AACTA,QAAAA,KAAK,CAAC8F,IAAN,CAAWmJ,QAAX;AACD,OAFD,MAEO;AACLD,QAAAA,kBAAkB,CAAC1K,GAAnB,CAAuBrG,KAAvB,EAA8B,CAACgR,QAAD,CAA9B;AACD;AACF,KARH;AAUD,GAXD;;AAaA,QAAMC,iBAAiB,GAAIC,YAAD,IAAsC,CAC9D,GAAG,IAAIC,GAAJ,CACDD,YAAY,CACTtQ,GADH,CACQyO,WAAD,IAAiByB,kBAAkB,CAAClS,GAAnB,CAAuByQ,WAAvB,CADxB,EAEGb,MAFH,CAEU9C,aAFV,CADC,CAD2D,CAAhE;;AAQA,QAAM0F,MAAI,GAAGC,SAAI,EAAjB;AAEA,SAAO;AACLvQ,IAAAA,MADK;AAELoM,IAAAA,OAFK;AAGLoE,IAAAA,YAAY,EAAE;AACZvV,MAAAA,EAAE,EAAE+P,WAAW,CAAC/P,EADJ;AAEZiE,MAAAA,KAAK,EAAE8L,WAAW,CAAC9L,KAFP;AAGZ+H,MAAAA,IAAI,EAAE+D,WAAW,CAAC/D;AAHN,KAHT;AAQLwJ,IAAAA,WAAW,EAAEzF,WAAW,CAAC/D,IARpB;AASLqJ,IAAAA,IAAI,EAAGI,QAAD,IAAyD;AAC7D,aAAO,IAAIlK,OAAJ,CAAY,CAACoF,OAAD,EAAU+E,MAAV,KAAqB;AACtC,cAAMC,QAAQ,GAAG;AAAExE,UAAAA,OAAO,EAAEpB,WAAW,CAAC9L;AAAvB,SAAjB;AACAiN,QAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,2BAAjB,EAA8CD,QAA9C,EAFsC;;AAItCN,QAAAA,MAAI,CAAC,GAAD,EAAM,MAAOQ,qBAAP,IAAiC;AACzC,gBAAMC,OAAO,GAAGD,qBAAqB,CAAC,MAAM,EAAP,CAArC;AACA3E,UAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,6BAAjB,EAAgDD,QAAhD;;AACA,cAAI;AACF,kBAAMF,QAAQ,EAAd;AACD,WAFD,CAEE,OAAOrI,GAAP,EAAY;AACZ8D,YAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,oCAAjB,EAAuDD,QAAvD;AACAG,YAAAA,OAAO;AACPJ,YAAAA,MAAM,CAACtI,GAAD,CAAN;AACA;AACD;;AACD8D,UAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,uBAAjB,EAA0CD,QAA1C;AACAG,UAAAA,OAAO;AACPnF,UAAAA,OAAO;AACR,SAdG,CAAJ;AAeD,OAnBM,CAAP;AAoBD,KA9BI;AA+BLoF,IAAAA,gBAAgB,EAAGzC,WAAD,IAChByB,kBAAkB,CAAClS,GAAnB,CAAuByQ,WAAvB,CAhCG;AAiCL4B,IAAAA,iBAjCK;AAmCLc,IAAAA,gBAAgB,EAAG1C,WAAD,IAChB0B,kBAAkB,CAACnS,GAAnB,CAAuByQ,WAAvB,KAAuC,EApCpC;AAsCL2C,IAAAA,iBAAiB,EAAE,CACjBC,aADiB,EAEjBC,kBAFiB,EAGjB;AAAEC,MAAAA,qBAAF;AAAyBC,MAAAA;AAAzB,KAHiB,KAIL;AACZ,UAAI,CAACH,aAAL,EAAoB,OAAO,KAAP;AAEpB,YAAMI,uBAAuB,GAAGpB,iBAAiB,CAC/CiB,kBAAkB,CAACtR,GAAnB,CAAwB0R,OAAD,IAAaA,OAAO,CAACtS,KAA5C,CAD+C,CAAjD,CAHY;;AAQZ,UACEmS,qBAAqB,IACrBE,uBAAuB,CAAC5D,QAAxB,CAAiCwD,aAAjC,CAFF,EAGE;AACA,eAAO,IAAP;AACD,OAbW;;;AAgBZ,UAAInR,MAAM,CAACgB,aAAP,IAAwBsQ,qBAA5B,EAAmD;AACjD,cAAMtQ,aAAa,GAAGhB,MAAM,CAACgB,aAA7B;AACA,eAAOuQ,uBAAuB,CAACE,IAAxB,CAA8BC,KAAD,IAClC1Q,aAAa,CAACmQ,aAAD,CAAb,CAA6BxD,QAA7B,CAAsC+D,KAAtC,CADK,CAAP;AAGD;;AAED,aAAO,KAAP;AACD,KAlEI;AAoELnE,IAAAA,KAAK,EAAE,MAAMwC;AApER,GAAP;AAsED,CAnHD;;AAqHA,MAAM4B,sBAAsB,GAAG,IAAI5M,GAAJ,EAA/B;AACA,MAAM6M,eAAe,GAAG,IAAI7M,GAAJ,EAAxB;AAEO,MAAM8M,oBAAoB,GAAG,CAClC/B,UADkC,EAElC3D,OAFkC,EAGlCnM,MAHkC,EAIlCgL,WAJkC,KAKN;AAC5B,QAAM8G,sBAAsB,GAAGF,eAAe,CAAC9T,GAAhB,CAAoBkN,WAAW,CAAC9L,KAAhC,CAA/B;AACA,MAAI4S,sBAAJ,EAA4B,OAAOA,sBAAP;AAE5B,QAAMC,eAAe,GAAGJ,sBAAsB,CAAC7T,GAAvB,CAA2BkN,WAAW,CAAC9L,KAAvC,CAAxB;AACA,MAAI6S,eAAJ,EAAqB,OAAOvL,OAAO,CAACoF,OAAR,CAAgBmG,eAAhB,CAAP;AAErB,QAAMC,OAAO,GAAGnC,kBAAkB,CAACC,UAAD,EAAa3D,OAAb,EAAsBnM,MAAtB,EAA8BgL,WAA9B,CAAlC;AACA2G,EAAAA,sBAAsB,CAACpM,GAAvB,CAA2ByF,WAAW,CAAC9L,KAAvC,EAA8C8S,OAA9C;AAEA,SAAOA,OAAO,CAACC,IAAR,CAAcC,cAAD,IAAoB;AACtCP,IAAAA,sBAAsB,CAACpC,MAAvB,CAA8BvE,WAAW,CAAC9L,KAA1C;AACA0S,IAAAA,eAAe,CAACrM,GAAhB,CAAoByF,WAAW,CAAC9L,KAAhC,EAAuCgT,cAAvC;AACA,WAAOA,cAAP;AACD,GAJM,CAAP;AAKD,CApBM;;ACjJA,MAAMC,gBAAgB,GAAG,OAG9BrC,UAH8B,EAI9B3D,OAJ8B,EAK9BuE,QAL8B,KAMZ;AAClB,QAAM3Q,GAAG,GAAGoM,OAAO,CAACE,OAAR,CAAgB+F,YAA5B;AACA,MAAI,CAACrS,GAAL,EAAU;AACV,QAAMC,MAAM,GAAG0E,cAAc,CAAC3E,GAAG,CAACb,KAAL,CAAd,IAA6BgG,QAA5C;AACA,QAAMgN,cAAc,GAAG,MAAML,oBAAoB,CAC/C/B,UAD+C,EAE/C3D,OAF+C,EAG/CnM,MAH+C,EAI/C,EAAE,GAAGD,GAAL;AAAUkH,IAAAA,IAAI,EAAE;AAAhB,GAJ+C,CAAjD;AAMA,MAAI,CAACiL,cAAL,EAAqB;AAErB,SAAOA,cAAc,CAAC5B,IAAf,CAAoB,YAAY;AACrC,UAAMI,QAAQ,CAACvE,OAAD,EAAU+F,cAAV,CAAd;AACD,GAFM,CAAP;AAGD,CArBM;AAuBA,MAAMG,sBAAsB,GAAG,CAGpCvC,UAHoC,EAIpCY,QAJoC,KAKhCvE,OAAD,IAAyB;AAC5B,SAAOgG,gBAAgB,CAACrC,UAAD,EAAa3D,OAAb,EAAsBuE,QAAtB,CAAvB;AACD,CAPM;;AC1BA,MAAM4B,OAAsB,GAAG,CACpC,eADoC,EAEpC,qBAFoC,EAGpC,WAHoC,EAIpC,kBAJoC,CAA/B;AAMA,MAAMC,cAGV,GAAGD,OAAO,CAACxS,GAAR,CAAa0S,MAAD,KAAa;AAC7B/J,EAAAA,GAAG,EAAE+J,MADwB;AAE7BC,EAAAA,MAAM,EAAE,IAAIC,MAAJ,CAAY,mCAAkCF,MAAO,MAArD;AAFqB,CAAb,CAAZ,CAHC;AAQA,MAAMG,aAAoD,GAAG,CAClE;AAAElK,EAAAA,GAAG,EAAE,eAAP;AAAwBmK,EAAAA,KAAK,EAAE;AAA/B,CADkE,EAElE;AACEnK,EAAAA,GAAG,EAAE,qBADP;AAEEmK,EAAAA,KAAK,EAAE;AAFT,CAFkE,EAMlE;AACEnK,EAAAA,GAAG,EAAE,WADP;AAEEmK,EAAAA,KAAK,EACH;AAHJ,CANkE,EAWlE;AACEnK,EAAAA,GAAG,EAAE,kBADP;AAEEmK,EAAAA,KAAK,EAAE;AAFT,CAXkE,CAA7D;;ACjBA,MAAMC,YAAY,GAAG,CAC1BC,OAD0B,EAE1BC,cAF0B,KAGd;AACZ,SAAOR,cAAc,CAAC/F,MAAf,CAA2B,CAACC,GAAD,EAAM;AAAEhE,IAAAA,GAAF;AAAOgK,IAAAA;AAAP,GAAN,KAA0B;AAC1D,UAAMrQ,KAAK,GAAGqQ,MAAM,CAACjH,IAAP,CAAYsH,OAAZ,CAAd;AACArG,IAAAA,GAAG,CAAChE,GAAD,CAAH,GAAW,CAACrG,KAAD,GACP2Q,cAAc,CAACtK,GAAD,CAAd,IAAuB,KADhB,GAEPrG,KAAK,CAAC,CAAD,CAAL,KAAa,GAAb,IAAoBA,KAAK,CAAC,CAAD,CAAL,KAAa,GAFrC;AAGA,WAAOqK,GAAP;AACD,GANM,EAMJ,EANI,CAAP;AAOD,CAXM;AAaA,MAAMuG,gBAAgB,GAAIF,OAAD,IAA6B;AAC3D,QAAMG,WAAW,GAAGH,OAAO,CAACI,OAAR,CAClB,6CADkB,EAElB,IAFkB,CAApB;;AAKA,MAAID,WAAW,KAAKH,OAApB,EAA6B;AAC3B,WAAO,EAAP;AACD,GAFD,MAEO;AACL,WAAOG,WAAW,CAACE,IAAZ,EAAP;AACD;AACF,CAXM;AAkBA,MAAMC,SAAS,GAAG,CACvBN,OADuB,EAEvBC,cAFuB,KAGR;AACf,SAAO;AACLT,IAAAA,OAAO,EAAEO,YAAY,CAACC,OAAD,EAAUC,cAAV,CADhB;AAELE,IAAAA,WAAW,EAAED,gBAAgB,CAACF,OAAD;AAFxB,GAAP;AAID,CARM;;ACjCQ,SAASO,YAAT,CACbC,QADa,EAEbV,KAFa,EAGJ;AACT,MAAI,CAACA,KAAL,EAAY,OAAO,KAAP;AACZ,SAAOU,QAAQ,CAAC7B,IAAT,CAAe8B,CAAD,IAAgBA,CAAC,CAACtY,EAAF,KAAS2X,KAAK,CAAC3X,EAA7C,CAAP;AACD;;ACGD,MAAMuY,uBAAuB,GAAG,OAC9BC,EAD8B,EAE9BtH,OAF8B,KAGT;AACrB,QAAMuH,MAAM,GAAG,MAAMvH,OAAO,CAACyD,OAAR,CAAgB8D,MAAhB,CAAuBC,UAAvB,CACnBxH,OAAO,CAACzC,IAAR,CAAa;AACXkK,IAAAA,GAAG,EAAEH,EAAE,CAACI,IAAH,CAAQC,GADF;AAEXrK,IAAAA,QAAQ,EAAE;AAFC,GAAb,CADmB,CAArB;AAOA,QAAMsK,YAAY,GAAGL,MAAM,CAACzU,IAAP,CAAY+U,UAAZ,CAAuBtG,MAAvB,CAClBuG,KAAD,IAAWA,KAAK,CAACC,UAAN,KAAqB,SADb,CAArB;;AAIA,MAAIH,YAAY,CAACnK,MAAb,GAAsB,CAA1B,EAA6B;AAC3BuC,IAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAkB,2CAA0C4C,EAAE,CAACxY,EAAG,EAAlE,EAAqE;AACnEyY,MAAAA,MAAM,EAAEK,YAAY,CAACjU,GAAb,CAAkBmU,KAAD,IAAWA,KAAK,CAAC7S,IAAlC;AAD2D,KAArE;AAGA,WAAO,IAAP;AACD;;AAED,QAAM+S,cAAc,GAAG,MAAMhI,OAAO,CAACyD,OAAR,CAAgBpG,KAAhB,CAAsB4K,uBAAtB,CAC3BjI,OAAO,CAACzC,IAAR,CAAa;AACXkK,IAAAA,GAAG,EAAEH,EAAE,CAACI,IAAH,CAAQC,GADF;AAEXrK,IAAAA,QAAQ,EAAE;AAFC,GAAb,CAD2B,CAA7B;;AAOA,MAAI0K,cAAc,CAAClV,IAAf,CAAoBoV,KAApB,KAA8B,SAAlC,EAA6C;AAC3C,UAAMC,cAAc,GAAGH,cAAc,CAAClV,IAAf,CAAoBsV,QAApB,CAA6B7G,MAA7B,CACpBxL,MAAD,IAAYA,MAAM,CAACmS,KAAP,KAAiB,SAAjB,IAA8BnS,MAAM,CAACmS,KAAP,KAAiB,OADtC,CAAvB;AAIAlI,IAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAkB,4CAA2C4C,EAAE,CAACxY,EAAG,EAAnE,EAAsE;AACpEsZ,MAAAA,QAAQ,EAAED,cAAc,CAACxU,GAAf,CAAoBoC,MAAD,IAAYA,MAAM,CAACiK,OAAtC;AAD0D,KAAtE;AAIA,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD,CA1CD;;AA4CO,MAAMqI,mBAAmB,GAAG,OACjCC,WADiC,EAEjCtI,OAFiC,EAGjCuI,WAHiC,EAIjCC,mBAJiC,EAKjCrB,QAA2B,GAAGmB,WAAW,CAACvT,MALT,KAMZ;AACrB,MAAIyT,mBAAmB,KAAK,IAA5B,EAAkC,OAAO,KAAP;AAElC,QAAMC,cAAc,GAAGF,WAAW,CAACxT,MAAZ,CAAmB,iBAAnB,CAAvB;;AAEA,MAAI,CAACmS,YAAY,CAACC,QAAD,EAAWsB,cAAX,CAAjB,EAA6C;AAC3CF,IAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,oBAHF;AAKA,WAAO,KAAP;AACD;;AAED,QAAMC,YAAY,GAAGN,WAAW,CAACZ,IAAZ,CAAiBD,GAAjB,CAAqBtI,UAArB,CAAgC,WAAhC,CAArB;;AAEA,QAAM0J,uBAAuB,GAAG,OAAO;AACrC/Z,IAAAA,EAAE,EAAEwZ,WAAW,CAACxZ,EADqB;AAErC6Z,IAAAA,MAAM,EAAEL,WAAW,CAACK,MAFiB;AAGrCG,IAAAA,MAAM,EAAER,WAAW,CAACZ,IAAZ,CAAiBD;AAHY,GAAP,CAAhC;;AAMA,MAAIa,WAAW,CAACJ,KAAZ,KAAsB,MAA1B,EAAkC;AAChCK,IAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,kBAHF;AAKD;;AAED,QAAMI,MAAM,GAAG,CACbjO,IADa,EAEbkO,MAFa,KAGJ;AACT,UAAMC,YAAY,GAAGX,WAAW,CAACZ,IAAZ,CAAiBnK,IAAjB,CAAsB2L,SAA3C;AACAlJ,IAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAkB,cAAauE,YAAa,IAAGX,WAAW,CAACxZ,EAAG,IAAGgM,IAAK,EAAtE;AACAyN,IAAAA,WAAW,CAAC5E,UAAZ,CAAuBrK,WAAvB,CAAmC6P,aAAnC,CAAiDC,SAAjD,CAA2D;AACzDnJ,MAAAA,OAAO,EAAEsI,WAAW,CAAClE,YADoC;AAEzD4E,MAAAA,YAFyD;AAGzD3B,MAAAA,EAAE,EAAE;AACFxY,QAAAA,EAAE,EAAEwZ,WAAW,CAACxZ,EADd;AAEF6Z,QAAAA,MAAM,EAAEL,WAAW,CAACK,MAFlB;AAGFU,QAAAA,UAAU,EAAET,YAHV;AAIFU,QAAAA,cAAc,EAAEhB,WAAW,CAACiB;AAJ1B,OAHqD;AASzDzO,MAAAA,IATyD;AAUzDkO,MAAAA;AAVyD,KAA3D;AAYD,GAlBD;;AAoBA,MACET,WAAW,CAACiB,cAAZ,CAA2BrC,QAA3B,KACAoB,WAAW,CAACkB,kBAAZ,CAA+BtC,QAA/B,CAFF,EAGE;AACAoB,IAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,iBAHF;AAKA,WAAO,KAAP;AACD;;AAED,MAAIL,WAAW,CAACoB,mBAAZ,CAAgCjM,MAAhC,GAAyC,CAA7C,EAAgD;AAC9C8K,IAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,+BAHF;AAKA,WAAO,KAAP;AACD;;AAED,QAAMgB,QAAQ,GAAGpB,WAAW,CAACqB,gBAAZ,EAAjB;;AACA,MAAID,QAAQ,IAAIE,MAAM,CAACF,QAAQ,CAAChB,MAAV,CAAN,KAA4BkB,MAAM,CAACvB,WAAW,CAACK,MAAb,CAAlD,EAAwE;AACtE3I,IAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,mCAAjB,EAAsD;AACpDoF,MAAAA,IAAI,EAAExB,WAAW,CAACxZ,EADkC;AAEpDib,MAAAA,QAAQ,EAAEzB,WAAW,CAACK;AAF8B,KAAtD;AAIAJ,IAAAA,WAAW,CAACyB,kBAAZ,CAA+BnB,uBAAuB,EAAtD;AACA,WAAO,KAAP;AACD;;AAEDN,EAAAA,WAAW,CAAC0B,cAAZ,CAA2BpB,uBAAuB,EAAlD;;AAEA,MAAIP,WAAW,CAAC4B,SAAZ,IAAyB,IAA7B,EAAmC;AACjC,UAAMC,QAAQ,GAAG,MAAMnK,OAAO,CAACyD,OAAR,CAAgB2G,KAAhB,CAAsBzY,GAAtB,CACrBqO,OAAO,CAACzC,IAAR,CAAa;AACX8M,MAAAA,WAAW,EAAE/B,WAAW,CAACK;AADd,KAAb,CADqB,CAAvB;AAKAL,IAAAA,WAAW,GAAG6B,QAAQ,CAACrX,IAAvB;AACD;;AAED,MAAIwV,WAAW,CAACgC,MAAhB,EAAwB;AACtBvB,IAAAA,MAAM,CAAC,gBAAD,EAAmB,QAAnB,CAAN;AACAR,IAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,mBAHF;AAKA,WAAO,KAAP;AACD;;AAED3I,EAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CACG,eAAc4D,WAAW,CAACxZ,EAAG,MAAKwZ,WAAW,CAACK,MAAO,eAAcL,WAAW,CAAC4B,SAAU,UAAS5B,WAAW,CAACiB,eAAgB,EADjI,EAtGqB;;AA2GrB,MACE,EACEjB,WAAW,CAACiB,eAAZ,KAAgC,OAAhC,IACAjB,WAAW,CAACiB,eAAZ,KAAgC,WADhC,IAEAjB,WAAW,CAACiB,eAAZ,KAAgC,UAHlC,CADF,EAME;AACA,QACE,CAACjB,WAAW,CAACiB,eAAb,IACAjB,WAAW,CAACiB,eAAZ,KAAgC,SAFlC,EAGE;AACAR,MAAAA,MAAM,CAAC,yBAAD,EAA4B,YAA5B,CAAN,CADA;;AAGAR,MAAAA,WAAW,CAACgC,UAAZ,CAAuBvK,OAAvB,EAAgC6I,uBAAuB,EAAvD;AACA,aAAO,KAAP;AACD;;AAED,QAAID,YAAJ,EAAkB;AAChB,UACEN,WAAW,CAACiB,eAAZ,KAAgC,QAAhC,IACAjB,WAAW,CAACiB,eAAZ,KAAgC,OAFlC,EAGE;AACAR,QAAAA,MAAM,CAAC,iBAAD,EAAoB,MAApB,CAAN,CADA;;AAIA,YAAIT,WAAW,CAAC3L,IAAZ,CAAiB6E,QAAjB,CAA0B,uBAA1B,CAAJ,EAAwD;AACtD,cAAI8G,WAAW,CAAC3L,IAAZ,CAAiB6E,QAAjB,CAA0B,2BAA1B,CAAJ,EAA4D;AAC1D,mBAAO,KAAP;AACD;;AAED,gBAAMgJ,kBAAkB,GAAGlC,WAAW,CAAC3L,IAAZ,CAAiBoK,OAAjB,CACzB,2BADyB,EAEzB,2BAFyB,CAA3B;AAIA,gBAAM/G,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuBtH,MAAvB,CACJnD,OAAO,CAACzC,IAAR,CAAa;AACXmN,YAAAA,YAAY,EAAEpC,WAAW,CAACK,MADf;AAEXhM,YAAAA,IAAI,EAAE6N;AAFK,WAAb,CADI,CAAN;AAMD,SAfD,MAeO,IAAI,CAAClC,WAAW,CAAChZ,KAAZ,CAAkB6P,UAAlB,CAA6B,SAA7B,CAAL,EAA8C;AACnD,gBAAMa,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuBtH,MAAvB,CACJnD,OAAO,CAACzC,IAAR,CAAa;AACXmN,YAAAA,YAAY,EAAEpC,WAAW,CAACK,MADf;AAEXrZ,YAAAA,KAAK,EAAG,UAASgZ,WAAW,CAAChZ,KAAM;AAFxB,WAAb,CADI,CAAN;AAMD;;AACD,eAAO,KAAP;AACD;;AAED,UAAI,MAAM+X,uBAAuB,CAACiB,WAAD,EAActI,OAAd,CAAjC,EAAyD;AACvD+I,QAAAA,MAAM,CAAC,yBAAD,EAA4B,QAA5B,CAAN;AACAR,QAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,yBAHF;AAKA,eAAO,KAAP;AACD,OARD,MAQO,IAAIL,WAAW,CAACiB,eAAZ,KAAgC,SAApC,EAA+C;AACpDR,QAAAA,MAAM,CAAC,yBAAD,EAA4B,MAA5B,CAAN,CADoD;;AAGpD,eAAO,KAAP;AACD;;AAED/I,MAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CACG,yDAAwD4D,WAAW,CAACiB,eAAgB,EADvF;AAGA,aAAO,KAAP;AACD;;AAED,QAAIjB,WAAW,CAACiB,eAAZ,KAAgC,SAApC,EAA+C;AAC7C,UAAI,MAAMlC,uBAAuB,CAACiB,WAAD,EAActI,OAAd,CAAjC,EAAyD;AACvD+I,QAAAA,MAAM,CAAC,yBAAD,EAA4B,QAA5B,CAAN;AACAR,QAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,yBAHF;AAKA,eAAO,KAAP;AACD,OARD,MAQO;AACLI,QAAAA,MAAM,CAAC,yBAAD,EAA4B,MAA5B,CAAN,CADK;;AAGL,eAAO,KAAP;AACD;AACF;;AAED,QAAIT,WAAW,CAACiB,eAAZ,KAAgC,QAApC,EAA8C;AAC5CR,MAAAA,MAAM,CAAC,wBAAD,EAA2B,eAA3B,CAAN;AACA/I,MAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,uCAAjB,EAA0D;AACxDgD,QAAAA,IAAI,EAAEY,WAAW,CAACZ,IAAZ,CAAiBD,GADiC;AAExDkD,QAAAA,IAAI,EAAErC,WAAW,CAACqC,IAAZ,CAAiBlD;AAFiC,OAA1D;AAKA,YAAMzH,OAAO,CAACyD,OAAR,CAAgBpG,KAAhB,CAAsB3C,KAAtB,CAA4B;AAChC8C,QAAAA,KAAK,EAAE8K,WAAW,CAACZ,IAAZ,CAAiBnK,IAAjB,CAAsBC,KAAtB,CAA4BzK,KADH;AAEhCwK,QAAAA,IAAI,EAAE+K,WAAW,CAACZ,IAAZ,CAAiBnK,IAAjB,CAAsBtI,IAFI;AAGhCyS,QAAAA,IAAI,EAAEY,WAAW,CAACqC,IAAZ,CAAiBlD,GAHS;AAIhCkD,QAAAA,IAAI,EAAErC,WAAW,CAACZ,IAAZ,CAAiBD;AAJS,OAA5B,CAAN;AAOA,aAAO,KAAP;AACD;;AAEDsB,IAAAA,MAAM,CAAC,eAAD,EAAkB,QAAlB,CAAN;AACAR,IAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGG,mBAAkBL,WAAW,CAACiB,eAAgB,EAHjD;AAKAvJ,IAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CACG,yDAAwD4D,WAAW,CAACiB,eAAgB,EADvF;AAGA,WAAO,KAAP;AACD;;AAED,MAAI;AACFvJ,IAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAkB,iBAAgB4D,WAAW,CAACK,MAAO,EAArD;AAEA,UAAMiC,UAAU,GAAG3D,SAAS,CAC1BuB,mBAAmB,CAACqC,WADM,EAE1BtC,WAAW,CAAC1U,MAAZ,CAAmBI,gBAFO,CAA5B;AAIA,UAAMkS,OAAO,GAAG,CAAAyE,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU,CAAEzE,OAAZ,KAAuBoC,WAAW,CAAC1U,MAAZ,CAAmBI,gBAA1D;AAEA,UAAM6W,WAAW,GAAG,MAAM9K,OAAO,CAACyD,OAAR,CAAgB2G,KAAhB,CAAsB1P,KAAtB,CAA4B;AACpDqQ,MAAAA,YAAY,EAAE5E,OAAO,CAACjS,aAAR,GAAwB,OAAxB,GAAkC,QADI;AAEpDsJ,MAAAA,KAAK,EAAE8K,WAAW,CAACZ,IAAZ,CAAiBnK,IAAjB,CAAsBC,KAAtB,CAA4BzK,KAFiB;AAGpDwK,MAAAA,IAAI,EAAE+K,WAAW,CAACZ,IAAZ,CAAiBnK,IAAjB,CAAsBtI,IAHwB;AAIpDoV,MAAAA,WAAW,EAAE/B,WAAW,CAACK,MAJ2B;AAKpDqC,MAAAA,YAAY,EAAE7E,OAAO,CAACjS,aAAR,GACV/C,SADU,GAET,GAAEmX,WAAW,CAAChZ,KAAM,GACnB6W,OAAO,CAAChS,mBAAR,GAA8B,YAA9B,GAA6C,EAC9C,MAAKmU,WAAW,CAACK,MAAO,GATuB;AAUpDsC,MAAAA,cAAc,EAAE9E,OAAO,CAACjS,aAAR,GAAwB/C,SAAxB,GAAoC,EAVA;;AAAA,KAA5B,CAA1B;AAYA6O,IAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,eAAlB,EAAmCqI,WAAW,CAAChY,IAA/C;AACAyV,IAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,QAHF;AAKA,WAAOjK,OAAO,CAAC,YAAYoM,WAAW,CAAChY,IAAxB,IAAgCgY,WAAW,CAAChY,IAAZ,CAAiBwX,MAAlD,CAAd;AACD,GA5BD,CA4BE,OAAOpO,GAAP,EAAY;AACZ8D,IAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,kBAAjB,EAAqCxI,GAAG,CAACqG,OAAzC;AACAgG,IAAAA,WAAW,CAACgC,UAAZ,CAAuBvK,OAAvB,EAAgC6I,uBAAuB,EAAvD;AACA,WAAO,KAAP;AACD;AACF,CAtQM;;ACnDA,MAAMqC,kBAAkB,GAAG,yCAA3B;;AAEP,MAAMC,iBAAiB,GAAIhF,OAAD,IAAsB;AAC9C,SAAOK,aAAa,CACjB7S,GADI,CAEH,CAAC;AAAE2I,IAAAA,GAAF;AAAOmK,IAAAA;AAAP,GAAD,KACG,MAAKN,OAAO,CAAC7J,GAAD,CAAP,GAAe,GAAf,GAAqB,GAAI,qBAAoBA,GAAI,OAAMmK,KAAM,EAHlE,EAKJ2E,IALI,CAKC,IALD,CAAP;AAMD,CAPD;;AASA,MAAMC,eAAe,GAAIC,KAAD,IAAiC;AACvD,SAAOA,KAAK,CACT3X,GADI,CACC+Q,IAAD,IAAU;AACb,QAAIA,IAAI,CAACtO,GAAT,EAAc,OAAQ,IAAGsO,IAAI,CAACpV,KAAM,KAAIoV,IAAI,CAACtO,GAAI,GAAnC;AACd,WAAOsO,IAAI,CAACpV,KAAZ;AACD,GAJI,EAKJ8b,IALI,CAKC,IALD,CAAP;AAMD,CAPD;;AAcA,MAAMG,cAAc,GAAID,KAAD,IAAkC;AACvD,MAAI,CAACA,KAAL,EAAY,OAAO,MAAP;AACZ,SAAOA,KAAK,CAAC7N,MAAN,GAAe,CAAf,GACF,kBAAiB4N,eAAe,CAACC,KAAD,CAAQ,QADtC,GAEH,IAFJ;AAGD,CALD;;AAOA,MAAME,aAAa,GAAG,CACpBrF,OADoB,EAEpBsF,eAFoB,KAGR;AACZ,MAAI,CAACA,eAAL,EAAsB,OAAOtF,OAAP;AACtB,SAAO,EAAE,GAAGA,OAAL;AAAc,OAAGsF;AAAjB,GAAP;AACD,CAND;;AAQA,MAAMC,iCAAiC,GAAG,CACxC/O,IADwC,EAExCwJ,OAFwC,EAGxCmF,KAHwC,KAI7B;AACX,QAAMK,4BAA4B,GAAGhP,IAAI,CAACoK,OAAL;AAEnC,sEAFmC,EAGnCwE,cAAc,CAACD,KAAD,CAHqB,CAArC;AAMA,SAAQ,GAAEK,4BAA6B,kBAAiBR,iBAAiB,CACvEhF,OADuE,CAEvE,EAFF;AAGD,CAdD;;AAgBO,MAAMyF,iBAAiB,GAAG,CAC/BhF,cAD+B,EAE/B0E,KAF+B,KAGpB;AACX,SAAOI,iCAAiC,CAAC,EAAD,EAAK9E,cAAL,EAAqB0E,KAArB,CAAxC;AACD,CALM;AAOA,MAAMO,oBAAoB,GAAG,CAClChB,WADkC,EAElCjE,cAFkC,EAGlC6E,eAHkC,KAIP;AAC3B,QAAMtF,OAAO,GAAGO,YAAY,CAACmE,WAAD,EAAcjE,cAAd,CAA5B;AACA,QAAMkF,cAAc,GAAGN,aAAa,CAACrF,OAAD,EAAUsF,eAAV,CAApC;AAEA,SAAO;AACLtF,IAAAA,OAAO,EAAE2F,cADJ;AAELjB,IAAAA,WAAW,EAAEa,iCAAiC,CAACb,WAAD,EAAciB,cAAd;AAFzC,GAAP;AAID,CAZM;AAcA,MAAMC,sBAAsB,GAAG,CACpClB,WADoC,EAEpCS,KAFoC,KAGzB;AACX,SAAOT,WAAW,CAAC9D,OAAZ;AAEL;AACA;AACA,4EAJK,EAKJ,GAAEwE,cAAc,CAACD,KAAD,CAAQ,IALpB,CAAP;AAOD,CAXM;AAaA,MAAMU,6BAA6B,GAAG,CAC3CnB,WAD2C,EAE3C/D,WAF2C,KAGhC;AACX,SAAO+D,WAAW,CAAC9D,OAAZ;AAEL,+CAFK;AAIL,GAACD,WAAD,GAAe,IAAf,GAAuB,0BAAyBA,WAAY,QAJvD,CAAP;AAMD,CAVM;AAYA,MAAMmF,kCAAkC,GAAIC,MAAD,IAA4B;AAC5E,SAAOA,MAAM,CAACnF,OAAP;AAEL,uGAFK;AAIL,QAJK,CAAP;AAMD,CAPM;;ACvGA,MAAMoF,uBAAuB,GAAG,CACrCC,iBADqC,EAErCpM,OAFqC,EAGrCrD,IAHqC,KAMlC;AACH,SAAOqD,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CACJ4B,aADI,CACUrM,OAAO,CAACzC,IAAR,CAAa;AAAEmN,IAAAA,YAAY,EAAE0B,iBAAhB;AAAmCzP,IAAAA;AAAnC,GAAb,CADV,EAEJmJ,IAFI,CAEC,CAAC;AAAEhT,IAAAA;AAAF,GAAD,KAAcA,IAFf,CAAP;AAGD,CAVM;AAYA,MAAMwZ,wBAAwB,GAAG,CACtCF,iBADsC,EAEtCpM,OAFsC,EAGtCuM,SAHsC,KAMnC;AACH,SAAOvM,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CACJ+B,UADI,CAEHxM,OAAO,CAACzC,IAAR,CAAa;AACXmN,IAAAA,YAAY,EAAE0B,iBADH;AAEXK,IAAAA,UAAU,EAAEF;AAFD,GAAb,CAFG,EAOJzG,IAPI,CAQH,CAAC;AAAEhT,IAAAA;AAAF,GAAD,KAAcA,IARX,EASH,MAAM,IATH,CAAP;AAWD,CAlBM;;ACGA,MAAM4Z,sBAAsB,GAAG,OACpCN,iBADoC,EAEpCpM,OAFoC,EAGpCuI,WAHoC,EAIpCoE,wBAJoC,KAKH;AACjC,QAAMhJ,UAAU,GAAG4E,WAAW,CAAC5E,UAA/B;AACA,QAAMiJ,OAAO,GAAG;AAAEjE,IAAAA,MAAM,EAAEyD;AAAV,GAAhB;;AAEA,MAAIO,wBAAJ,EAA8B;AAC5B,UAAME,OAAO,GAAG,MAAMF,wBAAtB;AACA,UAAMG,YAAY,GAAG,MAAMnJ,UAAU,CAACrK,WAAX,CAAuByT,GAAvB,CAA2B3D,SAA3B,CAAqC;AAC9DnJ,MAAAA,OAAO,EAAEsI,WAAW,CAAClE,YADyC;AAE9D9G,MAAAA,IAAI,EAAEgL,WAAW,CAACyE,SAF4C;AAG9D1F,MAAAA,EAAE,EAAEsF,OAH0D;AAI9DL,MAAAA,SAAS,EAAEM,OAAO,CAAC/d;AAJ2C,KAArC,CAA3B;AAMA,WAAO;AAAEge,MAAAA,YAAF;AAAgBjC,MAAAA,WAAW,EAAEgC,OAAO,CAAClQ;AAArC,KAAP;AACD;;AAED,QAAMsQ,QAAQ,GAAG,MAAMtJ,UAAU,CAACrK,WAAX,CAAuByT,GAAvB,CAA2BpT,OAA3B,CAAmC;AACxD,kBAAc4O,WAAW,CAAClE,YAAZ,CAAyBvV,EADiB;AAExD,eAAWyZ,WAAW,CAACyE,SAAZ,CAAsBle,EAFuB;AAGxD,iBAAasd;AAH2C,GAAnC,CAAvB;AAKA,QAAMS,OAAO,GACXI,QAAQ,KACP,MAAMX,wBAAwB,CAC7BF,iBAD6B,EAE7BpM,OAF6B,EAG7BiN,QAAQ,CAACV,SAHoB,CADvB,CADV;;AAQA,MAAI,CAACM,OAAD,IAAY,CAACI,QAAjB,EAA2B;AACzB,UAAMJ,OAAO,GAAG,MAAMV,uBAAuB,CAC3CC,iBAD2C,EAE3CpM,OAF2C,EAG3CkL,kBAH2C,CAA7C;;AAMA,QAAI,CAAC+B,QAAL,EAAe;AACb,YAAMH,YAAY,GAAG,MAAMnJ,UAAU,CAACrK,WAAX,CAAuByT,GAAvB,CAA2B3D,SAA3B,CAAqC;AAC9DnJ,QAAAA,OAAO,EAAEsI,WAAW,CAAClE,YADyC;AAE9D9G,QAAAA,IAAI,EAAEgL,WAAW,CAACyE,SAF4C;AAG9D1F,QAAAA,EAAE,EAAEsF,OAH0D;AAI9DL,QAAAA,SAAS,EAAEM,OAAO,CAAC/d;AAJ2C,OAArC,CAA3B;AAMA,aAAO;AAAEge,QAAAA,YAAF;AAAgBjC,QAAAA,WAAW,EAAEgC,OAAO,CAAClQ;AAArC,OAAP;AACD,KARD,MAQO;AACL,YAAMgH,UAAU,CAACrK,WAAX,CAAuByT,GAAvB,CAA2BG,kBAA3B,CAA8CD,QAAQ,CAAC/S,GAAvD,EAA4D;AAChE4C,QAAAA,IAAI,EAAE;AAAEyP,UAAAA,SAAS,EAAEM,OAAO,CAAC/d;AAArB;AAD0D,OAA5D,CAAN;AAGD;AACF;;AAED,SAAO;AAAEge,IAAAA,YAAY,EAAEG,QAAhB;AAA0BpC,IAAAA,WAAW,EAAEgC,OAAO,CAAElQ;AAAhD,GAAP;AACD,CAxDM;;AChBA,MAAMwQ,OAAO,GAAG,OACrBnN,OADqB,EAErB+J,QAFqB,KAGoD;AACzE,QAAMI,QAAQ,GAAG,MAAMnK,OAAO,CAACyD,OAAR,CAAgB2G,KAAhB,CAAsBzY,GAAtB,CACrBqO,OAAO,CAACzC,IAAR,CAAa;AAAE8M,IAAAA,WAAW,EAAEN;AAAf,GAAb,CADqB,CAAvB;AAIA,SAAOI,QAAQ,CAACrX,IAAhB;AACD,CATM;;ACeA,MAAMsa,gBAAgB,GAAG,OAC9BpN,OAD8B,KAI3B;AACH,QAAM;AAAElN,IAAAA,IAAI,EAAEiC;AAAR,MAAmB,MAAMiL,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuB4C,iBAAvB,CAC7BrN,OAAO,CAACzC,IAAR,CAAa;AAAED,IAAAA,QAAQ,EAAE;AAAZ,GAAb,CAD6B,CAA/B;AAGA,SAAOvI,MAAP;AACD,CATM;AAWA,MAAMuY,cAAc,GAAG,OAC5BtN,OAD4B,EAE5BnM,MAF4B,KAGF;AAC1B,QAAMkB,MAAM,GAAG,MAAMqY,gBAAgB,CAACpN,OAAD,CAArC;AACA,QAAMuN,WAA0C,GAAG,EAAnD;;AAEA,OAAK,MAAM,CAACC,QAAD,EAAWC,WAAX,CAAX,IAAsCrR,MAAM,CAACC,OAAP,CAAexI,MAAM,CAACkB,MAAP,CAAcC,IAA7B,CAAtC,EAA0E;AACxE,UAAM0Y,UAAU,GAAGD,WAAW,CAACvY,KAAZ,CAAkByY,KAAlB,CAAwB,CAAxB,CAAnB;AACA,UAAM7V,WAAW,GAAG2V,WAAW,CAAC3V,WAAZ,GACf,GAAE2V,WAAW,CAAC3V,WAAY,yBADX,GAEf,4BAA2B0V,QAAS,EAFzC;AAIA,QAAII,aAAa,GAAG7Y,MAAM,CAAC2G,IAAP,CAAa+K,KAAD,IAAWA,KAAK,CAACxR,IAAN,KAAewY,WAAW,CAACxY,IAAlD,CAApB;;AACA,QAAI,CAAC2Y,aAAL,EAAoB;AAClBA,MAAAA,aAAa,GAAG7Y,MAAM,CAAC2G,IAAP,CAAa+K,KAAD,IAAWA,KAAK,CAAC3O,WAAN,KAAsBA,WAA7C,CAAhB;AACD;;AACD,QAAI,CAAC8V,aAAL,EAAoB;AAClB,UAAIJ,QAAQ,KAAK,qBAAjB,EAAwC;AACtCI,QAAAA,aAAa,GAAG7Y,MAAM,CAAC2G,IAAP,CACb+K,KAAD,IAAWA,KAAK,CAACxR,IAAN,KAAe,qBADZ,CAAhB;AAGD;;AACD,UAAIuY,QAAQ,KAAK,iBAAjB,EAAoC;AAClCI,QAAAA,aAAa,GAAG7Y,MAAM,CAAC2G,IAAP,CACb+K,KAAD,IAAWA,KAAK,CAACxR,IAAN,KAAe,iBADZ,CAAhB;AAGD;;AACD,UAAIuY,QAAQ,KAAK,WAAjB,EAA8B;AAC5BI,QAAAA,aAAa,GAAG7Y,MAAM,CAAC2G,IAAP,CAAa+K,KAAD,IAAWA,KAAK,CAACxR,IAAN,KAAe,OAAtC,CAAhB;AACD;AACF;;AAED,QAAI,CAAC2Y,aAAL,EAAoB;AAClB,YAAMrb,MAAM,GAAG,MAAMyN,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuBoD,WAAvB,CACnB7N,OAAO,CAACzC,IAAR,CAAa;AACXtI,QAAAA,IAAI,EAAEwY,WAAW,CAACxY,IADP;AAEXC,QAAAA,KAAK,EAAEwY,UAFI;AAGX5V,QAAAA;AAHW,OAAb,CADmB,CAArB;AAOAyV,MAAAA,WAAW,CAACC,QAAD,CAAX,GAAwBjb,MAAM,CAACO,IAA/B;AACD,KATD,MASO,IACL8a,aAAa,CAAC3Y,IAAd,KAAuBwY,WAAW,CAACxY,IAAnC,IACA2Y,aAAa,CAAC1Y,KAAd,KAAwBwY,UADxB,IAEAE,aAAa,CAAC9V,WAAd,KAA8BA,WAHzB,EAIL;AACAkI,MAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,uBAAjB,EAA0C;AACxCoJ,QAAAA,YAAY,EAAEF,aAAa,CAAC3Y,IADY;AAExCA,QAAAA,IAAI,EAAE2Y,aAAa,CAAC3Y,IAAd,KAAuBwY,WAAW,CAACxY,IAAnC,IAA2CwY,WAAW,CAACxY,IAFrB;AAGxCC,QAAAA,KAAK,EAAE0Y,aAAa,CAAC1Y,KAAd,KAAwBwY,UAAxB,IAAsCA,UAHL;AAIxC5V,QAAAA,WAAW,EAAE8V,aAAa,CAAC9V,WAAd,KAA8BA,WAA9B,IAA6CA;AAJlB,OAA1C;AAOA,YAAMvF,MAAM,GAAG,MAAMyN,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuBsD,WAAvB,CACnB/N,OAAO,CAACzC,IAAR,CAAa;AACXuQ,QAAAA,YAAY,EAAEF,aAAa,CAAC3Y,IADjB;AAEXA,QAAAA,IAAI,EAAEwY,WAAW,CAACxY,IAFP;AAGXC,QAAAA,KAAK,EAAEwY,UAHI;AAIX5V,QAAAA;AAJW,OAAb,CADmB,CAArB;AAQAyV,MAAAA,WAAW,CAACC,QAAD,CAAX,GAAwBjb,MAAM,CAACO,IAA/B;AACD,KArBM,MAqBA;AACLya,MAAAA,WAAW,CAACC,QAAD,CAAX,GAAwBI,aAAxB;AACD;AACF;;AAED,SAAOL,WAAP;AACD,CArEM;;AC0CA,MAAMS,gBAAgB,GAAG,CAC9BC,QAD8B,EAE9BnV,aAF8B,KAGlB;AACZ,QAAMoV,gBAAgB,GACpBpV,aAAa,CAAClD,iBAAd,IACA,IAAI2Q,MAAJ,CAAY,IAAGzN,aAAa,CAAClD,iBAAkB,GAA/C,CAFF;;AAIA,MAAIqY,QAAQ,KAAK,iBAAjB,EAAoC;AAClC,WAAO3f,OAAO,CAACC,GAAR,CAAYgB,eAAZ,KAAgC,gBAAvC;AACD;;AAED,MAAI2e,gBAAJ,EAAsB;AACpB,WAAOA,gBAAgB,CAACC,IAAjB,CAAsBF,QAAtB,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAjBM;;AAmBP,MAAMG,uBAAuB,GAAG,CAC9BC,YAD8B,EAE9Bxa,MAF8B,EAG9Bya,gBAH8B,EAI9BvZ,MAJ8B,KAKY;AAC1C,MAAIsZ,YAAJ,EAAkB,OAAO,MAAqC,EAA5C;AAClB,SAAQb,QAAD,IACLc,gBAAgB,CACb3a,GADH,CACQ2I,GAAD,IAASzI,MAAM,CAACkB,MAAP,CAAcI,MAAd,CAAqBmH,GAArB,EAA0BkR,QAA1B,CADhB,EAEGjM,MAFH,CAEU7C,OAFV,EAGG/K,GAHH,CAGQsB,IAAD,IAAUF,MAAM,CAACE,IAAD,CAAN,CAAanG,EAH9B,CADF;AAKD,CAZD;;AAcA,eAAeyf,eAAf,CACE5K,UADF,EAEE3D,OAFF,EAGEnM,MAHF,EAIoC;AAClC,QAAM;AACJ/E,IAAAA,EADI;AAEJmG,IAAAA,IAFI;AAGJiU,IAAAA,SAAS,EAAEsF,QAHP;AAIJhR,IAAAA,KAAK,EAAE5J,GAJH;AAKJkE,IAAAA;AALI,MAMFkI,OAAO,CAACE,OAAR,CAAgB9C,UANpB;AAOA,QAAMqR,SAAS,GAAGvP,2BAA2B,CAACpH,WAAD,CAA7C;AAEA,QAAMiO,cAAc,GAAG,MAAML,oBAAoB,CAC/C/B,UAD+C,EAE/C3D,OAF+C,EAG/CnM,MAH+C,EAI/CD,GAJ+C,CAAjD;AAMA,QAAM2U,WAAW,GAAGnM,MAAM,CAACxN,MAAP,CAAcmX,cAAd,CAApB;AAEA,QAAMsI,YAAY,GAAGL,gBAAgB,CAAC/Y,IAAD,EAAOpB,MAAP,CAArC;AAEA,QAAMkB,MAAM,GAAGsZ,YAAY,GAAG,EAAH,GAAQ,MAAMf,cAAc,CAACtN,OAAD,EAAUnM,MAAV,CAAvD;AAEA,QAAMya,gBAAgB,GAAGlS,MAAM,CAAC2C,IAAP,CAAYlL,MAAM,CAACY,MAAnB,CAAzB;AAEA,QAAMia,iBAAiB,GAAGN,uBAAuB,CAC/CC,YAD+C,EAE/Cxa,MAF+C,EAG/Cya,gBAH+C,EAI/CvZ,MAJ+C,CAAjD;AAOA,QAAM4Z,mBAAmB,GAAGD,iBAAiB,CAAC,aAAD,CAA7C;AACA,QAAME,uBAAuB,GAAGF,iBAAiB,CAAC,WAAD,CAAjD;AACA,QAAMG,wBAAwB,GAAGH,iBAAiB,CAAC,kBAAD,CAAlD;AACA,QAAMI,sBAAsB,GAAGJ,iBAAiB,CAAC,UAAD,CAAhD;AAEA,QAAMK,iBAAiB,GAAG,CACxB,GAAGH,uBADqB,EAExB,GAAGC,wBAFqB,EAGxB,GAAGC,sBAHqB,CAA1B;AAMA,QAAME,kBAAkB,GAAG,IAAIpW,GAAJ,EAA3B;;AACA,MAAI,CAACyV,YAAL,EAAmB;AACjBC,IAAAA,gBAAgB,CAACrN,OAAjB,CAA0B3E,GAAD,IAAS;AAChC,YAAM2S,iBAAiB,GAAGpb,MAAM,CAACkB,MAAP,CAAcI,MAAd,CAAqBmH,GAArB,CAA1B;AACAF,MAAAA,MAAM,CAAC2C,IAAP,CAAYkQ,iBAAZ,EAA+BhO,OAA/B,CAAwCuM,QAAD,IAAsB;AAC3DwB,QAAAA,kBAAkB,CAAC5V,GAAnB,CAAuBrE,MAAM,CAACka,iBAAiB,CAACzB,QAAD,CAAlB,CAAN,CAAoC1e,EAA3D,EAA+DwN,GAA/D;AACD,OAFD;AAGD,KALD;AAMD,GAlDiC;;;AAqElC,QAAM6H,MAAI,GAAGC,SAAI,EAAjB;AACA,MAAI8K,WAAJ;AACA,MAAIC,cAA+B,GAAG,EAAtC;;AAEA,QAAMC,MAAM,GAAG,CACbC,aADa,EAEbtF,QAFa,EAGbxF,QAHa,KAKb,IAAIlK,OAAJ,CAAY,CAACoF,OAAD,EAAU+E,MAAV,KAAqB;AAC/B,UAAMC,QAAQ,GAAG;AACflH,MAAAA,IAAI,EAAEiR,QADS;AAEfa,MAAAA,aAFe;AAGftF,MAAAA;AAHe,KAAjB;AAKA/J,IAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,sBAAlB,EAA0CgC,QAA1C,EAN+B;;AAQ/BN,IAAAA,MAAI,CAAC0F,MAAM,CAACE,QAAD,CAAP,EAAmB,MAAOpF,qBAAP,IAAiC;AACtD,YAAMC,OAAO,GAAGD,qBAAqB,CAAC,MAAM,EAAP,CAArC;AACA3E,MAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,wBAAjB,EAA2CD,QAA3C;;AACA,UAAI;AACF,cAAMF,QAAQ,EAAd;AACD,OAFD,CAEE,OAAOrI,GAAP,EAAY;AACZ8D,QAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,+BAAjB,EAAkDD,QAAlD;AACAG,QAAAA,OAAO;AACPJ,QAAAA,MAAM,CAACtI,GAAD,CAAN;AACA;AACD;;AACD8D,MAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,kBAAjB,EAAqCD,QAArC;AACAG,MAAAA,OAAO;AACPnF,MAAAA,OAAO;AACR,KAdG,CAAJ;AAeD,GAvBD,CALF;;AAqCA,QAAM8K,UAAU,GAAG,CAACvK,OAAD,EAAwBsH,EAAxB,KAAoD;AACrE,QAAI,CAACA,EAAL,EAAS,MAAM,IAAI7Y,KAAJ,CAAU,6BAAV,CAAN;AACTuR,IAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,YAAjB,EAA+B4C,EAA/B;AACAgI,IAAAA,UAAU,CAAC,MAAM;AACfF,MAAAA,MAAM,CAAC,YAAD,EAAe,CAAC,CAAhB,EAAmB,MAAM;AAC7B,eAAOA,MAAM,CAACvF,MAAM,CAACvC,EAAE,CAACxY,EAAJ,CAAP,EAAgBwY,EAAE,CAACqB,MAAnB,EAA2B,YAAY;AAClD,gBAAM,CAACL,WAAD,EAAcE,mBAAd,IAAqC,MAAMnO,OAAO,CAACC,GAAR,CAAY,CAC3D6S,OAAO,CAACnN,OAAD,EAAUsH,EAAE,CAACqB,MAAb,CADoD,EAE3D+D,sBAAsB,CAACpF,EAAE,CAACqB,MAAJ,EAAY3I,OAAZ,EAAqBuI,WAArB,CAFqC,CAAZ,CAAjD;AAIA,gBAAMF,mBAAmB,CACvBC,WADuB,EAEvBtI,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,SAXY,CAAb;AAYD,OAbK,CAAN;AAcD,KAfS,EAeP,MAfO,CAAV;AAgBD,GAnBD;;AAqBA,SAAOpM,MAAM,CAACoE,MAAP,CAAc+H,WAAd,EAA2B;AAChC5E,IAAAA,UADgC;AAEhC5O,IAAAA,MAFgC;AAGhCkU,IAAAA,YAAY,EAAEuF,QAHkB;AAIhCxB,IAAAA,SAAS,EAAE;AAAEle,MAAAA,EAAF;AAAMmG,MAAAA;AAAN,KAJqB;AAKhCwZ,IAAAA,SALgC;AAMhCM,IAAAA,iBANgC;AAOhCV,IAAAA,YAPgC;AAQhC7E,IAAAA,cAAc,EArFQzU,MAAD,IACrBA,MAAM,CAACuQ,IAAP,CAAamB,KAAD,IAAWkI,mBAAmB,CAACnN,QAApB,CAA6BiF,KAAK,CAAC3X,EAAnC,CAAvB,CA4EgC;AAShC2a,IAAAA,kBAAkB,EApFQ1U,MAAD,IACzBA,MAAM,CAACuQ,IAAP,CAAamB,KAAD,IAAWmI,uBAAuB,CAACpN,QAAxB,CAAiCiF,KAAK,CAAC3X,EAAvC,CAAvB,CA0EgC;AAUhCygB,IAAAA,yBAAyB,EAnFQxa,MAAD,IAChCA,MAAM,CAACuQ,IAAP,CAAamB,KAAD,IAAWoI,wBAAwB,CAACrN,QAAzB,CAAkCiF,KAAK,CAAC3X,EAAxC,CAAvB,CAwEgC;AAWhC0gB,IAAAA,iBAAiB,EAlFQza,MAAD,IACxBA,MAAM,CAACuQ,IAAP,CAAamB,KAAD,IAAWqI,sBAAsB,CAACtN,QAAvB,CAAgCiF,KAAK,CAAC3X,EAAtC,CAAvB,CAsEgC;AAYhC2gB,IAAAA,wBAAwB,EAhFQ1a,MAAD,IAC/BA,MAAM,CACHwM,MADH,CACWkF,KAAD,IAAWkI,mBAAmB,CAACnN,QAApB,CAA6BiF,KAAK,CAAC3X,EAAnC,CADrB,EAEG6E,GAFH,CAEQ8S,KAAD,IAAWuI,kBAAkB,CAACrd,GAAnB,CAAuB8U,KAAK,CAAC3X,EAA7B,CAFlB,EAGGyS,MAHH,CAGU9C,aAHV,CAmEgC;AAchCmL,IAAAA,gBAAgB,EAAE,MAAMsF,WAdQ;AAehCjF,IAAAA,cAAc,EAAG3C,EAAD,IAA6B;AAC3CrF,MAAAA,OAAO,CAACO,GAAR,CAAY,kBAAZ,EAAgC;AAC9BjF,QAAAA,IAAI,EAAEiR,QADwB;AAE9BlH,QAAAA;AAF8B,OAAhC;;AAIA,UAAI4H,WAAW,IAAIrF,MAAM,CAACqF,WAAW,CAACvG,MAAb,CAAN,KAA+BkB,MAAM,CAACvC,EAAE,CAACqB,MAAJ,CAAxD,EAAqE;AACnE;AACD;;AACD,UAAIuG,WAAJ,EAAiB,MAAM,IAAIzgB,KAAJ,CAAU,mBAAV,CAAN;AACjBygB,MAAAA,WAAW,GAAG5H,EAAd;AACD,KAzB+B;AA0BhCoB,IAAAA,0BAA0B,EAAE,CAC1B1I,OAD0B,EAE1B+J,QAF0B,EAG1B2F,MAH0B,KAIjB;AACT,UAAIR,WAAW,IAAIrF,MAAM,CAACqF,WAAW,CAACvG,MAAb,CAAN,KAA+BkB,MAAM,CAACE,QAAD,CAAxD,EAAoE;AAClEmF,QAAAA,WAAW,GAAGC,cAAc,CAACQ,KAAf,EAAd;AACA3P,QAAAA,OAAO,CAACwC,GAAR,CAAa,sBAAqBgM,QAAS,IAAGzE,QAAS,KAAI2F,MAAO,EAAlE;AACA1P,QAAAA,OAAO,CAACwC,GAAR,CAAa,oBAAmBgM,QAAS,EAAzC,EAA4CU,WAA5C;;AACA,YAAIA,WAAJ,EAAiB;AACf3E,UAAAA,UAAU,CAACvK,OAAD,EAAUkP,WAAV,CAAV;AACD;AACF,OAPD,MAOO;AACL,cAAMU,cAAc,GAAGT,cAAc,CAAC1R,MAAtC;AACA0R,QAAAA,cAAc,GAAGA,cAAc,CAAC5N,MAAf,CACdxE,KAAD,IAAW8M,MAAM,CAAC9M,KAAK,CAAC4L,MAAP,CAAN,KAAyBkB,MAAM,CAACE,QAAD,CAD3B,CAAjB;;AAGA,YAAIoF,cAAc,CAAC1R,MAAf,KAA0BmS,cAA9B,EAA8C;AAC5C5P,UAAAA,OAAO,CAACwC,GAAR,CAAa,sBAAqBgM,QAAS,IAAGzE,QAAS,KAAI2F,MAAO,EAAlE;AACD;AACF;AACF,KA/C+B;AAgDhC1F,IAAAA,kBAAkB,EAAG1C,EAAD,IAA6B;AAC/CtH,MAAAA,OAAO,CAACwC,GAAR,CAAY,wBAAZ,EAAsC;AACpCjF,QAAAA,IAAI,EAAEiR,QAD8B;AAEpClH,QAAAA,EAFoC;AAGpC4H,QAAAA,WAHoC;AAIpCC,QAAAA;AAJoC,OAAtC;;AAMA,UAAI,CAACA,cAAc,CAAC7J,IAAf,CAAqBuK,CAAD,IAAOA,CAAC,CAAClH,MAAF,KAAarB,EAAE,CAACqB,MAA3C,CAAL,EAAyD;AACvDwG,QAAAA,cAAc,CAACvU,IAAf,CAAoB0M,EAApB;AACD;AACF,KA1D+B;AA2DhCiD,IAAAA,UA3DgC;AA6DhC6E,IAAAA,MA7DgC;AA8DhCU,IAAAA,eAAe,EA1FO,CACtBxH,WADsB,EAEtB/D,QAFsB,KAGJ;AAClB,aAAO6K,MAAM,CAACvF,MAAM,CAACvB,WAAW,CAACxZ,EAAb,CAAP,EAAyBwZ,WAAW,CAACK,MAArC,EAA6CpE,QAA7C,CAAb;AACD;AAuBiC,GAA3B,CAAP;AAgED;;AAED,MAAMwL,mBAAmB,GAAG,IAAInX,GAAJ,EAA5B;AACA,MAAMoX,YAAY,GAAG,IAAIpX,GAAJ,EAArB;AAEO,MAAMqX,iBAAiB,GAAG,CAC/BtM,UAD+B,EAE/B3D,OAF+B,KAGe;AAC9C,QAAMzC,IAAI,GAAGyC,OAAO,CAACE,OAAR,CAAgB9C,UAA7B;AACA,QAAMI,KAAK,GAAGD,IAAI,CAACC,KAAnB;AACA,QAAMlB,GAAG,GAAGiB,IAAI,CAACzO,EAAjB;AAEA,QAAMohB,mBAAmB,GAAGF,YAAY,CAACre,GAAb,CAAiB2K,GAAjB,CAA5B;AACA,MAAI4T,mBAAJ,EAAyB,OAAOA,mBAAP;AAEzB,QAAMtK,eAAe,GAAGmK,mBAAmB,CAACpe,GAApB,CAAwB2K,GAAxB,CAAxB;AACA,MAAIsJ,eAAJ,EAAqB,OAAOvL,OAAO,CAACoF,OAAR,CAAgBmG,eAAhB,CAAP;AAErB,MAAI9M,aAAa,GAAGP,cAAc,CAACiF,KAAK,CAACzK,KAAP,CAAlC;;AAEA,MAAI,CAAC+F,aAAL,EAAoB;AAClBmJ,IAAAA,OAAO,CAACkO,IAAR,CAAc,4BAA2B3S,KAAK,CAACzK,KAAM,EAArD;AACA+F,IAAAA,aAAa,GAAGC,QAAhB;AACD;;AAED,QAAM8M,OAAO,GAAG0I,eAAe,CAAC5K,UAAD,EAAa3D,OAAb,EAAsBlH,aAAtB,CAA/B;AACAiX,EAAAA,mBAAmB,CAAC3W,GAApB,CAAwBkD,GAAxB,EAA6BuJ,OAA7B;AAEA,SAAOA,OAAO,CAACC,IAAR,CAAcyC,WAAD,IAAiB;AACnCwH,IAAAA,mBAAmB,CAAC3M,MAApB,CAA2B9G,GAA3B;AACA0T,IAAAA,YAAY,CAAC5W,GAAb,CAAiBkD,GAAjB,EAAsBiM,WAAtB;AACA,WAAOA,WAAP;AACD,GAJM,CAAP;AAKD,CA7BM;;AC7SA,MAAM6H,iBAAiB,GAAG,CAG/BzM,UAH+B,EAI/BY,QAJ+B,KAQb;AAClB,SAAO,MAAOvE,OAAP,IAAkC;AACvC,UAAMuI,WAAW,GAAG,MAAM0H,iBAAiB,CAACtM,UAAD,EAAa3D,OAAb,CAA3C;AACA,QAAI,CAACuI,WAAL,EAAkB;AAElB,WAAOhE,QAAQ,CAACvE,OAAD,EAAUuI,WAAV,CAAf;AACD,GALD;AAMD,CAfM;;ACcA,MAAM8H,wBAAwB,GAAG,CAStC1M,UATsC,EAUtC2M,uBAVsC,EAetCC,UAfsC,EAqBtCC,kBArBsC,KA0BpB;AAClB,SAAOJ,iBAAiB,CAACzM,UAAD,EAAa,OAAO3D,OAAP,EAAgBuI,WAAhB,KAAgC;AACnE,UAAMD,WAAqB,GAAGgI,uBAAuB,CACnDtQ,OAAO,CAACE,OAD2C,EAEnDF,OAFmD,EAGnDuI,WAHmD,CAArD;AAKA,QAAID,WAAW,KAAK,IAApB,EAA0B;AAC1B,UAAMnC,OAAO,GAAGqK,kBAAkB,GAC9BA,kBAAkB,CAAClI,WAAD,EAActI,OAAd,EAAuBuI,WAAvB,CADY,GAE9B,EAFJ;AAIA,UAAMA,WAAW,CAACuH,eAAZ,CAA4BxH,WAA5B,EAAyC,YAAY;AACzD;AACN;AACA;AACA;AACM,YAAME,mBAAmB,GAAGD,WAAW,CAAC8F,YAAZ,GACxB,IADwB,GAExB,MAAM3B,sBAAsB,CAC1BpE,WAAW,CAACK,MADc,EAE1B3I,OAF0B,EAG1BuI,WAH0B,EAI1BpC,OAAO,CAACwG,wBAJkB,CAFhC;AASA,aAAO4D,UAAU,CAACjI,WAAD,EAActI,OAAd,EAAuBuI,WAAvB,EAAoCC,mBAApC,CAAjB;AACD,KAfK,CAAN;AAgBD,GA3BuB,CAAxB;AA4BD,CAvDM;AAyDA,MAAMiI,yBAAyB,GAAG,CAIvC9M,UAJuC,EAKvC+M,MALuC,EAMvCH,UANuC,KAWrB;AAClB,SAAOH,iBAAiB,CAACzM,UAAD,EAAa,OAAO3D,OAAP,EAAgBuI,WAAhB,KAAgC;AACnE,UAAMwE,GAAG,GAAG2D,MAAM,CAAC1Q,OAAO,CAACE,OAAT,EAAkBqI,WAAlB,CAAlB;AACA,QAAIwE,GAAG,CAACtP,MAAJ,KAAe,CAAnB,EAAsB;AAEtB,UAAMpD,OAAO,CAACC,GAAR,CACJyS,GAAG,CAACpZ,GAAJ,CAAS2T,EAAD,IACNiB,WAAW,CAAC6G,MAAZ,CAAmBvF,MAAM,CAACvC,EAAE,CAACxY,EAAJ,CAAzB,EAAkCwY,EAAE,CAACqB,MAArC,EAA6C,YAAY;AACvD,aAAO4H,UAAU,CAACjJ,EAAD,EAAKtH,OAAL,EAAcuI,WAAd,CAAjB;AACD,KAFD,CADF,CADI,CAAN;AAOD,GAXuB,CAAxB;AAYD,CAxBM;;ACvEQ,SAASoI,iBAAT,CACbtS,GADa,EAEbsF,UAFa,EAGP;AACNtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,qBADF,EAEEH,yBAAyB,CACvB9M,UADuB,EAEvB,CAACzD,OAAD,EAAUqI,WAAV,KAA0B;AACxB,QAAIA,WAAW,CAAC8F,YAAhB,EAA8B,OAAO,EAAP;AAC9B,WAAOnO,OAAO,CAAC2Q,SAAR,CAAkBC,aAAzB;AACD,GALsB,EAMvB,OAAOxI,WAAP,EAAoBtI,OAApB,EAA6BuI,WAA7B,KAA6C;AAC3C,UAAM,CAACwI,SAAD,EAAYvI,mBAAZ,IAAmC,MAAMnO,OAAO,CAACC,GAAR,CAAY,CACzD6S,OAAO,CAACnN,OAAD,EAAUsI,WAAW,CAACK,MAAtB,CADkD,EAEzD+D,sBAAsB,CAACpE,WAAW,CAACK,MAAb,EAAqB3I,OAArB,EAA8BuI,WAA9B,CAFmC,CAAZ,CAA/C;AAKA,UAAMF,mBAAmB,CACvB0I,SADuB,EAEvB/Q,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,GAlBsB,CAF3B;AAuBD;;AC3Bc,SAASwI,mBAAT,CACb3S,GADa,EAEbsF,UAFa,EAGP;AACNtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,uBADF,EAEEH,yBAAyB,CACvB9M,UADuB,EAEvB,CAACzD,OAAD,EAAUqI,WAAV,KAA0B;AACxB,QAAIA,WAAW,CAAC8F,YAAhB,EAA8B,OAAO,EAAP;AAC9B,WAAOnO,OAAO,CAAC+Q,WAAR,CAAoBH,aAA3B;AACD,GALsB,EAMvB,OAAOxI,WAAP,EAAoBtI,OAApB,EAA6BuI,WAA7B,KAA6C;AAC3C,UAAM,CAACwI,SAAD,EAAYvI,mBAAZ,IAAmC,MAAMnO,OAAO,CAACC,GAAR,CAAY,CACzD6S,OAAO,CAACnN,OAAD,EAAUsI,WAAW,CAACK,MAAtB,CADkD,EAEzD+D,sBAAsB,CAACpE,WAAW,CAACK,MAAb,EAAqB3I,OAArB,EAA8BuI,WAA9B,CAFmC,CAAZ,CAA/C;AAKA,UAAMF,mBAAmB,CACvB0I,SADuB,EAEvB/Q,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,GAlBsB,CAF3B;AAuBD;;AC/Bc,eAAe0I,YAAf,CAGblR,OAHa,EAIb/K,IAJa,EAKb0S,GALa,EAMb7M,IANa,EAObhD,WAPa,EAQb1B,GARa,EASE;AACf,QAAM4J,OAAO,CAACyD,OAAR,CAAgBpG,KAAhB,CAAsB8T,kBAAtB,CACJnR,OAAO,CAACzC,IAAR,CAAa;AACXyC,IAAAA,OAAO,EACL/K,IAAI,KAAK,EAAT,GACI3G,OAAO,CAACC,GAAR,CAAYgB,eADhB,GAEK,GAAEjB,OAAO,CAACC,GAAR,CAAYgB,eAAgB,IAAG0F,IAAK,EAJlC;AAKX0S,IAAAA,GALW;AAMXO,IAAAA,KAAK,EAAEpN,IANI;AAOXhD,IAAAA,WAPW;AAQXsZ,IAAAA,UAAU,EAAEhb;AARD,GAAb,CADI,CAAN;AAYD;;AChBD,MAAMib,cAAc,GAAG,gBAGrB/I,WAHqB,EAIrBtI,OAJqB,EAKrB;AAAEkI,EAAAA,KAAF;AAASpQ,EAAAA;AAAT,CALqB,EAMrBwZ,WANqB,EAON;AACf,QAAMC,UAAU,GAAG,CACjB,MAAMvR,OAAO,CAACyD,OAAR,CAAgB8D,MAAhB,CAAuBC,UAAvB,CACJxH,OAAO,CAACzC,IAAR,CAAa;AACXkK,IAAAA,GAAG,EAAEa,WAAW,CAACZ,IAAZ,CAAiBC;AADX,GAAb,CADI,CADW,EAMjB7U,IANiB,CAMZ+U,UANY,CAMDnM,IANC,CAMKoM,KAAD,IAAWA,KAAK,CAAC7S,IAAN,KAAe3G,OAAO,CAACC,GAAR,CAAYgB,eAN1C,CAAnB;AAQAyQ,EAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,kBAAlB,EAAsC;AAAE8O,IAAAA,UAAF;AAAcrJ,IAAAA,KAAd;AAAqBpQ,IAAAA;AAArB,GAAtC;;AAEA,MAAIyZ,UAAJ,EAAgB;AACd,UAAMvR,OAAO,CAACyD,OAAR,CAAgB8D,MAAhB,CAAuB3Y,MAAvB,CACJoR,OAAO,CAACzC,IAAR,CAAa;AACXtI,MAAAA,IAAI,EAAE3G,OAAO,CAACC,GAAR,CAAYgB,eADP;AAEXiiB,MAAAA,QAAQ,EAAElJ,WAAW,CAACZ,IAAZ,CAAiBC,GAFhB;AAGX8J,MAAAA,UAAU,EAAEnJ,WAAW,CAACoJ,UAHb;AAIX3b,MAAAA,MAAM,EAAE,WAJG;AAKXgS,MAAAA,UAAU,EAAEG,KALD;AAMXyJ,MAAAA,YAAY,EAAE,IAAI1e,IAAJ,GAAW2e,WAAX,EANH;AAOXC,MAAAA,MAAM,EAAE;AACNviB,QAAAA,KAAK,EAAEwI,WADD;AAENtD,QAAAA,OAAO,EAAE;AAFH;AAPG,KAAb,CADI,CAAN;AAcD,GAfD,MAeO,IAAI8c,WAAW,IAAIpJ,KAAK,KAAK,SAA7B,EAAwC;AAC7C,UAAM7N,OAAO,CAACC,GAAR,CAAY,CAChB4W,YAAY,CACVlR,OADU,EAEV,EAFU,EAGVsR,WAHU,EAIV,SAJU,EAKV,8BALU,CADI,EAQhBJ,YAAY,CAAClR,OAAD,EAAU,EAAV,EAAcsI,WAAW,CAACZ,IAAZ,CAAiBC,GAA/B,EAAoCO,KAApC,EAA2CpQ,WAA3C,CARI,CAAZ,CAAN;AAUD,GAXM,MAWA;AACL,UAAMoZ,YAAY,CAAClR,OAAD,EAAU,EAAV,EAAcsI,WAAW,CAACZ,IAAZ,CAAiBC,GAA/B,EAAoCO,KAApC,EAA2CpQ,WAA3C,CAAlB;AACD;AACF,CA/CD;;AAiDO,MAAMga,2BAA2B,GAAG,CAGzCxJ,WAHyC,EAIzCtI,OAJyC,EAKzCuI,WALyC,EAMzCxT,MAAyB,GAAGuT,WAAW,CAACvT,MAAZ,IAAsB,EANT,EAOzCuc,WAPyC,KAQvB;AAClBtR,EAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,6BAAlB,EAAiD;AAC/C1N,IAAAA,MAAM,EAAEA,MAAM,CAACpB,GAAP,CAAYyT,CAAD,IAAOA,CAAP,aAAOA,CAAP,uBAAOA,CAAC,CAAEnS,IAArB,CADuC;AAE/CuU,IAAAA,cAAc,EAAEjB,WAAW,CAACiB,cAAZ,CAA2BzU,MAA3B,CAF+B;AAG/Cya,IAAAA,iBAAiB,EAAEjH,WAAW,CAACiH,iBAAZ,CAA8Bza,MAA9B;AAH4B,GAAjD;;AAMA,QAAMgd,uBAAuB,GAAIja,WAAD,IAC9BuZ,cAAc,CACZ/I,WADY,EAEZtI,OAFY,EAGZ;AACEkI,IAAAA,KAAK,EAAE,SADT;AAEEpQ,IAAAA;AAFF,GAHY,EAOZwZ,WAPY,CADhB;;AAWA,MAAIhJ,WAAW,CAACoB,mBAAZ,CAAgCjM,MAAhC,GAAyC,CAA7C,EAAgD;AAC9C,WAAOsU,uBAAuB;AAE5B;AACC,6BAAwBzJ,WAAW,CAACoB,mBAAZ,CACtB/V,GADsB,CACjBqe,EAAD,IAAaA,EAAE,CAACjf,KADE,EAEtBqY,IAFsB,CAEjB,IAFiB,CAEX,EALc,CAA9B;AAOD;;AAED,MAAI7C,WAAW,CAACgH,yBAAZ,CAAsCxa,MAAtC,CAAJ,EAAmD;AACjD,WAAOgd,uBAAuB,CAC5B,+EAD4B,CAA9B;AAGD;;AAED,QAAME,qBAAqB,GAAG1J,WAAW,CAACkH,wBAAZ,CAAqC1a,MAArC,CAA9B;;AAEA,MAAIkd,qBAAqB,CAACxU,MAAtB,GAA+B,CAAnC,EAAsC;AACpC,WAAOsU,uBAAuB,CAC3B,yBAAwBE,qBAAqB,CAAC7G,IAAtB,CACvB,IADuB,CAEvB,6BAH0B,CAA9B;AAKD;;AAED,MAAI,CAAC7C,WAAW,CAACiH,iBAAZ,CAA8Bza,MAA9B,CAAL,EAA4C;AAC1C,QAAIwT,WAAW,CAAC1U,MAAZ,CAAmBG,qBAAvB,EAA8C;AAC5C,aAAO+d,uBAAuB,CAC5B,8CAD4B,CAA9B;AAGD;AACF,GAlDiB;AAqDlB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAAOV,cAAc,CACnB/I,WADmB,EAEnBtI,OAFmB,EAGnB;AACEkI,IAAAA,KAAK,EAAE,SADT;AAEEpQ,IAAAA,WAAW,EAAE;AAFf,GAHmB,EAOnBwZ,WAPmB,CAArB,CAjEkB;AA2EnB,CAnFM;;AChDA,MAAMY,kBAAkB,GAAG,OAIhC5J,WAJgC,EAKhCtI,OALgC,EAMhCuI,WANgC,EAOhC4J,WAPgC,EAQhC;AACE7O,EAAAA,GAAG,EAAE8O,WADP;AAEEC,EAAAA,MAAM,EAAEC;AAFV,CARgC,KAeD;AAC/BtS,EAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,oBAAlB,EAAwC;AACtC0P,IAAAA,WADsC;AAEtCC,IAAAA,WAFsC;AAGtCE,IAAAA;AAHsC,GAAxC;AAMA,MAAInL,QAA2B,GAAGmB,WAAW,CAACvT,MAAZ,IAAsB,EAAxD;AACA,MAAI,CAACod,WAAL,EAAkB,OAAOhL,QAAP;AAElB,QAAMoL,aAAa,GAAG,IAAIrO,GAAJ,CAAgBiD,QAAQ,CAACxT,GAAT,CAAc8S,KAAD,IAAWA,KAAK,CAACxR,IAA9B,CAAhB,CAAtB;AAEA,QAAMud,KAAK,GAAG,IAAItO,GAAJ,EAAd;AACA,QAAMuO,UAAU,GAAG,IAAIvO,GAAJ,EAAnB;AACA,QAAMwO,QAAQ,GAAG,IAAIxO,GAAJ,EAAjB;AACA,QAAMyO,aAAa,GAAG,IAAIzO,GAAJ,EAAtB;AACA,QAAMnP,MAAM,GAAGwT,WAAW,CAACxT,MAA3B;;AAEA,QAAM6d,eAAe,GACnBtW,GADsB,IAEoB;AAC1C,UAAMuW,YAAY,GAAGtK,WAAW,CAAC1U,MAAZ,CAAmBkB,MAAnB,CAA0BI,MAA1B,CAAiCgd,WAAjC,CAArB;AACA,QAAI,CAACU,YAAL,EAAmB,OAAO1hB,SAAP;AAEnB,WAAO0hB,YAAY,CAACvW,GAAD,CAAZ,IAAqBvH,MAAM,CAAC8d,YAAY,CAACvW,GAAD,CAAb,CAA3B,GACHvH,MAAM,CAAC8d,YAAY,CAACvW,GAAD,CAAb,CADH,GAEHnL,SAFJ;AAGD,GATD;;AAWA,MAAIihB,WAAJ,EAAiB;AACfA,IAAAA,WAAW,CAACnR,OAAZ,CAAqB3E,GAAD,IAAS;AAC3B,UAAI,CAACA,GAAL,EAAU;AACV,YAAMmK,KAAK,GAAGmM,eAAe,CAACtW,GAAD,CAA7B;;AACA,UAAI,CAACmK,KAAD,IAAUU,QAAQ,CAAC7B,IAAT,CAAewN,OAAD,IAAaA,OAAO,CAAChkB,EAAR,KAAe2X,KAAK,CAAC3X,EAAhD,CAAd,EAAmE;AACjE;AACD;;AACDyjB,MAAAA,aAAa,CAACjP,GAAd,CAAkBmD,KAAK,CAACxR,IAAxB;AACAud,MAAAA,KAAK,CAAClP,GAAN,CAAUhH,GAAV;AACAmW,MAAAA,UAAU,CAACnP,GAAX,CAAemD,KAAK,CAACxR,IAArB;AACD,KATD;AAUD;;AAED,MAAIqd,cAAJ,EAAoB;AAClBA,IAAAA,cAAc,CAACrR,OAAf,CAAwB3E,GAAD,IAAS;AAC9B,UAAI,CAACA,GAAL,EAAU;AACV,YAAMmK,KAAK,GAAGmM,eAAe,CAACtW,GAAD,CAA7B;AACA,UAAI,CAACmK,KAAL,EAAY;AACZ,YAAMwG,QAAQ,GAAG9F,QAAQ,CAACzL,IAAT,CAAeoX,OAAD,IAAaA,OAAO,CAAChkB,EAAR,KAAe2X,KAAK,CAAC3X,EAAhD,CAAjB;;AACA,UAAIme,QAAJ,EAAc;AACZsF,QAAAA,aAAa,CAACnP,MAAd,CAAqB6J,QAAQ,CAAChY,IAA9B;AACAyd,QAAAA,QAAQ,CAACpP,GAAT,CAAahH,GAAb;AACAqW,QAAAA,aAAa,CAACrP,GAAd,CAAkB2J,QAAQ,CAAChY,IAA3B;AACD;AACF,KAVD;AAWD,GAtD8B;;;AA0D/BsT,EAAAA,WAAW,CAACzD,gBAAZ,CAA6BwD,WAAW,CAAC3V,IAAZ,CAAiBI,KAA9C,EAAqDkO,OAArD,CAA8D8C,QAAD,IAAc;AACzE,UAAM3I,IAAI,GAAGmN,WAAW,CAAC1U,MAAZ,CAAmBiB,KAAnB,CAAyBiP,QAAzB,CAAb;;AACA,QAAI3I,IAAI,CAACrG,MAAT,EAAiB;AACfqG,MAAAA,IAAI,CAACrG,MAAL,CAAYkM,OAAZ,CAAqBuM,QAAD,IAAc;AAChC,cAAM/G,KAAK,GAAG8B,WAAW,CAACxT,MAAZ,CAAmByY,QAAnB,CAAd;;AACA,YAAI/G,KAAK,IAAI,CAACU,QAAQ,CAAC7B,IAAT,CAAewN,OAAD,IAAaA,OAAO,CAAChkB,EAAR,KAAe2X,KAAK,CAAC3X,EAAhD,CAAd,EAAmE;AACjEyjB,UAAAA,aAAa,CAACjP,GAAd,CAAkBmD,KAAK,CAACxR,IAAxB;AACAud,UAAAA,KAAK,CAAClP,GAAN,CAAUkK,QAAV;AACAiF,UAAAA,UAAU,CAACnP,GAAX,CAAemD,KAAK,CAACxR,IAArB;AACD;AACF,OAPD;AAQD;AACF,GAZD,EA1D+B;;AA0E/B,MAAIud,KAAK,CAACO,IAAN,KAAe,CAAf,IAAoBL,QAAQ,CAACK,IAAT,KAAkB,CAA1C,EAA6C;AAC3C,QAAIL,QAAQ,CAACK,IAAT,KAAkB,CAAlB,IAAuBL,QAAQ,CAACK,IAAT,GAAgB,CAA3C,EAA8C;AAC5C/S,MAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,oBAAlB,EAAwC;AACtC0P,QAAAA,WADsC;AAEtCK,QAAAA,KAAK,EAAE,CAAC,GAAGA,KAAJ,CAF+B;AAGtCE,QAAAA,QAAQ,EAAE,CAAC,GAAGA,QAAJ,CAH4B;AAItCD,QAAAA,UAAU,EAAE,CAAC,GAAGA,UAAJ,CAJ0B;AAKtCE,QAAAA,aAAa,EAAE,CAAC,GAAGA,aAAJ;AALuB,OAAxC;;AAQA,UAAIH,KAAK,CAACO,IAAN,KAAe,CAAnB,EAAsB;AACpB,cAAMxgB,MAAM,GAAG,MAAMyN,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuBuI,SAAvB,CACnBhT,OAAO,CAAC9J,KAAR,CAAc;AACZnB,UAAAA,MAAM,EAAE,CAAC,GAAG0d,UAAJ;AADI,SAAd,CADmB,CAArB;AAKAtL,QAAAA,QAAQ,GAAG5U,MAAM,CAACO,IAAlB;AACD;;AAED,UAAI4f,QAAQ,CAACK,IAAT,KAAkB,CAAtB,EAAyB;AACvB,aAAK,MAAME,YAAX,IAA2B,CAAC,GAAGN,aAAJ,CAA3B,EAA+C;AAC7C,cAAI;AACF,kBAAMpgB,MAAM,GAAG,MAAMyN,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuByI,WAAvB,CACnBlT,OAAO,CAAC9J,KAAR,CAAc;AACZjB,cAAAA,IAAI,EAAEge;AADM,aAAd,CADmB,CAArB;AAKA9L,YAAAA,QAAQ,GAAG5U,MAAM,CAACO,IAAlB;AACD,WAPD,CAOE,OAAOoJ,GAAP,EAAY;AACZ8D,YAAAA,OAAO,CAACwC,GAAR,CAAY2N,IAAZ,CAAiB,sBAAjB,EAAyC;AACvCjU,cAAAA,GAAG,EAAEA,GAAF,aAAEA,GAAF,uBAAEA,GAAG,CAAEqG;AAD6B,aAAzC;AAGD;AACF;AACF;AACF,KAlCD,MAkCO;AACL,YAAM4Q,kBAAkB,GAAG,CAAC,GAAGZ,aAAJ,CAA3B;AAEAvS,MAAAA,OAAO,CAACwC,GAAR,CAAYC,KAAZ,CAAkB,oBAAlB,EAAwC;AACtC0P,QAAAA,WADsC;AAEtCK,QAAAA,KAAK,EAAE,CAAC,GAAGA,KAAJ,CAF+B;AAGtCE,QAAAA,QAAQ,EAAE,CAAC,GAAGA,QAAJ,CAH4B;AAItCU,QAAAA,SAAS,EAAEjM,QAAQ,CAACxT,GAAT,CAAcyT,CAAD,IAAOA,CAAC,CAACnS,IAAtB,CAJ2B;AAKtCsd,QAAAA,aAAa,EAAEY;AALuB,OAAxC;AAQA,YAAM5gB,MAAM,GAAG,MAAMyN,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuB4I,SAAvB,CACnBrT,OAAO,CAAC9J,KAAR,CAAc;AACZnB,QAAAA,MAAM,EAAEoe;AADI,OAAd,CADmB,CAArB;AAKAhM,MAAAA,QAAQ,GAAG5U,MAAM,CAACO,IAAlB;AACD;AACF,GA/H8B;AAkI/B;AACA;AACA;AACA;AACA;;;AACA,QAAMgf,2BAA2B,CAC/BxJ,WAD+B,EAE/BtI,OAF+B,EAG/BuI,WAH+B,EAI/BpB,QAJ+B,CAAjC,CAvI+B;;AA+I/B,SAAOA,QAAP;AACD,CA/JM;;ACJQ,SAASmM,MAAT,CAAgBjV,GAAhB,EAA6BsF,UAA7B,EAA2D;AACxEtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,qBADF,EAEEP,wBAAwB,CACtB1M,UADsB,EAErBzD,OAAD,IAAaA,OAAO,CAACqT,YAFC,EAGtB,OAAOjL,WAAP,EAAoBtI,OAApB,EAA6BuI,WAA7B,EAA0CC,mBAA1C,KAAkE;AAChE,QAAI,CAACD,WAAW,CAAC8F,YAAb,IAA6B7F,mBAAjC,EAAsD;AACpD,YAAMjL,IAAI,GAAGyC,OAAO,CAACE,OAAR,CAAgB9C,UAA7B;;AAEA,UAAIkL,WAAW,CAACgC,MAAhB,EAAwB;AACtB,cAAMkJ,SAAS,GAAGlL,WAAW,CAACZ,IAAZ,CAAiBnK,IAAjB,CAAsBzO,EAAtB,KAA6ByO,IAAI,CAACzO,EAApD;AACA,cAAMqX,OAAO,GAAGO,YAAY,CAC1B8B,mBAAmB,CAACqC,WADM,EAE1BtC,WAAW,CAAC1U,MAAZ,CAAmBI,gBAFO,CAA5B;AAKA,cAAMoG,OAAO,CAACC,GAAR,CAAY,CAChBiO,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,WAHF,CADgB,EAMhB6K,SAAS,IAAIrN,OAAO,CAAC9R,gBAArB,GACI2L,OAAO,CAACyD,OAAR,CAAgBgQ,GAAhB,CACGC,SADH,CAEI1T,OAAO,CAACzC,IAAR,CAAa;AAAEkK,UAAAA,GAAG,EAAG,SAAQa,WAAW,CAACZ,IAAZ,CAAiBD,GAAI;AAArC,SAAb,CAFJ,EAIGxL,KAJH,CAIS,MAAM,EAJf,CADJ,GAMI9K,SAZY,CAAZ,CAAN;AAcD,OArBD,MAqBO;AACL,cAAMkJ,OAAO,CAACC,GAAR,CAAY,CAChBiO,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,WAHF,CADgB,EAMhBuJ,kBAAkB,CAAC5J,WAAD,EAActI,OAAd,EAAuBuI,WAAvB,EAAoC,KAApC,EAA2C;AAC3D8J,UAAAA,MAAM,EAAE,CAAC,aAAD;AADmD,SAA3C,CANF,CAAZ,CAAN;AAUD;AACF;;AAED,QAAI/J,WAAW,CAACqL,SAAhB,EAA2B;AACzBrL,MAAAA,WAAW,CAACqL,SAAZ,CAAsB1S,OAAtB,CAA+B2S,QAAD,IAAc;AAC1CrL,QAAAA,WAAW,CAACnH,KAAZ,CAAkBvB,UAAlB,CAA6B+T,QAAQ,CAAC7gB,KAAtC;AACD,OAFD;AAGD;AACF,GA/CqB,CAF1B;AAoDD;;ACzDM,MAAM8gB,UAAU,GAAG,CAACzd,GAAD,EAAcwM,IAAd,KAAuC;AAC/D,SAAQ,IAAGxM,GAAI,IAAGwM,IAAK,GAAvB;AACD,CAFM;AAIA,MAAMkR,YAAY,GAAG,CAC1BxM,EAD0B,EAE1BiB,WAF0B,KAGf;AACX,SAAOsL,UAAU,CACfvM,EAAE,CAACyM,QADY,EAEd,GAAExL,WAAW,CAACkG,SAAZ,GAAyB,GAAElG,WAAW,CAACkG,SAAU,GAAjD,GAAsD,EAAG,GAC1DlG,WAAW,CAACU,YACb,IAAG3B,EAAE,CAACqB,MAAO,EAJC,CAAjB;AAMD,CAVM;;ACHA,MAAMqL,wBAAwB,GAAIpR,IAAD,KAA+B;AACrE9H,EAAAA,IAAI,EAAE,SAD+D;AAErE8H,EAAAA,IAAI,EAAE;AACJ9H,IAAAA,IAAI,EAAE,QADF;AAEJ8H,IAAAA;AAFI;AAF+D,CAA/B,CAAjC;AAQA,MAAMqR,oCAAoC,GAAG,CAClD1R,OADkD,EAElD2R,kBAFkD,KAGjC;AACjB,SAAO;AACLtR,IAAAA,IAAI,EAAEL,OADD;AAELM,IAAAA,MAAM,EAAE,CACN;AACE/H,MAAAA,IAAI,EAAE,SADR;AAEE8H,MAAAA,IAAI,EAAE;AACJ9H,QAAAA,IAAI,EAAE,QADF;AAEJ8H,QAAAA,IAAI,EAAEL;AAFF;AAFR,KADM,CAFH;AAWLQ,IAAAA,eAAe,EAAE,CAACmR,kBAAD,GACb/iB,SADa,GAEb,CAAC6iB,wBAAwB,CAACE,kBAAD,CAAzB;AAbC,GAAP;AAeD,CAnBM;;ACaP;AACO,MAAMC,yBAAyB,GAGpCjU,OAHuC,IAIT;AAC9B,QAAMoI,WAAsB,GAAIpI,OAAD,CAAiBqT,YAAhD;;AACA,MAAIjL,WAAJ,EAAiB;AACf,WAAOA,WAAP;AACD;;AAED,QAAMpS,KAAK,GAAIgK,OAAD,CAAiBhK,KAA/B;;AACA,MAAIA,KAAJ,aAAIA,KAAJ,eAAIA,KAAK,CAAEqd,YAAX,EAAyB;AACvB,WAAO,EACL,GAAGrd,KADE;AAEL,SAAGA,KAAK,CAACqd;AAFJ,KAAP;AAID;;AAED,QAAM,IAAI9kB,KAAJ,CAAU,4BAAV,CAAN;AACD,CAnBM;;ACRA,MAAM2lB,2BAA2B,GAAG,OACzCpU,OADyC,EAEzCuI,WAFyC,KAMrC;AACJ,QAAM8L,OAAO,GAAG,IAAInQ,GAAJ,EAAhB;AACA,QAAMoQ,SAAqB,GAAG,EAA9B;AACA,QAAMC,kBAAkB,GAAG,IAAI3b,GAAJ,EAA3B;AAEA,QAAMoH,OAAO,CAACyD,OAAR,CAAgBlJ,QAAhB,CACJyF,OAAO,CAACyD,OAAR,CAAgB2G,KAAhB,CAAsBoK,WADlB,EAEJxU,OAAO,CAACsI,WAAR,EAFI,EAGJ,CAAC;AACCxV,IAAAA,IAAI,EAAE2hB;AADP,GAAD,KAEmE;AACjEA,IAAAA,OAAO,CAACxT,OAAR,CAAiB9L,MAAD,IAAY;AAC1B,UAAI,CAACkf,OAAO,CAACzS,GAAR,CAAYzM,MAAM,CAACxC,IAAP,CAAY7D,EAAxB,CAAL,EAAkC;AAChCulB,QAAAA,OAAO,CAAC/Q,GAAR,CAAYnO,MAAM,CAACxC,IAAP,CAAY7D,EAAxB;AACAwlB,QAAAA,SAAS,CAAC1Z,IAAV,CAAe;AAAE9L,UAAAA,EAAE,EAAEqG,MAAM,CAACxC,IAAP,CAAY7D,EAAlB;AAAsBiE,UAAAA,KAAK,EAAEoC,MAAM,CAACxC,IAAP,CAAYI;AAAzC,SAAf;AACD;;AACD,YAAMmV,KAAK,GAAG/S,MAAM,CAAC+S,KAAP,CAAawM,WAAb,EAAd;;AACA,UAAIxM,KAAK,KAAK,WAAd,EAA2B;AACzBqM,QAAAA,kBAAkB,CAACnb,GAAnB,CAAuBjE,MAAM,CAACxC,IAAP,CAAY7D,EAAnC,EAAuCoZ,KAAvC;AACD;AACF,KATD;AAWA,WAAO,EAAP;AACD,GAlBG,CAAN;AAqBA,QAAMyM,YAA8C,GAAG,EAAvD;AAKA7V,EAAAA,OAAO,CAACyJ,WAAW,CAAC1U,MAAZ,CAAmBY,MAApB,CAAP,CAAmCwM,OAAnC,CAA4CV,SAAD,IAAe;AACxDoU,IAAAA,YAAY,CAACpU,SAAD,CAAZ,GAA0B;AACxB5K,MAAAA,QAAQ,EAAE,CADc;AAExBD,MAAAA,gBAAgB,EAAE,CAFM;AAGxBkf,MAAAA,SAAS,EAAE;AAHa,KAA1B;AAKD,GAND;AAQAN,EAAAA,SAAS,CAACrT,OAAV,CAAmB4T,QAAD,IAAc;AAC9B,UAAMtP,KAAK,GAAGgD,WAAW,CAAC1D,gBAAZ,CAA6BgQ,QAAQ,CAAC9hB,KAAtC,CAAd;;AACA,QAAIwS,KAAJ,EAAW;AACT,YAAM2C,KAAK,GAAGqM,kBAAkB,CAAC5iB,GAAnB,CAAuBkjB,QAAQ,CAAC/lB,EAAhC,CAAd;;AACA,cAAQoZ,KAAR;AACE,aAAK,UAAL;AACEyM,UAAAA,YAAY,CAACpP,KAAD,CAAZ,CAAoB5P,QAApB;AACA;;AACF,aAAK,mBAAL;AACEgf,UAAAA,YAAY,CAACpP,KAAD,CAAZ,CAAoB7P,gBAApB;AACA;;AACF,aAAK,WAAL;AACEif,UAAAA,YAAY,CAACpP,KAAD,CAAZ,CAAoBqP,SAApB;AACA;AATJ;AAWD;AACF,GAhBD;AAkBA,SAAO;AAAEN,IAAAA,SAAF;AAAaK,IAAAA;AAAb,GAAP;AACD,CAhEM;;ACfA,MAAMG,gBAAgB,GAAG,CAC9BvM,WAD8B,EAE9B5V,IAF8B,KAGlB;AACZ,MAAIA,IAAI,CAACmI,IAAL,KAAc,KAAlB,EAAyB,OAAO,IAAP;;AACzB,MAAIyN,WAAW,CAAC1U,MAAZ,CAAmBwC,QAAvB,EAAiC;AAC/B,WAAOkS,WAAW,CAAC1U,MAAZ,CAAmBwC,QAAnB,CAA4BmL,QAA5B,CAAqC7O,IAAI,CAACI,KAA1C,CAAP;AACD;;AACD,SAAO,KAAP;AACD,CATM;AAWA,MAAMgiB,gBAAgB,GAAIpiB,IAAD,IAGjB;AACb,SACEA,IAAI,CAACmI,IAAL,KAAc,KAAd,IAAuBnI,IAAI,CAACI,KAAL,KAAgB,GAAEzE,OAAO,CAACC,GAAR,CAAYgB,eAAgB,OADvE;AAGD,CAPM;;ACXP,MAAMylB,KAAK,GAAGC,oBAAW,CAAC,QAAD,EAAW;AAAEC,EAAAA,OAAO,EAAE,EAAX;AAAeC,EAAAA,aAAa,EAAE;AAA9B,CAAX,CAAzB;AAEO,MAAMC,aAAa,GAAIzY,IAAD,IAAqC;AAChE,SAAOqY,KAAK,CAACrY,IAAD,CAAL,CAAY0Y,QAAZ,CAAqB1hB,GAArB,CAA0BwN,CAAD,IAAOA,CAAC,CAACxO,IAAlC,CAAP;AACD,CAFM;;ACFA,MAAM2iB,mBAAmB,GAAG,CACjC3Y,IADiC,EAEjC4Y,aAFiC,KAGtB;AACX,SAAOC,yBAAgB,CACrB7Y,IAAI,CACDoK,OADH,CACW,eADX,EAC4B,oCAD5B,EAEGA,OAFH,CAGI,sBAHJ,EAIK,6BAA4BwO,aAAa,GAAG,GAAH,GAAS,EAAG,MAJ1D,CADqB,CAAvB;AAQD,CAZM;;ACiBP,MAAME,aAAa,GAAG,OACpBzV,OADoB,EAEpB6M,OAFoB,KAKjB;AACH,MAAI,CAACA,OAAO,CAAC6I,cAAb,EAA6B,OAAO,CAAC7I,OAAD,CAAP;AAC7B,SAAO7M,OAAO,CAACyD,OAAR,CAAgBlJ,QAAhB,CACLyF,OAAO,CAACyD,OAAR,CAAgB2G,KAAhB,CAAsBuL,YAAtB,CAAmClb,QAAnC,CAA4CC,KAA5C,CAAkDsF,OAAO,CAACsI,WAAR,EAAlD,CADK,EAEL,CAAC;AACCxV,IAAAA;AADD,GAAD,KAEoE;AAClE,WAAOA,IAAI,CAACyO,MAAL,CACJqU,CAAD,IACEA,CAAC,CAACF,cAAF,KAAqB7I,OAAO,CAAC6I,cAA7B,IACAE,CAAC,CAAC9mB,EAAF,KAAS+d,OAAO,CAAC6I,cAHd,CAAP;AAKD,GAVI,CAAP;AAYD,CAnBD;;AAqBA,MAAMG,WAAW,GACfC,UADkB,IAEL;AACb,QAAMT,QAAQ,GAAG,IAAInR,GAAJ,EAAjB;AAEA4R,EAAAA,UAAU,CAAC7U,OAAX,CAAoB2U,CAAD,IAAO;AACxBR,IAAAA,aAAa,CAACQ,CAAC,CAACjZ,IAAH,CAAb,CAAsBsE,OAAtB,CAA+BE,CAAD,IAAOkU,QAAQ,CAAC/R,GAAT,CAAanC,CAAb,CAArC;AACD,GAFD;AAIA,SAAO,CAAC,GAAGkU,QAAJ,CAAP;AACD,CAVD;;AAYA,MAAMU,gBAAgB,GACpBD,UADuB,IAEa;AACpC,QAAMzB,OAAO,GAAG,IAAInQ,GAAJ,EAAhB;AACA,QAAMtR,KAAsC,GAAG,EAA/C;AAEAkjB,EAAAA,UAAU,CAAC7U,OAAX,CAAoB2U,CAAD,IAAO;AACxB,QAAIvB,OAAO,CAACzS,GAAR,CAAYgU,CAAC,CAACjjB,IAAF,CAAO7D,EAAnB,CAAJ,EAA4B;AAC5BulB,IAAAA,OAAO,CAAC/Q,GAAR,CAAYsS,CAAC,CAACjjB,IAAF,CAAO7D,EAAnB;AACA8D,IAAAA,KAAK,CAACgI,IAAN,CAAW;AAAE9L,MAAAA,EAAE,EAAE8mB,CAAC,CAACjjB,IAAF,CAAO7D,EAAb;AAAiBiE,MAAAA,KAAK,EAAE6iB,CAAC,CAACjjB,IAAF,CAAOI;AAA/B,KAAX;AACD,GAJD;AAMA,SAAOH,KAAP;AACD,CAbD;;AAee,SAASojB,gBAAT,CACb3X,GADa,EAEbsF,UAFa,EAGP;AACN,QAAMsS,QAAQ,GAAG,OACfnb,IADe,EAEfyR,SAFe,EAGflI,YAHe,EAIf6R,OAJe,EAKf3T,OALe,KAMG;AAClB,UAAM4T,QAAQ,GAAGD,OAAO,CAAC3U,MAAR,CAAe5C,eAAf,CAAjB;AACA,QAAIwX,QAAQ,CAAC1Y,MAAT,KAAoB,CAAxB,EAA2B;AAE3B,UAAMkG,UAAU,CAACrK,WAAX,CAAuB8c,iBAAvB,CAAyChN,SAAzC,CAAmD;AACvDtO,MAAAA,IADuD;AAEvDub,MAAAA,MAAM,EAAE9J,SAF+C;AAGvDhK,MAAAA,OAHuD;AAIvDtC,MAAAA,OAAO,EAAEoE,YAJ8C;AAKvDiS,MAAAA,MAAM,EAAEH;AAL+C,KAAnD,CAAN;AAOD,GAjBD;;AAmBA9X,EAAAA,GAAG,CAACuS,EAAJ,CACE,CACE,qCADF;AAGE;AACA,yBAJF,CADF,EAOEP,wBAAwB,CAStB1M,UATsB,EAUrBzD,OAAD,IAAsB;AACpB,QAAI6U,gBAAgB,CAAC7U,OAAO,CAAC2M,OAAR,CAAgBla,IAAjB,CAApB,EAA4C;AAC1C;AACA,aAAO,IAAP;AACD;;AACD,WAAOwhB,yBAAyB,CAACjU,OAAD,CAAhC;AACD,GAhBqB,EAiBtB,OACEoI,WADF,EAEEtI,OAFF,EAGEuI,WAHF,KAKoB;AAClB,UAAMjB,EAAE,GAAG,MAAM6F,OAAO,CAACnN,OAAD,EAAUsI,WAAW,CAACK,MAAtB,CAAxB;AACA,UAAM;AAAEkE,MAAAA;AAAF,QAAc7M,OAAO,CAACE,OAA5B;AACA,UAAMpF,IAAI,GAAI+R,OAAD,CAAiB0J,sBAAjB,GACT,gBADS,GAET,eAFJ;AAIA,UAAM5Z,IAAI,GAAGkQ,OAAO,CAAClQ,IAArB;AACA,QAAI,CAACA,IAAL,EAAW;AAEX,UAAM6Z,cAAc,GAAGlP,EAAE,CAAC3U,IAAH,CAAQI,KAAR,KAAkB8Z,OAAO,CAACla,IAAR,CAAaI,KAAtD;AACA,UAAM,CAAC+iB,UAAD,EAAa;AAAExB,MAAAA;AAAF,KAAb,IAA8B,MAAMja,OAAO,CAACC,GAAR,CAAY,CACpDmb,aAAa,CAACzV,OAAD,EAAU6M,OAAV,CADuC,EAEpDuH,2BAA2B,CAACpU,OAAD,EAAUuI,WAAV,CAFyB,CAAZ,CAA1C;AAKA,UAAMkO,SAAS,GAAGnC,SAAS,CAAC/S,MAAV,CACftD,CAAD,IAAOA,CAAC,CAACnP,EAAF,KAASwY,EAAE,CAAC3U,IAAH,CAAQ7D,EAAjB,IAAuBmP,CAAC,CAACnP,EAAF,KAAS+d,OAAO,CAACla,IAAR,CAAa7D,EADpC,CAAlB;;AAIA,QAAIwY,EAAE,CAACoC,mBAAP,EAA4B;AAC1B+M,MAAAA,SAAS,CAAC7b,IAAV,CACE,GAAG0M,EAAE,CAACoC,mBAAH,CAAuBnI,MAAvB,CAA+ByQ,EAAD,IAAQ;AACvC,eACE,CAACyE,SAAS,CAAC/a,IAAV,CAAgBgb,CAAD,IAAOA,CAAC,CAAC5nB,EAAF,KAASkjB,EAAE,CAACljB,EAAlC,CAAD,IACAkjB,EAAE,CAACljB,EAAH,KAAU+d,OAAO,CAACla,IAAR,CAAa7D,EADvB,IAEAkjB,EAAE,CAACljB,EAAH,KAAUwY,EAAE,CAAC3U,IAAH,CAAQ7D,EAHpB;AAKD,OANE,CADL;AASD;;AAED,UAAM6nB,aAAa,GAAGZ,gBAAgB,CAACD,UAAD,CAAhB,CAA6BvU,MAA7B,CACnBtD,CAAD,IACEA,CAAC,CAACnP,EAAF,KAASwY,EAAE,CAAC3U,IAAH,CAAQ7D,EAAjB,IACAmP,CAAC,CAACnP,EAAF,KAAS+d,OAAO,CAACla,IAAR,CAAa7D,EADtB,IAEA,CAAC2nB,SAAS,CAAC/a,IAAV,CAAgBgb,CAAD,IAAOA,CAAC,CAAC5nB,EAAF,KAASmP,CAAC,CAACnP,EAAjC,CAJiB,CAAtB;AAMA,UAAMumB,QAAQ,GAAGQ,WAAW,CAACC,UAAD,CAAX,CAAwBvU,MAAxB,CACdJ,CAAD,IACEA,CAAC,KAAKmG,EAAE,CAAC3U,IAAH,CAAQI,KAAd,IACAoO,CAAC,KAAK0L,OAAO,CAACla,IAAR,CAAaI,KADnB,IAEA,CAAC0jB,SAAS,CAAC/a,IAAV,CAAgBgb,CAAD,IAAOA,CAAC,CAAC3jB,KAAF,KAAYoO,CAAlC,CAFD,IAGA,CAACwV,aAAa,CAACjb,IAAd,CAAoBuC,CAAD,IAAOA,CAAC,CAAClL,KAAF,KAAYoO,CAAtC,CALY,CAAjB;AAQA,UAAM5B,OAAO,GAAGgJ,WAAW,CAACnH,KAAZ,CAAkB7B,OAAlB,CAA0BsN,OAAO,CAACla,IAAR,CAAaI,KAAvC,CAAhB;AACA,UAAM6jB,KAAK,GAAGC,YAAA,CAAwBvP,EAAxB,EAA4BiB,WAA5B,CAAd;AACA,UAAMuO,YAAY,GAAGvO,WAAW,CAACnH,KAAZ,CAAkB7B,OAAlB,CAA0B+H,EAAE,CAAC3U,IAAH,CAAQI,KAAlC,CAArB;AACA,UAAMgkB,WAAW,GAAGF,UAAA,CAClBhK,OAAO,CAACkH,QADU,EAEjBlH,OAAD,CAAiB6I,cAAjB,GAAkC,SAAlC,GAA8C,WAF5B,CAApB;;AAKA,UAAMsB,aAAa,GAAIC,OAAD,IAA+B;AACnD,YAAMC,SAAS,GAAGD,OAAO,GACrB,SADqB,GAEpB,GACC3P,EAAE,CAAC3U,IAAH,CAAQ7D,EAAR,KAAe+d,OAAO,CAACla,IAAR,CAAa7D,EAA5B,GAAiC,KAAjC,GAA0C,GAAEgoB,YAAa,IAC1D,KAJL;AAKA,aAAQ,oBAAmBvX,OAAQ,IAAGwX,WAAY,OAAMG,SAAU,IAAGN,KAAM,EAA3E;AACD,KAPD;;AASA,UAAMO,aAAa,GAAG,EAAtB;AACA,UAAMC,gBAAgB,GAAG,EAAzB;AACA,UAAMC,cAAc,GAAG/B,mBAAmB,CACxCzI,OAAO,CAAClQ,IADgC,EAEvCkQ,OAAD,CAAiByK,UAAjB,KAAgC,IAFQ,CAA1C;AAIA,UAAMC,SAAS,GAAGzC,gBAAgB,CAACvM,WAAD,EAAcsE,OAAO,CAACla,IAAtB,CAAlC;;AAEA,QAAI,CAAC6jB,cAAL,EAAqB;AACnB,YAAMgB,YAAY,GAAGvD,oCAAoC,CACvD+C,aAAa,CAAC,IAAD,CAD0C,EAEvDK,cAFuD,CAAzD;AAKAF,MAAAA,aAAa,CAACvc,IAAd,CACE2N,WAAW,CAACnH,KAAZ,CACG5B,WADH,CAEI+X,SAAS,GAAG,iBAAH,GAAuB,YAFpC,EAGIjQ,EAAE,CAAC3U,IAAH,CAAQ7D,EAHZ,EAIIwY,EAAE,CAAC3U,IAAH,CAAQI,KAJZ,EAKIykB,YALJ,EAOG1R,IAPH,CAOS9U,GAAD,IACJilB,QAAQ,CACNnb,IADM,EAEN+R,OAAO,CAAC/d,EAFF,EAGNyZ,WAAW,CAAClE,YAHN,EAIN,CAACrT,GAAD,CAJM,EAKNwmB,YALM,CARZ,CADF;AAkBD;;AAED,UAAMjV,OAAO,GAAG0R,oCAAoC,CAClD+C,aAAa,CAAC,KAAD,CADqC,EAElDK,cAFkD,CAApD;AAKAD,IAAAA,gBAAgB,CAACxc,IAAjB,CACE,GAAG6b,SAAS,CAAC9iB,GAAV,CAAe8jB,QAAD,IACflP,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACE+X,SAAS,GAAG,wBAAH,GAA8B,mBADzC,EAEEE,QAAQ,CAAC3oB,EAFX,EAGE2oB,QAAQ,CAAC1kB,KAHX,EAIEwP,OAJF,CADC,CADL;AAWA6U,IAAAA,gBAAgB,CAACxc,IAAjB,CACE,GAAG+b,aAAa,CAAChjB,GAAd,CAAmBhB,IAAD,IACnB4V,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACE,mBADF,EAEE7M,IAAI,CAAC7D,EAFP,EAGE6D,IAAI,CAACI,KAHP,EAIEwP,OAJF,CADC,CADL;;AAWA,QAAI8S,QAAQ,CAAC5X,MAAT,GAAkB,CAAtB,EAAyB;AACvB,YAAMkG,UAAU,CAACrK,WAAX,CAAuB1G,KAAvB,CACHkO,OADG,CACK;AAAE/N,QAAAA,KAAK,EAAE;AAAEkI,UAAAA,GAAG,EAAEoa;AAAP;AAAT,OADL,EAEHvP,IAFG,CAEGlT,KAAD,IAAW;AACfwkB,QAAAA,gBAAgB,CAACxc,IAAjB,CACE,GAAGhI,KAAK,CAACe,GAAN,CAAWsK,CAAD,IACXsK,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACE,oBADF,EAEEvB,CAAC,CAAC/D,GAFJ,EAGE+D,CAAC,CAAClL,KAHJ,EAIEwP,OAJF,CADC,CADL;AAUD,OAbG,CAAN;AAcD;;AAED,UAAMlI,OAAO,CAACC,GAAR,CAAY,CAChBD,OAAO,CAACC,GAAR,CAAY6c,aAAZ,CADgB,EAEhB9c,OAAO,CAACC,GAAR,CAAY8c,gBAAZ,EAA8BtR,IAA9B,CAAoCoQ,OAAD,IACjCD,QAAQ,CACNnb,IADM,EAEN+R,OAAO,CAAC/d,EAFF,EAGNyZ,WAAW,CAAClE,YAHN,EAIN6R,OAJM,EAKN3T,OALM,CADV,CAFgB,CAAZ,CAAN;AAYD,GA/KqB,CAP1B;AAyLD;;AC5QD,MAAMmV,mBAAmB,GAAG,OAG1B1X,OAH0B,EAI1BwI,mBAJ0B,EAK1BmP,OAL0B,KAMR;AAClB,QAAM3X,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuBmN,aAAvB,CACJ5X,OAAO,CAACzC,IAAR,CAAa;AACXkP,IAAAA,UAAU,EAAEjE,mBAAmB,CAACsE,YAApB,CAAiCP,SADlC;AAEX5P,IAAAA,IAAI,EAAEgb;AAFK,GAAb,CADI,CAAN;AAMAnP,EAAAA,mBAAmB,CAACqC,WAApB,GAAkC8M,OAAlC;AACD,CAdD;;AAgBO,MAAME,2BAA2B,GAAG,OAGzC7X,OAHyC,EAIzCwI,mBAJyC,EAKzCmP,OALyC,KAMvB;AAClB,MAAInP,mBAAmB,CAACqC,WAApB,KAAoC8M,OAAxC,EAAiD;AAC/C,UAAMD,mBAAmB,CAAC1X,OAAD,EAAUwI,mBAAV,EAA+BmP,OAA/B,CAAzB;AACD;AACF,CAVM;AAYA,MAAMG,0BAA0B,GAAG,OAGxC9X,OAHwC,EAIxCuI,WAJwC,EAKxCC,mBALwC,EAMxCgD,aANwC,KAOtB;AAClB,QAAM;AAAEX,IAAAA,WAAW,EAAE8M;AAAf,MAA2B9L,oBAAoB,CACnDrD,mBAAmB,CAACqC,WAD+B,EAEnDtC,WAAW,CAAC1U,MAAZ,CAAmBI,gBAFgC,EAGnDuX,aAHmD,CAArD;AAMA,QAAMqM,2BAA2B,CAAC7X,OAAD,EAAUwI,mBAAV,EAA+BmP,OAA/B,CAAjC;AACD,CAfM;;ACxBQ,eAAeI,SAAf,CAGbzP,WAHa,EAIbtI,OAJa,EAKbgY,eALa,EAMbvR,KANa,EAObwR,UAAU,GAAG/Q,YAAY,CAACoB,WAAW,CAACvT,MAAb,EAAqB0R,KAArB,CAPZ,EAQb;AAAEyR,EAAAA,QAAF;AAAYC,EAAAA;AAAZ,IAAwC,EAR3B,EASE;AACf,MAAIF,UAAU,IAAI,CAACD,eAAnB,EAAoC;AAClC,UAAMhY,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuByI,WAAvB,CACJlT,OAAO,CAAC9J,KAAR,CAAc;AAAEjB,MAAAA,IAAI,EAAEwR,KAAK,CAACxR;AAAd,KAAd,CADI,CAAN;AAGA,QAAIijB,QAAJ,EAAc,MAAMA,QAAQ,EAAd;AACf;;AACD,MAAIF,eAAe,IAAI,CAACC,UAAxB,EAAoC;AAClC,UAAMG,QAAQ,GAAG,MAAMpY,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuBuI,SAAvB,CACrBhT,OAAO,CAAC9J,KAAR,CAAc;AAAEnB,MAAAA,MAAM,EAAE,CAAC0R,KAAK,CAACxR,IAAP;AAAV,KAAd,CADqB,CAAvB;AAGA,QAAIkjB,KAAJ,EAAW,MAAMA,KAAK,CAACC,QAAQ,CAACtlB,IAAV,CAAX;AACZ;AACF;;ACnBM,MAAMulB,kBAAkB,GAAG,CAChC9P,WADgC,EAEhCD,WAFgC,KAGpB;AACZ,QAAMgQ,kBAAkB,GAAG/P,WAAW,CAACxT,MAAZ,CAAmB,gBAAnB,CAA3B;AACA,QAAMwjB,cAAc,GAAGhQ,WAAW,CAACxT,MAAZ,CAAmB,iBAAnB,CAAvB;AACA,QAAMyjB,WAAW,GAAGjQ,WAAW,CAACxT,MAAZ,CAAmB,eAAnB,CAApB;AAEA,QAAM0jB,uBAAuB,GAAGvR,YAAY,CAC1CoB,WAAW,CAACvT,MAD8B,EAE1CujB,kBAF0C,CAA5C;AAIA,QAAMI,gBAAgB,GAAGxR,YAAY,CAACoB,WAAW,CAACvT,MAAb,EAAqByjB,WAArB,CAArC;AACA,QAAMG,mBAAmB,GAAGzR,YAAY,CAACoB,WAAW,CAACvT,MAAb,EAAqBwjB,cAArB,CAAxC;AAEA,SAAO,EACL,GAAGhQ,WAAW,CAAC1U,MAAZ,CAAmBI,gBADjB;AAELC,IAAAA,aAAa,EAAEukB,uBAFV;AAGLtkB,IAAAA,mBAAmB,EAAEukB,gBAHhB;AAILtkB,IAAAA,SAAS,EAAEukB;AAJN,GAAP;AAMD,CArBM;AAuBA,MAAMC,gCAAgC,GAAG,OAC9CtQ,WAD8C,EAE9CtI,OAF8C,EAG9CuI,WAH8C,EAI9CC,mBAJ8C,KAK5B;AAClB,QAAM8P,kBAAkB,GAAG/P,WAAW,CAACxT,MAAZ,CAAmB,gBAAnB,CAA3B;AACA,QAAMwjB,cAAc,GAAGhQ,WAAW,CAACxT,MAAZ,CAAmB,iBAAnB,CAAvB;AACA,QAAMyjB,WAAW,GAAGjQ,WAAW,CAACxT,MAAZ,CAAmB,eAAnB,CAApB;AAEA,QAAM0jB,uBAAuB,GAAGvR,YAAY,CAC1CoB,WAAW,CAACvT,MAD8B,EAE1CujB,kBAF0C,CAA5C;AAIA,QAAMI,gBAAgB,GAAGxR,YAAY,CAACoB,WAAW,CAACvT,MAAb,EAAqByjB,WAArB,CAArC;AACA,QAAMG,mBAAmB,GAAGzR,YAAY,CAACoB,WAAW,CAACvT,MAAb,EAAqBwjB,cAArB,CAAxC;AAEA,QAAM;AAAE1N,IAAAA,WAAF;AAAe1E,IAAAA;AAAf,MAA2B0F,oBAAoB,CACnDrD,mBAAmB,CAACqC,WAD+B,EAEnDwN,kBAAkB,CAAC9P,WAAD,EAAcD,WAAd,CAFiC,CAArD;AAKA,QAAMuP,2BAA2B,CAAC7X,OAAD,EAAUwI,mBAAV,EAA+BqC,WAA/B,CAAjC;;AAEA,MAAI1E,OAAO,KAAKmS,kBAAkB,IAAIC,cAA3B,CAAX,EAAuD;AACrD,UAAMle,OAAO,CAACC,GAAR,CAAY,CAChBge,kBAAkB,IAChBP,SAAS,CACPzP,WADO,EAEPtI,OAFO,EAGPmG,OAAO,CAACjS,aAHD,EAIPokB,kBAJO,EAKPG,uBALO,CAFK,EAShBD,WAAW,IACTT,SAAS,CACPzP,WADO,EAEPtI,OAFO,EAGPmG,OAAO,CAAChS,mBAHD,EAIPqkB,WAJO,EAKPE,gBALO,CAVK,EAiBhBH,cAAc,IACZR,SAAS,CACPzP,WADO,EAEPtI,OAFO,EAGPmG,OAAO,CAAC/R,SAHD,EAIPmkB,cAJO,EAKPI,mBALO,EAMP;AACER,MAAAA,KAAK,EAAE,MAAOhR,QAAP,IAAoB;AACzB,cAAMkB,mBAAmB,CACvBC,WADuB,EAEvBtI,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,EAKvBrB,QALuB,CAAzB;AAOD,OATH;AAUE+Q,MAAAA,QAAQ,EAAE,MAAM;AACd3P,QAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,eAHF;AAKD;AAhBH,KANO,CAlBK,CAAZ,CAAN;AA4CD;AACF,CAtEM;;ACzBQ,SAASkQ,wBAAT,CACbxa,GADa,EAEbsF,UAFa,EAGP;AACNtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,CACE,oCADF,EAEE,qCAFF;AAIE;AACA,wBALF,EAME,uBANF,CADF,EASEP,wBAAwB,CAStB1M,UATsB,EAUrBzD,OAAD,IAAa;AACX,QAAI6U,gBAAgB,CAAC7U,OAAO,CAAC4Y,MAAT,CAApB,EAAsC;AACpC;AACA,aAAO,IAAP;AACD;;AACD,WAAO3E,yBAAyB,CAACjU,OAAD,CAAhC;AACD,GAhBqB,EAiBtB,OACEoI,WADF,EAEEtI,OAFF,EAGEuI,WAHF,EAIEC,mBAJF,KAKoB;AAClB,UAAM;AAAEqE,MAAAA;AAAF,QAAc7M,OAAO,CAACE,OAA5B;;AAEA,QACEsI,mBAAmB,KAAK,IAAxB,IACAxI,OAAO,CAACE,OAAR,CAAgB8I,MAAhB,KAA2B,QAD3B,IAEA+L,gBAAgB,CAAClI,OAAO,CAACla,IAAT,CAHlB,EAIE;AACA,YAAMoe,SAAS,GAAG,MAAM5D,OAAO,CAACnN,OAAD,EAAUsI,WAAW,CAACK,MAAtB,CAA/B;;AACA,UAAI,CAACoI,SAAS,CAACgI,SAAf,EAA0B;AACxB,cAAMH,gCAAgC,CACpC7H,SADoC,EAEpC/Q,OAFoC,EAGpCuI,WAHoC,EAIpCC,mBAJoC,CAAtC;AAMD;;AACD;AACD;;AAED,UAAM1N,IAAI,GAAI+R,OAAD,CAAiB0J,sBAAjB,GACT,gBADS,GAET,eAFJ;AAIA,UAAMyC,QAAQ,GAAG;AACf,oBAAczQ,WAAW,CAACtI,OAAZ,CAAoB/F,GADnB;AAEf,sBAAgBqO,WAAW,CAACjE,WAFb;AAGfxJ,MAAAA,IAHe;AAIfub,MAAAA,MAAM,EAAExJ,OAAO,CAAC/d;AAJD,KAAjB;AAOA,UAAMmqB,YAAY,GAAG,MAAMtV,UAAU,CAACrK,WAAX,CAAuB8c,iBAAvB,CAAyCtV,OAAzC,CACzBkY,QADyB,CAA3B;AAIA,QAAIC,YAAY,CAACxb,MAAb,KAAwB,CAA5B,EAA+B;;AAE/B,QAAIuC,OAAO,CAACE,OAAR,CAAgB8I,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,YAAM3O,OAAO,CAACC,GAAR,CAAY,CAChBD,OAAO,CAACC,GAAR,CACE2e,YAAY,CAACtlB,GAAb,CAAkBulB,WAAD,IACf7e,OAAO,CAACC,GAAR,CACE4e,WAAW,CAAC5C,MAAZ,CAAmB3iB,GAAnB,CAAwB2iB,MAAD,IACrB/N,WAAW,CAACnH,KAAZ,CAAkBzB,aAAlB,CAAgC2W,MAAM,CAACrT,EAAvC,EAA2CqT,MAAM,CAACtU,OAAlD,CADF,CADF,CADF,CADF,CADgB,EAUhB2B,UAAU,CAACrK,WAAX,CAAuB8c,iBAAvB,CAAyCrb,UAAzC,CAAoDie,QAApD,CAVgB,CAAZ,CAAN;AAYD,KAbD,MAaO;AACL,YAAMjW,eAAe,GAAG,CACtBiR,wBAAwB,CACtBsB,mBAAmB,CACjBzI,OAAO,CAAClQ,IADS,EAEhBkQ,OAAD,CAAiByK,UAAjB,KAAgC,IAFf,CADG,CADF,CAAxB;AASA,YAAMjd,OAAO,CAACC,GAAR,CAAY,CAChBD,OAAO,CAACC,GAAR,CACE2e,YAAY,CAACtlB,GAAb,CAAkBulB,WAAD,IACf7e,OAAO,CAACC,GAAR,CACE4e,WAAW,CAAC5C,MAAZ,CAAmB3iB,GAAnB,CAAwB2iB,MAAD,IACrB/N,WAAW,CAACnH,KAAZ,CAAkB1B,aAAlB,CAAgC4W,MAAM,CAACrT,EAAvC,EAA2CqT,MAAM,CAACtU,OAAlD,EAA2D,EACzD,GAAGkX,WAAW,CAAC3W,OAD0C;AAEzDQ,QAAAA;AAFyD,OAA3D,CADF,CADF,CADF,CADF,CADgB,EAahBY,UAAU,CAACrK,WAAX,CAAuB8c,iBAAvB,CAAyCvU,iBAAzC,CACEmX,QADF,EAEE;AAAElc,QAAAA,IAAI,EAAE;AAAE,qCAA2BiG;AAA7B;AAAR,OAFF,CAbgB,CAAZ,CAAN;AAkBD;AACF,GArGqB,CAT1B;AAiHD;;AChHM,MAAMoW,yBAAyB,GAAG,OAGvC7Q,WAHuC,EAIvCtI,OAJuC,EAKvCuI,WALuC,EAMvCC,mBANuC,EAOvCqC,WAAW,GAAGrC,mBAAmB,CAACqC,WAPK,KAQrB;AAClB;AACA;AAEA,QAAMuO,OAAO,GAAG,MAAMpZ,OAAO,CAACyD,OAAR,CAAgBlJ,QAAhB,CACpByF,OAAO,CAACyD,OAAR,CAAgB2G,KAAhB,CAAsBiP,WADF,EAEpBrZ,OAAO,CAACsI,WAAR,CAAoB;AAClB;AACAhL,IAAAA,QAAQ,EAAE;AAFQ,GAApB,CAFoB,EAMnBtM,GAAD,IAASA,GAAG,CAAC8B,IANO,CAAtB;AASA,QAAMwmB,mBAAmB,GAAG,MAAMjf,OAAO,CAACC,GAAR,CAChC8e,OAAO,CAACzlB,GAAR,CAAaiiB,CAAD,IAAOZ,cAAK,CAACY,CAAC,CAAC2D,MAAF,CAAShX,OAAV,CAAxB,CADgC,CAAlC;AAIA,QAAMiX,sBAAgD,GAAG,EAAzD;AACAF,EAAAA,mBAAmB,CAACrY,OAApB,CAA4B,CAAC2U,CAAD,EAAI6D,KAAJ,KAAc;AACxC,UAAMC,oBAAoB,GAAG9D,CAAC,CAAC+D,KAAF,CAAQpY,MAAR,CAC1BqY,IAAD,IAAUA,IAAI,CAACtqB,KAAL,KAAe,iBADE,CAA7B;;AAGA,QAAIoqB,oBAAoB,CAACjc,MAArB,GAA8B,CAAlC,EAAqC;AACnC+b,MAAAA,sBAAsB,CAAC5e,IAAvB,CAA4B;AAC1B2e,QAAAA,MAAM,EAAEH,OAAO,CAACK,KAAD,CADW;AAE1BC,QAAAA;AAF0B,OAA5B;AAID;AACF,GAVD;AAYA,QAAMG,oBAAoB,GAAGtR,WAAW,CAACxT,MAAZ,CAAmB,kBAAnB,CAA7B;AACA,QAAM+kB,cAAc,GAAG9N,6BAA6B,CAClDnB,WADkD,EAElD2O,sBAAsB,CAAC/b,MAAvB,KAAkC,CAAlC,GACI,EADJ,GAEK,sBAAqB+b,sBAAsB,CACzC7lB,GADmB,CACf,CAAC;AAAE4lB,IAAAA,MAAF;AAAUG,IAAAA;AAAV,GAAD,KACHA,oBAAoB,CAAC/lB,GAArB,CACGimB,IAAD,IAAW,KAAIA,IAAI,CAAChX,IAAL,CAAUmE,OAAV,CAAkB,IAAlB,EAAwB,GAAxB,CAA6B,KAAIwS,MAAM,CAAC5R,GAAI,GAD7D,CAFkB,EAMnByD,IANmB,CAMd,EANc,CAMV,EAVkC,CAApD;AAaA,QAAM/Q,OAAO,CAACC,GAAR,CAAY,CAChByd,SAAS,CACPzP,WADO,EAEPtI,OAFO,EAGPwZ,sBAAsB,CAAC/b,MAAvB,KAAkC,CAH3B,EAIPoc,oBAJO,CADO,EAOhBhC,2BAA2B,CAAC7X,OAAD,EAAUwI,mBAAV,EAA+BsR,cAA/B,CAPX,CAAZ,CAAN,CA5CkB;AAuDnB,CA/DM;;ACRP,MAAMC,aAAa,GAAInX,IAAD,IAA0BA,IAAI,CAACmE,OAAL,CAAa,OAAb,EAAsB,IAAtB,CAAhD;;AACA,MAAMiT,cAAc,GAAG,CAACC,KAAD,EAAgBC,KAAhB,KACrBH,aAAa,CAACE,KAAD,CAAb,KAAyBF,aAAa,CAACG,KAAD,CADxC;;AAGO,MAAMC,gBAAgB,GAAG,OAG9B7R,WAH8B,EAI9BtI,OAJ8B,EAK9BmD,MAL8B,KAMZ;AAClB,QAAMiX,cAAc,GAAGjX,MAAM,CAAC7T,KAAP,IAAgBgZ,WAAW,CAAChZ,KAAZ,KAAsB6T,MAAM,CAAC7T,KAApE;AACA,QAAM+qB,aAAa,GACjBlX,MAAM,CAACxG,IAAP,IAAeqd,cAAc,CAAC1R,WAAW,CAAC3L,IAAb,EAAmBwG,MAAM,CAACxG,IAA1B,CAD/B;;AAGA,MAAIyd,cAAc,IAAIC,aAAtB,EAAqC;AACnC,UAAMC,IAA+C,GAAG,EAAxD;;AACA,QAAIF,cAAJ,EAAoB;AAClBE,MAAAA,IAAI,CAAChrB,KAAL,GAAa6T,MAAM,CAAC7T,KAApB;AACAgZ,MAAAA,WAAW,CAAChZ,KAAZ,GAAoB6T,MAAM,CAAC7T,KAA3B;AACD;;AACD,QAAI+qB,aAAJ,EAAmB;AACjBC,MAAAA,IAAI,CAAC3d,IAAL,GAAYwG,MAAM,CAACxG,IAAnB;AACA2L,MAAAA,WAAW,CAAC3L,IAAZ,GAAmBwG,MAAM,CAACxG,IAA1B;AACD;;AAED,UAAMqD,OAAO,CAACyD,OAAR,CAAgB2G,KAAhB,CAAsBjH,MAAtB,CACJnD,OAAO,CAACzC,IAAR,CAAa;AACX8M,MAAAA,WAAW,EAAE/B,WAAW,CAACK,MADd;AAEX,SAAG2R;AAFQ,KAAb,CADI,CAAN;AAMD;AACF,CA7BM;;ACbA,MAAMC,UAAU,GAAIjrB,KAAD,IACxBA,KAAK,CACF0X,IADH,GAEGD,OAFH,CAGI,qDAHJ,EAII,CAACyT,CAAD,EAAIC,IAAJ,EAAUC,IAAV,KAAoB,IAAGD,IAAI,CAAC/F,WAAL,EAAmB,IAAGgG,IAAK,EAJtD,EAMG3T,OANH,CAMW,qBANX,EAMkC,CAACyT,CAAD,EAAIC,IAAJ,KAAc,GAAEA,IAAI,CAACE,WAAL,EAAmB,IANrE,EAOG5T,OAPH,CAOW,oBAPX,EAOiC,YAPjC,EAQGA,OARH,CAQW,iCARX,EAQ8C,aAR9C;AAAA,CAUGA,OAVH,CAUW,4BAVX,EAUyC,IAVzC,CADK;;ACkCA,MAAM6T,YAAY,GAAG,OAG1BtS,WAH0B,EAI1BtI,OAJ0B,EAK1BuI,WAL0B,EAM1BC,mBAN0B,EAO1BqS,4BAP0B,EAQ1BvJ,WAR0B,KASR;AAClB,MAAI9I,mBAAmB,KAAK,IAA5B,EAAkC;AAElC,QAAMlZ,KAAK,GAAGiZ,WAAW,CAAC1U,MAAZ,CAAmBE,SAAnB,GACVwmB,UAAU,CAACjS,WAAW,CAAChZ,KAAb,CADA,GAEVgZ,WAAW,CAAChZ,KAFhB;AAIA,QAAMwrB,WAAW,GAAGxS,WAAW,CAAC3V,IAAZ,CAAiBmI,IAAjB,KAA0B,KAA9C;AAEA,QAAMsN,QAAkB,GAAG,EAA3B;AAEA,QAAM2S,SAAS,GAAGxS,WAAW,CAAC1U,MAAZ,CAAmBS,OAAnB,CAA2BhF,KAA3B,CAAiCoM,IAAjC,CAAuCsf,IAAD,IAAU;AAChE,QAAIA,IAAI,CAACllB,GAAL,KAAa,KAAb,IAAsBglB,WAA1B,EAAuC,OAAO,KAAP;AAEvC,UAAM7kB,KAAK,GAAG+kB,IAAI,CAACzmB,MAAL,CAAY8K,IAAZ,CAAiB/P,KAAjB,CAAd;;AACA,QAAI2G,KAAK,KAAK,IAAd,EAAoB;AAClB,UAAI+kB,IAAI,CAACjlB,MAAT,EAAiB;AACfqS,QAAAA,QAAQ,CAACxN,IAAT,CAAc;AAAE3F,UAAAA,IAAI,EAAE+lB,IAAI,CAACjlB,MAAb;AAAqB5D,UAAAA,KAAK,EAAE6oB,IAAI,CAAC7oB;AAAjC,SAAd;AACD;;AACD,aAAO,IAAP;AACD;;AAED,QAAI6oB,IAAI,CAACjlB,MAAL,IAAeilB,IAAI,CAAChlB,mBAAxB,EAA6C;AAC3CoS,MAAAA,QAAQ,CAACxN,IAAT,CAAc;AACZ3F,QAAAA,IAAI,EAAE+lB,IAAI,CAACjlB,MADC;AAEZ2O,QAAAA,IAAI,EAAEsW,IAAI,CAAChlB,mBAAL,CAAyBC,KAAzB;AAFM,OAAd;AAIA,aAAO,KAAP;AACD;;AAED,WAAO,KAAP;AACD,GApBiB,CAAlB;AAsBA,QAAMglB,IAAI,GAAG,IAAIhoB,IAAJ,GAAW2e,WAAX,EAAb;AAEA,QAAMsJ,cAAc,GAAG,CACrB,MAAMlb,OAAO,CAACyD,OAAR,CAAgB8D,MAAhB,CAAuBC,UAAvB,CACJxH,OAAO,CAACzC,IAAR,CAAa;AACXkK,IAAAA,GAAG,EAAEa,WAAW,CAACZ,IAAZ,CAAiBC;AADX,GAAb,CADI,CADe,EAMrB7U,IANqB,CAMhB+U,UANgB,CAMLnM,IANK,CAOpBoM,KAAD,IAAoBA,KAAK,CAAC7S,IAAN,KAAgB,GAAE3G,OAAO,CAACC,GAAR,CAAYgB,eAAgB,UAP7C,CAAvB;AAUA,QAAM4rB,QAA4B,GAAG,CACnC,GAAG/S,QAAQ,CAACzU,GAAT,CACD,CAAC;AAAEsB,IAAAA,IAAF;AAAQ9C,IAAAA,KAAR;AAAeuS,IAAAA;AAAf,GAAD,KACEwM,YAAY,CACVlR,OADU,EAEV/K,IAFU,EAGVqT,WAAW,CAACZ,IAAZ,CAAiBC,GAHP,EAIVxV,KAAK,GAAG,SAAH,GAAe,SAJV,EAKVA,KAAK,GAAGA,KAAK,CAAC7C,KAAT,GAAkBoV,IAAD,CAAqBpV,KALjC,EAMV6C,KAAK,GAAGhB,SAAH,GAAgBuT,IAAD,CAAqBtO,GAN/B,CAFb,CADgC,EAYnC,IAAIkb,WAAW,GACXlJ,QAAQ,CACLzU,GADH,CACO,CAAC;AAAEsB,IAAAA,IAAF;AAAQ9C,IAAAA,KAAR;AAAeuS,IAAAA;AAAf,GAAD,KACHvS,KAAK,GACD+e,YAAY,CACVlR,OADU,EAEV/K,IAFU,EAGVqc,WAHU,EAIV,SAJU,EAKV,8BALU,CADX,GAQDngB,SAVR,EAYGoQ,MAZH,CAYU9C,aAZV,CADW,GAcX,EAdJ,CAZmC,EA2BnCyc,cAAc,IACZlb,OAAO,CAACyD,OAAR,CAAgB8D,MAAhB,CAAuB3Y,MAAvB,CACEoR,OAAO,CAACzC,IAAR,CAAa;AACXtI,IAAAA,IAAI,EAAG,GAAE3G,OAAO,CAACC,GAAR,CAAYgB,eAAgB,UAD1B;AAEXiiB,IAAAA,QAAQ,EAAElJ,WAAW,CAACZ,IAAZ,CAAiBC,GAFhB;AAGX5R,IAAAA,MAAM,EAAE,WAHG;AAIXgS,IAAAA,UAAU,EAAGgT,SAAS,GAAG,SAAH,GAAe,SAJ1B;AAOXtJ,IAAAA,UAAU,EAAEwJ,IAPD;AAQXtJ,IAAAA,YAAY,EAAEsJ,IARH;AASXpJ,IAAAA,MAAM,EAAEkJ,SAAS,GACbA,SAAS,CAAC5oB,KADG,GAEb;AACE7C,MAAAA,KAAK,EAAE,oBADT;AAEEkF,MAAAA,OAAO,EAAE;AAFX;AAXO,GAAb,CADF,CA5BiC,EA8CnC,CAAC0mB,cAAD,IAAmB5J,WAAnB,IAAkCyJ,SAAlC,GACI7J,YAAY,CACVlR,OADU,EAEV,SAFU,EAGVsR,WAHU,EAIV,SAJU,EAKV,8BALU,CADhB,GAQIngB,SAtD+B,EAuDnC,CAAC+pB,cAAD,IACEhK,YAAY,CACVlR,OADU,EAEV,SAFU,EAGVsI,WAAW,CAACZ,IAAZ,CAAiBC,GAHP,EAIVoT,SAAS,GAAG,SAAH,GAAe,SAJd,EAKVA,SAAS,GAAGA,SAAS,CAAC5oB,KAAV,CAAgB7C,KAAnB,GAA2B,oBAL1B,CAxDqB,EA+DnCiS,MA/DmC,CA+D5B9C,aA/D4B,CAArC;AAiEA,QAAM9B,IAAI,GAAGsP,kCAAkC,CAAC3D,WAAW,CAAC3L,IAAb,CAA/C;AACAwe,EAAAA,QAAQ,CAACvgB,IAAT,CAAcuf,gBAAgB,CAAC7R,WAAD,EAActI,OAAd,EAAuB;AAAE1Q,IAAAA,KAAF;AAASqN,IAAAA;AAAT,GAAvB,CAA9B;AAEA,QAAMye,gBAAgB,GAAGhT,QAAQ,CAC9B7G,MADsB,CACdxL,MAAD;AAAA;;AAAA,2BAAYA,MAAM,CAAC2O,IAAnB,iDAAY,aAAavO,MAAzB;AAAA,GADe,EAEtBxC,GAFsB,CAEjBoC,MAAD,IAAYA,MAAM,CAAC2O,IAFD,CAAzB;AAIA,QAAM2W,uBAAuB,GAC3B7S,mBAAmB,CAACqC,WAApB,KAAoCK,kBADtC;AAGA,QAAMyM,OAAO,GAAG0D,uBAAuB,GACnCzP,iBAAiB,CACfyM,kBAAkB,CAAC9P,WAAD,EAAcD,WAAd,CADH,EAEf8S,gBAFe,CADkB,GAKnCrP,sBAAsB,CAACvD,mBAAmB,CAACqC,WAArB,EAAkCuQ,gBAAlC,CAL1B;;AAOA,MAAIC,uBAAuB,IAAIR,4BAA/B,EAA6D;AAC3DM,IAAAA,QAAQ,CAACvgB,IAAT,CACEue,yBAAyB,CACvB7Q,WADuB,EAEvBtI,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,EAKvBmP,OALuB,CAD3B;AASD,GAVD,MAUO;AACLwD,IAAAA,QAAQ,CAACvgB,IAAT,CACEid,2BAA2B,CAAC7X,OAAD,EAAUwI,mBAAV,EAA+BmP,OAA/B,CAD7B;AAGD;;AAED,QAAMtd,OAAO,CAACC,GAAR,CAAY6gB,QAAZ,CAAN;AACD,CAzJM;;AC1BQ,SAASG,MAAT,CAAgBjd,GAAhB,EAA6BsF,UAA7B,EAA2D;AACxEtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,qBADF,EAEEP,wBAAwB,CACtB1M,UADsB,EAEtB,CAACzD,OAAD,EAAUF,OAAV,EAAmBuI,WAAnB,KAAmC;AACjC,QAAIA,WAAW,CAAC8F,YAAhB,EAA8B,OAAO,IAAP;AAC9B,WAAOnO,OAAO,CAACqT,YAAf;AACD,GALqB,EAMtB,OACEjL,WADF,EAEEtI,OAFF,EAGEuI,WAHF,EAIEC,mBAJF,KAKoB;AAClB,QAAIA,mBAAmB,IAAI,IAA3B,EAAiC;AAEjC,UAAMsQ,MAAM,GAAG9Y,OAAO,CAACE,OAAR,CAAgB4Y,MAA/B;;AACA,QAAI/D,gBAAgB,CAAC+D,MAAD,CAApB,EAA8B;AAC5B;AACD;;AAED,UAAMyC,kBAAkB,GAAG,MAAMpO,OAAO,CACtCnN,OADsC,EAEtCA,OAAO,CAACE,OAAR,CAAgBqT,YAAhB,CAA6B5K,MAFS,CAAxC;AAKA,UAAMiS,YAAY,CAChBW,kBADgB,EAEhBvb,OAFgB,EAGhBuI,WAHgB,EAIhBC,mBAJgB,EAKhB,KALgB,CAAlB;AAOA,UAAMH,mBAAmB,CACvBkT,kBADuB,EAEvBvb,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,GArCqB,CAF1B;AA0CD;;AChDM,MAAMgT,YAAY,GAAG,OAC1BlT,WAD0B,EAE1BtI,OAF0B,EAG1BjN,KAH0B,KAIR;AAAA;;AAClBiN,EAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,eAAjB,EAAkC;AAChCgD,IAAAA,IAAI,EAAEY,WAAW,CAACZ,IAAZ,CAAiBD,GADS;AAEhCkD,IAAAA,IAAI,EAAErC,WAAW,CAACqC,IAAZ,CAAiBlD;AAFS,GAAlC;AAKA,QAAMlV,MAAM,GAAG,MAAMyN,OAAO,CAACyD,OAAR,CAAgBpG,KAAhB,CAClB3C,KADkB,CACZ;AACL8C,IAAAA,KAAK,EAAE8K,WAAW,CAACZ,IAAZ,CAAiBnK,IAAjB,CAAsBC,KAAtB,CAA4BzK,KAD9B;AAELwK,IAAAA,IAAI,EAAE+K,WAAW,CAACZ,IAAZ,CAAiBnK,IAAjB,CAAsBtI,IAFvB;AAGLyS,IAAAA,IAAI,EAAEY,WAAW,CAACqC,IAAZ,CAAiBlD,GAHlB;AAILkD,IAAAA,IAAI,EAAErC,WAAW,CAACZ,IAAZ,CAAiBD;AAJlB,GADY,EAOlBxL,KAPkB,CAOXC,GAAD,KAAU;AAAE/J,IAAAA,KAAK,EAAE+J;AAAT,GAAV,CAPY,CAArB;AASA8D,EAAAA,OAAO,CAACwC,GAAR,CAAYkC,IAAZ,CAAiB,sBAAjB,EAAyC;AACvC3O,IAAAA,MAAM,EAAExD,MAAM,CAACwD,MADwB;AAEvC4R,IAAAA,GAAG,kBAAEpV,MAAM,CAACO,IAAT,iDAAE,aAAa6U,GAFqB;AAGvCxV,IAAAA,KAAK,EAAEI,MAAM,CAACJ;AAHyB,GAAzC;;AAMA,MAAII,MAAM,CAACwD,MAAP,KAAkB,GAAtB,EAA2B;AACzBiK,IAAAA,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuB4B,aAAvB,CACErM,OAAO,CAACzC,IAAR,CAAa;AACXmN,MAAAA,YAAY,EAAEpC,WAAW,CAACK,MADf;AAEXhM,MAAAA,IAAI,EAAG,IAAG5J,KAAM;AAFL,KAAb,CADF;AAMD,GAPD,MAOO,IAAIR,MAAM,CAACwD,MAAP,KAAkB,GAAtB,EAA2B;AAChCiK,IAAAA,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuB4B,aAAvB,CACErM,OAAO,CAACzC,IAAR,CAAa;AACXmN,MAAAA,YAAY,EAAEpC,WAAW,CAACK,MADf;AAEXhM,MAAAA,IAAI,EAAG,IAAG5J,KAAM;AAFL,KAAb,CADF;AAMD,GAPM,MAOA,IAAI,CAACR,MAAD,IAAW,CAACA,MAAM,CAACO,IAAnB,IAA2B,CAACP,MAAM,CAACO,IAAP,CAAY6U,GAA5C,EAAiD;AACtD3H,IAAAA,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuB4B,aAAvB,CACErM,OAAO,CAACzC,IAAR,CAAa;AACXmN,MAAAA,YAAY,EAAEpC,WAAW,CAACK,MADf;AAEXhM,MAAAA,IAAI,EAAG,IAAG5J,KAAM;AAFL,KAAb,CADF;AAMD,GAPM,MAOA;AACLiN,IAAAA,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuB4B,aAAvB,CACErM,OAAO,CAACzC,IAAR,CAAa;AACXmN,MAAAA,YAAY,EAAEpC,WAAW,CAACK,MADf;AAEXhM,MAAAA,IAAI,EAAG,IAAG5J,KAAM,oBAAmBR,MAAM,CAACO,IAAP,CAAY6U,GAAI;AAFxC,KAAb,CADF;AAMD;AACF,CAtDM;;ACQP,MAAM8T,cAAc,GAClBvb,OADqB,IAET;AACZ,QAAM4Y,MAAM,GAAG5Y,OAAO,CAAC4Y,MAAvB;AACA,SACEA,MAAM,CAAChe,IAAP,KAAgB,KAAhB,IACAge,MAAM,CAAC/lB,KAAP,KAAiB,eADjB,IAEAmN,OAAO,CAACqT,YAAR,CAAqB7L,IAArB,CAA0BD,GAA1B,CAA8BtI,UAA9B,CAAyC,WAAzC,CAHF;AAKD,CATD;;AAWe,SAASuc,aAAT,CACbrd,GADa,EAEbsF,UAFa,EAGP;AACNtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,CAAC,sBAAD,EAAyB,wBAAzB,CADF,EAEEP,wBAAwB,CAItB1M,UAJsB,EAKtB,CAACzD,OAAD,EAAUF,OAAV,EAAmBuI,WAAnB,KAAmC;AACjC,QAAIrI,OAAO,CAAC4Y,MAAR,CAAehe,IAAf,KAAwB,KAAxB,IAAiC,CAAC2gB,cAAc,CAACvb,OAAD,CAApD,EAA+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAIqI,WAAW,CAAC8F,YAAhB,EAA8B,OAAO,IAAP;AAE9B,WAAOnO,OAAO,CAACqT,YAAf;AACD,GAbqB,EActB,OAAOjL,WAAP,EAAoBtI,OAApB,EAA6BuI,WAA7B,EAA0CC,mBAA1C,KAAkE;AAChE,QAAIA,mBAAmB,KAAK,IAA5B,EAAkC;AAElC,UAAMmT,YAAY,GAAGF,cAAc,CAACzb,OAAO,CAACE,OAAT,CAAnC;AACA,UAAM6Q,SAAS,GAAG,MAAM5D,OAAO,CAACnN,OAAD,EAAUsI,WAAW,CAACK,MAAtB,CAA/B;AAEA,UAAMlC,KAAK,GAAIzG,OAAO,CAACE,OAAT,CAAyBuG,KAAvC;;AACA,QAAIkV,YAAJ,EAAkB;AAChB,YAAMC,iBAAiB,GAAGrT,WAAW,CAACxT,MAAZ,CAAmB,eAAnB,CAA1B;AACA,YAAM0T,cAAc,GAAGF,WAAW,CAACxT,MAAZ,CAAmB,iBAAnB,CAAvB;AACA,YAAM8mB,oBAAoB,GAAGtT,WAAW,CAACxT,MAAZ,CAAmB,eAAnB,CAA7B;;AACA,UAAIiL,OAAO,CAACE,OAAR,CAAgB8I,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,YAAI4S,iBAAiB,IAAInV,KAAK,CAAC3X,EAAN,KAAa8sB,iBAAiB,CAAC9sB,EAAxD,EAA4D;AAC1D;AACA;AACA;AACA;AACA,gBAAMkR,OAAO,CAACyD,OAAR,CAAgB2G,KAAhB,CAAsB0R,YAAtB,CACJ9b,OAAO,CAACsI,WAAR,CAAoB;AAAEyT,YAAAA,KAAK,EAAE;AAAT,WAApB,CADI,CAAN;AAIA,cAAIhnB,MAAM,GAAGgc,SAAS,CAAChc,MAAvB;AACA,gBAAMZ,mBAAmB,GACvB0nB,oBAAoB,IACpBtT,WAAW,CAAC1U,MAAZ,CAAmBgC,2BAFrB;;AAGA,cAAI1B,mBAAJ,EAAyB;AACvB,kBAAM5B,MAAM,GAAG,MAAMyN,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuBuI,SAAvB,CACnBhT,OAAO,CAAC9J,KAAR,CAAc;AACZnB,cAAAA,MAAM,EAAE,CAAC8mB,oBAAoB,CAAC5mB,IAAtB;AADI,aAAd,CADmB,CAArB;AAKAF,YAAAA,MAAM,GAAGxC,MAAM,CAACO,IAAhB;AACD;;AACD,gBAAMgf,2BAA2B,CAC/Bf,SAD+B,EAE/B/Q,OAF+B,EAG/BuI,WAH+B,EAI/BxT,MAJ+B,CAAjC;AAMA,gBAAM+iB,0BAA0B,CAC9B9X,OAD8B,EAE9BuI,WAF8B,EAG9BC,mBAH8B,EAI9B;AACErU,YAAAA,mBADF;AAEE;AACAC,YAAAA,SAAS,EAAE8S,YAAY,CAACnS,MAAD,EAAS0T,cAAT,CAAZ,GACP,IADO,GAEPF,WAAW,CAAC1U,MAAZ,CAAmBI,gBAAnB,CAAoCG;AAL1C,WAJ8B,CAAhC,CA3B0D;AAwC3D,SAxCD,MAwCO,IAAIqU,cAAc,IAAIhC,KAAK,CAAC3X,EAAN,KAAa2Z,cAAc,CAAC3Z,EAAlD,EAAsD;AAC3D,gBAAMgpB,0BAA0B,CAC9B9X,OAD8B,EAE9BuI,WAF8B,EAG9BC,mBAH8B,EAI9B;AACEpU,YAAAA,SAAS,EAAE,IADb;AAEE;AACA;AACAD,YAAAA,mBAAmB,EAAE+S,YAAY,CAC/BoB,WAAW,CAACvT,MADmB,EAE/B6mB,iBAF+B,CAAZ,GAIjB,IAJiB,GAKjBrT,WAAW,CAAC1U,MAAZ,CAAmBI,gBAAnB,CAAoCE;AAT1C,WAJ8B,CAAhC;AAgBD;;AACD,cAAMkU,mBAAmB,CACvB0I,SADuB,EAEvB/Q,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD;;AACD;AACD;;AAED,QAAID,WAAW,CAACwG,iBAAZ,CAA8BvN,QAA9B,CAAuCiF,KAAK,CAAC3X,EAA7C,CAAJ,EAAsD;AACpD,UAAIkR,OAAO,CAACE,OAAR,CAAgB8I,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,cAAMhJ,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuByI,WAAvB,CACJlT,OAAO,CAAC9J,KAAR,CAAc;AAAEjB,UAAAA,IAAI,EAAEwR,KAAK,CAACxR;AAAd,SAAd,CADI,CAAN;AAGD,OAJD,MAIO;AACL,cAAM+K,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuBuI,SAAvB,CACJhT,OAAO,CAAC9J,KAAR,CAAc;AAAEnB,UAAAA,MAAM,EAAE,CAAC0R,KAAK,CAACxR,IAAP;AAAV,SAAd,CADI,CAAN;AAGD;;AACD;AACD;;AAED,UAAM6c,2BAA2B,CAACf,SAAD,EAAY/Q,OAAZ,EAAqBuI,WAArB,CAAjC;AAEA,UAAMyT,iBAAiB,GAAGzT,WAAW,CAACxT,MAAZ,CAAmB,qBAAnB,CAA1B;AACA,UAAMujB,kBAAkB,GAAG/P,WAAW,CAACxT,MAAZ,CAAmB,gBAAnB,CAA3B;AACA,UAAMwjB,cAAc,GAAGhQ,WAAW,CAACxT,MAAZ,CAAmB,iBAAnB,CAAvB;AACA,UAAMyjB,WAAW,GAAGjQ,WAAW,CAACxT,MAAZ,CAAmB,eAAnB,CAApB;;AAEA,UAAMsR,MAAM,GAAG,CAAC,MAAM;AACpB,UAAIiS,kBAAkB,IAAI7R,KAAK,CAAC3X,EAAN,KAAawpB,kBAAkB,CAACxpB,EAA1D,EAA8D;AAC5D,eAAO,eAAP;AACD;;AACD,UAAIypB,cAAc,IAAI9R,KAAK,CAAC3X,EAAN,KAAaypB,cAAc,CAACzpB,EAAlD,EAAsD;AACpD,eAAO,WAAP;AACD;;AACD,UAAI0pB,WAAW,IAAI/R,KAAK,CAAC3X,EAAN,KAAa0pB,WAAW,CAAC1pB,EAA5C,EAAgD;AAC9C,eAAO,qBAAP;AACD;;AACD,aAAO,IAAP;AACD,KAXc,GAAf;;AAaA,QAAIuX,MAAJ,EAAY;AACV,YAAMyR,0BAA0B,CAC9B9X,OAD8B,EAE9BuI,WAF8B,EAG9BC,mBAH8B,EAI9B;AACE,SAACnC,MAAD,GAAUrG,OAAO,CAACE,OAAR,CAAgB8I,MAAhB,KAA2B;AADvC,OAJ8B,CAAhC;AAQD,KA1H+D;;;AA2HhE,QAAIuP,cAAc,IAAI9R,KAAK,CAAC3X,EAAN,KAAaypB,cAAc,CAACzpB,EAAlD,EAAsD;AACpD,UAAIkR,OAAO,CAACE,OAAR,CAAgB8I,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,cAAMX,mBAAmB,CACvB0I,SADuB,EAEvB/Q,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,OAPD,MAOO;AACLD,QAAAA,WAAW,CAACG,0BAAZ,CACE1I,OADF,EAEEsI,WAAW,CAACK,MAFd,EAGE,yBAHF;AAKD;AACF;;AACD,QAAIqT,iBAAiB,IAAIvV,KAAK,CAAC3X,EAAN,KAAaktB,iBAAiB,CAACltB,EAAxD,EAA4D;AAC1D,UAAIkR,OAAO,CAACE,OAAR,CAAgB8I,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,cAAMwS,YAAY,CAChBzK,SADgB,EAEhB/Q,OAFgB,EAGhBA,OAAO,CAACE,OAAR,CAAgB4Y,MAAhB,CAAuB/lB,KAHP,CAAlB;AAKA,cAAMiN,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuByI,WAAvB,CACJlT,OAAO,CAAC9J,KAAR,CAAc;AAAEjB,UAAAA,IAAI,EAAEwR,KAAK,CAACxR;AAAd,SAAd,CADI,CAAN;AAGD;AACF;AACF,GArKqB,CAF1B;AA0KD;;AC7LM,MAAMgnB,uBAAuB,GAAG,OACrC3T,WADqC,EAErCtI,OAFqC,EAGrCuI,WAHqC,EAIrCC,mBAJqC,KAKhB;AACrB;AACA,QAAMoT,iBAAiB,GAAGrT,WAAW,CAACxT,MAAZ,CAAmB,eAAnB,CAA1B;;AACA,MAAImS,YAAY,CAACoB,WAAW,CAACvT,MAAb,EAAqB6mB,iBAArB,CAAhB,EAAyD;AACvD,UAAM5b,OAAO,CAACyD,OAAR,CAAgB2G,KAAhB,CAAsB0R,YAAtB,CACJ9b,OAAO,CAACsI,WAAR,CAAoB;AAAEyT,MAAAA,KAAK,EAAE;AAAT,KAApB,CADI,CAAN;AAGA,UAAM1T,mBAAmB,CACvBC,WADuB,EAEvBtI,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMA,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD,CAtBM;;ACFA,MAAM0T,qBAAqB,GAAG,OAGnC5T,WAHmC,EAInCtI,OAJmC,EAKnCuI,WALmC,KAMjB;AAClB,MAAI,CAACA,WAAW,CAAC1U,MAAZ,CAAmBC,mBAAxB,EAA6C;AAC7C,MAAIwU,WAAW,CAACqL,SAAZ,CAAsBlW,MAAtB,GAA+B,CAAnC,EAAsC;AACtC,MAAI6K,WAAW,CAAC3V,IAAZ,CAAiBmI,IAAjB,KAA0B,KAA9B,EAAqC;AAErC,QAAMkF,OAAO,CAACyD,OAAR,CAAgBgH,MAAhB,CAAuB0R,YAAvB,CACJnc,OAAO,CAAC9J,KAAR,CAAc;AACZyd,IAAAA,SAAS,EAAE,CAACrL,WAAW,CAAC3V,IAAZ,CAAiBI,KAAlB;AADC,GAAd,CADI,CAAN;AAKD,CAhBM;;ACMQ,SAASqpB,MAAT,CAAgB/d,GAAhB,EAA6BsF,UAA7B,EAA2D;AACxEtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,qBADF,EAEEP,wBAAwB,CACtB1M,UADsB,EAEtB,CAACzD,OAAD,EAAUF,OAAV,EAAmBuI,WAAnB,KAAmC;AACjC,QAAIA,WAAW,CAAC8F,YAAhB,EAA8B,OAAO,IAAP;AAC9B,WAAOnO,OAAO,CAACqT,YAAf;AACD,GALqB,EAMtB,OAAOjL,WAAP,EAAoBtI,OAApB,EAA6BuI,WAA7B,EAA0CC,mBAA1C,KAAkE;AAChE,UAAMmT,YAAY,GAAGrT,WAAW,CAACZ,IAAZ,CAAiBD,GAAjB,CAAqBtI,UAArB,CAAgC,WAAhC,CAArB;AACA,QAAIqJ,mBAAmB,KAAK,IAA5B,EAAkC;AAElC,UAAMnO,OAAO,CAACC,GAAR,CAAqB,CACzB4hB,qBAAqB,CAAC5T,WAAD,EAActI,OAAd,EAAuBuI,WAAvB,CADI,EAEzBqS,YAAY,CACVtS,WADU,EAEVtI,OAFU,EAGVuI,WAHU,EAIVC,mBAJU,EAKV,IALU,CAFa,EASzBmT,YAAY,GACRxO,OAAO,CAACnN,OAAD,EAAUsI,WAAW,CAACK,MAAtB,CAAP,CAAqC7C,IAArC,CAA2CiL,SAAD,IACxCkL,uBAAuB,CACrBlL,SADqB,EAErB/Q,OAFqB,EAGrBuI,WAHqB,EAIrBC,mBAJqB,CAAvB,CAKE1C,IALF,CAME,MAAOnQ,QAAP,IAA4C;AAC1C,UAAI,CAACA,QAAD,IAAa4S,WAAW,CAAC1U,MAAZ,CAAmBG,qBAApC,EAA2D;AACzD,cAAMke,kBAAkB,CACtB5J,WADsB,EAEtBtI,OAFsB,EAGtBuI,WAHsB,EAItB,KAJsB,EAKtB;AACEjF,UAAAA,GAAG,EAAE,CAAC,aAAD;AADP,SALsB,CAAxB;AASD;AACF,KAlBH,CADF,CADQ,GAuBR4O,kBAAkB,CAAC5J,WAAD,EAActI,OAAd,EAAuBuI,WAAvB,EAAoC,KAApC,EAA2C;AAC3DjF,MAAAA,GAAG,EAAEiF,WAAW,CAAC1U,MAAZ,CAAmBG,qBAAnB,GACD,CAAC,aAAD,CADC,GAED,EAHuD;AAI3Dqe,MAAAA,MAAM,EAAE,CAAC,UAAD,EAAa,kBAAb;AAJmD,KAA3C,CAhCG,CAArB,CAAN;AAuCD,GAjDqB,EAkDtB,CAAC/J,WAAD,EAActI,OAAd,KAAuC;AACrC,WAAO;AACL2M,MAAAA,wBAAwB,EAAER,uBAAuB,CAC/C7D,WAAW,CAACK,MADmC,EAE/C3I,OAF+C,EAG/CkL,kBAH+C;AAD5C,KAAP;AAOD,GA1DqB,CAF1B;AA+DD;;ACrEc,SAASoI,QAAT,CAAgBjV,GAAhB,EAA6BsF,UAA7B,EAA2D;AACxEtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,uBADF,EAEEP,wBAAwB,CACtB1M,UADsB,EAEtB,CAACzD,OAAD,EAAUF,OAAV,EAAmBuI,WAAnB,KAAmC;AACjC,QAAIA,WAAW,CAAC8F,YAAhB,EAA8B,OAAO,IAAP;AAC9B,WAAOnO,OAAO,CAACqT,YAAf;AACD,GALqB,EAMtB,OACEjL,WADF,EAEEtI,OAFF,EAGEuI,WAHF,EAIEC,mBAJF,KAKoB;AAClB,UAAMnO,OAAO,CAACC,GAAR,CAAY,CAChB4X,kBAAkB,CAAC5J,WAAD,EAActI,OAAd,EAAuBuI,WAAvB,EAAoC,KAApC,EAA2C;AAC3DjF,MAAAA,GAAG,EAAE,CAAC,aAAD,CADsD;AAE3D+O,MAAAA,MAAM,EAAE,CAAC,UAAD;AAFmD,KAA3C,CADF,EAKhBuI,YAAY,CACVtS,WADU,EAEVtI,OAFU,EAGVuI,WAHU,EAIVC,mBAJU,EAKV,IALU,CALI,CAAZ,CAAN;AAaD,GAzBqB,CAF1B;AA8BD;;AC7Bc,SAAS6T,eAAT,CACbhe,GADa,EAEbsF,UAFa,EAGP;AACNtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,+BADF,EAEEP,wBAAwB,CACtB1M,UADsB,EAErBzD,OAAD,IAAaA,OAAO,CAACqT,YAFC,EAGtB,OACEjL,WADF,EAEEtI,OAFF,EAGEuI,WAHF,KAKoB;AAClB,UAAMuQ,MAAM,GAAG9Y,OAAO,CAACE,OAAR,CAAgB4Y,MAA/B;AACA,UAAMjE,QAAQ,GAAI7U,OAAO,CAACE,OAAT,CAAyB/K,MAAzB,CAAgCxC,IAAjD;AACA,UAAMqS,aAAa,GAAGuD,WAAW,CAAC1D,gBAAZ,CAA6BgQ,QAAQ,CAAC9hB,KAAtC,CAAtB;;AAEA,QACE,CAACwV,WAAW,CAAC8F,YAAb,IACArJ,aADA,IAEAuD,WAAW,CAAC1U,MAAZ,CAAmBkB,MAAnB,CAA0BI,MAA1B,CAAiC6P,aAAjC,CAHF,EAIE;AACA,YAAM+L,SAAS,GAAG,MAAM5D,OAAO,CAACnN,OAAD,EAAUsI,WAAW,CAACK,MAAtB,CAA/B;AAEA,YAAM;AAAEgM,QAAAA;AAAF,UAAmB,MAAMP,2BAA2B,CACxDpU,OADwD,EAExDuI,WAFwD,CAA1D;AAIA,YAAM+T,4BAA4B,GAChC3H,YAAY,CAAC3P,aAAD,CAAZ,CAA4BtP,gBAA5B,KAAiD,CADnD;AAEA,YAAM6mB,YAAY,GAAG5H,YAAY,CAAC3P,aAAD,CAAZ,CAA4BrP,QAA5B,KAAyC,CAA9D;AACA,YAAM6mB,2BAA2B,GAAGjU,WAAW,CAACxD,iBAAZ,CAClCC,aADkC,EAElC+L,SAAS,CAACrH,mBAFwB,EAGlC;AAAExE,QAAAA,qBAAqB,EAAE;AAAzB,OAHkC,CAApC;AAMA,YAAMgN,kBAAkB,CACtBnB,SADsB,EAEtB/Q,OAFsB,EAGtBuI,WAHsB,EAItBvD,aAJsB,EAKtB;AACE1B,QAAAA,GAAG,EAAE,CACH,CAACiZ,YAAD,IAAiB,aADd,EAEHA,YAAY,IACV,CAACC,2BADH,IAEE,CAACF,4BAFH,IAGE,UALC,CADP;AAQEjK,QAAAA,MAAM,EAAE,CACN,CAACmK,2BAAD,IACE,CAACF,4BADH,IAEE,WAHI,EAIN,CAACA,4BAAD,IAAiC,kBAJ3B,EAKN,CAACC,YAAD,IAAiB,UALX;AARV,OALsB,CAAxB;;AAuBA,UAAIxL,SAAS,CAAC4C,SAAd,EAAyB;AACvB5C,QAAAA,SAAS,CAAC4C,SAAV,CAAoB1S,OAApB,CAA6B2S,QAAD,IAAc;AACxCrL,UAAAA,WAAW,CAACnH,KAAZ,CAAkBvB,UAAlB,CAA6B+T,QAAQ,CAAC7gB,KAAtC;AACD,SAFD;AAGD;;AACD,UACE,CAACge,SAAS,CAAC4C,SAAV,CAAoBjY,IAApB,CACEkY,QAAD,IAAcA,QAAQ,CAAC7gB,KAAT,KAAmB8hB,QAAQ,CAAC9hB,KAD3C,CADH,EAIE;AACAwV,QAAAA,WAAW,CAACnH,KAAZ,CAAkBvB,UAAlB,CAA6BgV,QAAQ,CAAC9hB,KAAtC;AACD;AACF;;AAED,QAAIwV,WAAW,CAACnH,KAAhB,EAAuB;AACrB,UAAI0X,MAAM,CAAC/lB,KAAP,KAAiB8hB,QAAQ,CAAC9hB,KAA9B,EAAqC;AACnCuV,QAAAA,WAAW,CAACqL,SAAZ,CAAsB1S,OAAtB,CAA+B2S,QAAD,IAAc;AAC1CrL,UAAAA,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACE,WADF,EAEEoU,QAAQ,CAAC9kB,EAFX,EAGE8kB,QAAQ,CAAC7gB,KAHX,EAIE;AACE6P,YAAAA,IAAI,EAAG,WAAU2F,WAAW,CAACnH,KAAZ,CAAkB7B,OAAlB,CACfsV,QAAQ,CAAC9hB,KADM,CAEf,4BAA2B8jB,YAAA,CAC3BvO,WAD2B,EAE3BC,WAF2B,CAG3B;AANJ,WAJF;AAaD,SAdD;AAeD,OAhBD,MAgBO;AACLA,QAAAA,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACE,WADF,EAEEqV,QAAQ,CAAC/lB,EAFX,EAGE+lB,QAAQ,CAAC9hB,KAHX,EAIE;AACE6P,UAAAA,IAAI,EAAG,WAAU2F,WAAW,CAACnH,KAAZ,CAAkB7B,OAAlB,CACfuZ,MAAM,CAAC/lB,KADQ,CAEf,6BAA4B8jB,YAAA,CAC5BvO,WAD4B,EAE5BC,WAF4B,CAG5B;AANJ,SAJF;AAaD;AACF;AACF,GAvGqB,CAF1B;AA4GD;;ACjHc,SAASkU,oBAAT,CACbpe,GADa,EAEbsF,UAFa,EAGP;AACNtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,qCADF,EAEEP,wBAAwB,CACtB1M,UADsB,EAErBzD,OAAD,IAAaA,OAAO,CAACqT,YAFC,EAGtB,OACEjL,WADF,EAEEtI,OAFF,EAGEuI,WAHF,KAKoB;AAClB,UAAMuQ,MAAM,GAAG9Y,OAAO,CAACE,OAAR,CAAgB4Y,MAA/B;AACA,UAAMjE,QAAQ,GAAI7U,OAAO,CAACE,OAAT,CAAyBwc,kBAA1C;AAEA,UAAM1X,aAAa,GAAGuD,WAAW,CAAC1D,gBAAZ,CAA6BgQ,QAAQ,CAAC9hB,KAAtC,CAAtB;;AAEA,QACE,CAACwV,WAAW,CAAC8F,YAAb,IACArJ,aADA,IAEAuD,WAAW,CAAC1U,MAAZ,CAAmBkB,MAAnB,CAA0BI,MAA1B,CAAiC6P,aAAjC,CAHF,EAIE;AACA,YAAMwX,2BAA2B,GAAGjU,WAAW,CAACxD,iBAAZ,CAClCC,aADkC,EAElCsD,WAAW,CAACoB,mBAFsB,EAGlC;AACExE,QAAAA,qBAAqB,EAAE;AADzB,OAHkC,CAApC;AAQA,YAAM;AAAEyP,QAAAA;AAAF,UAAmB,MAAMP,2BAA2B,CACxDpU,OADwD,EAExDuI,WAFwD,CAA1D;AAKA,YAAM+T,4BAA4B,GAChC3H,YAAY,CAAC3P,aAAD,CAAZ,CAA4BtP,gBAA5B,KAAiD,CADnD;AAGA,YAAMinB,oBAAoB,GACxBhI,YAAY,CAAC3P,aAAD,CAAZ,CAA4BrP,QAA5B,KAAyC,CAD3C;AAGA,YAAMA,QAAQ,GACZ,CAAC6mB,2BAAD,IACA,CAACF,4BADD,IAEAK,oBAHF;AAKA,YAAMzK,kBAAkB,CACtB5J,WADsB,EAEtBtI,OAFsB,EAGtBuI,WAHsB,EAItBvD,aAJsB,EAKtB;AACE1B,QAAAA,GAAG,EAAE;AAEHgZ,QAAAA,4BAA4B,IAAI,kBAF7B;AAIH3mB,QAAAA,QAAQ,IAAI,UAJT,CADP;AAOE;AACA0c,QAAAA,MAAM,EAAE,CACN1c,QAAQ,IAAI,aADN,EAEN,CAAC6mB,2BAAD,IAAgC,WAF1B;AARV,OALsB,CAAxB;;AAoBA,UAAIlU,WAAW,CAACqL,SAAhB,EAA2B;AACzBrL,QAAAA,WAAW,CAACqL,SAAZ,CAAsB1S,OAAtB,CAA+B2S,QAAD,IAAc;AAC1CrL,UAAAA,WAAW,CAACnH,KAAZ,CAAkBvB,UAAlB,CAA6B+T,QAAQ,CAAC7gB,KAAtC;AACD,SAFD;AAGD;;AACD,UACE,CAACuV,WAAW,CAACqL,SAAZ,CAAsBjY,IAAtB,CACEkY,QAAD,IAAcA,QAAQ,CAAC7gB,KAAT,KAAmB8hB,QAAQ,CAAC9hB,KAD3C,CADH,EAIE;AACAwV,QAAAA,WAAW,CAACnH,KAAZ,CAAkBvB,UAAlB,CAA6BgV,QAAQ,CAAC9hB,KAAtC;AACD;AACF;;AAED,QAAI+lB,MAAM,CAAC/lB,KAAP,KAAiB8hB,QAAQ,CAAC9hB,KAA9B,EAAqC;AAErCwV,IAAAA,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACE,WADF,EAEEqV,QAAQ,CAAC/lB,EAFX,EAGE+lB,QAAQ,CAAC9hB,KAHX,EAIE;AACE6P,MAAAA,IAAI,EAAG,0BAAyB2F,WAAW,CAACnH,KAAZ,CAAkB7B,OAAlB,CAC9BuZ,MAAM,CAAC/lB,KADuB,CAE9B,2CAA0C8jB,YAAA,CAC1CvO,WAD0C,EAE1CC,WAF0C,CAG1C;AANJ,KAJF;AAcA,UAAMqU,0BAA0B,GAAG,MAAMjZ,UAAU,CAACrK,WAAX,CAAuB8c,iBAAvB,CAAyCzc,OAAzC,CACvC;AACE,oBAAc4O,WAAW,CAACtI,OAAZ,CAAoB/F,GADpC;AAEE,sBAAgBqO,WAAW,CAACjE,WAF9B;AAGExJ,MAAAA,IAAI,EAAE,kBAHR;AAIEub,MAAAA,MAAM,EAAG,GAAE/N,WAAW,CAACxZ,EAAG,IAAG+lB,QAAQ,CAAC/lB,EAAG;AAJ3C,KADuC,CAAzC;;AASA,QAAI8tB,0BAAJ,EAAgC;AAC9B,YAAMtG,MAAM,GAAGsG,0BAA0B,CAACtG,MAA3B,CAAkC,CAAlC,CAAf;AACA,YAAM/T,OAAO,GAAGqa,0BAA0B,CAACra,OAA3C;AACA,YAAMlI,OAAO,CAACC,GAAR,CAAY,CAChBiO,WAAW,CAACnH,KAAZ,CAAkB1B,aAAlB,CAAgC4W,MAAM,CAACrT,EAAvC,EAA2CqT,MAAM,CAACtU,OAAlD,EAA2D,EACzD,GAAGO,OADsD;AAEzDK,QAAAA,IAAI,EAAEL,OAAO,CAACK,IAAR,CACHia,KADG,CACG,IADH,EAEHlpB,GAFG,CAEEyT,CAAD,IAAQ,IAAGA,CAAE,GAFd,EAGHgE,IAHG,CAGE,IAHF;AAFmD,OAA3D,CADgB,EAQhB7C,WAAW,CAACnH,KAAZ,CAAkBxB,WAAlB,CACE0W,MAAM,CAACrT,EADT,EAEEqT,MAAM,CAACtU,OAFT,EAGE,sBAHF,CARgB,EAahB2B,UAAU,CAACrK,WAAX,CAAuB8c,iBAAvB,CAAyC0G,SAAzC,CACEF,0BADF,CAbgB,CAAZ,CAAN;AAiBD;AACF,GA3HqB,CAF1B;AAgID;;ACrIc,SAASG,eAAT,CACb1e,GADa,EAEbsF,UAFa,EAGP;AACNtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,+BADF,EAEEP,wBAAwB,CACtB1M,UADsB,EAErBzD,OAAD,IAAaA,OAAO,CAACqT,YAFC,EAGtB,OACEjL,WADF,EAEEtI,OAFF,EAGEuI,WAHF,KAKoB;AAClB,UAAMuQ,MAAM,GAAG9Y,OAAO,CAACE,OAAR,CAAgB4Y,MAA/B;AAEA,UAAMjE,QAAQ,GAAI7U,OAAO,CAACE,OAAT,CAAyBwc,kBAA1C;AAEA,UAAM1X,aAAa,GAAGuD,WAAW,CAAC1D,gBAAZ,CAA6BgQ,QAAQ,CAAC9hB,KAAtC,CAAtB;;AAEA;AAEA,QACE,CAACwV,WAAW,CAAC8F,YAAb,IACArJ,aADA,IAEAuD,WAAW,CAAC1U,MAAZ,CAAmBkB,MAAnB,CAA0BI,MAA1B,CAAiC6P,aAAjC,CAHF,EAIE;AACA,YAAMkN,kBAAkB,CACtB5J,WADsB,EAEtBtI,OAFsB,EAGtBuI,WAHsB,EAItBvD,aAJsB,EAKtB;AACE1B,QAAAA,GAAG,EAAE,CAAC,aAAD,cADP;AAEE+O,QAAAA,MAAM,EAAE,CAAC,UAAD;AAFV,OALsB,CAAxB;;AAWA,UAAI/J,WAAW,CAACqL,SAAhB,EAA2B;AACzBrL,QAAAA,WAAW,CAACqL,SAAZ,CAAsB1S,OAAtB,CAA+B2S,QAAD,IAAc;AAC1CrL,UAAAA,WAAW,CAACnH,KAAZ,CAAkBvB,UAAlB,CAA6B+T,QAAQ,CAAC7gB,KAAtC;AACD,SAFD;AAGD;;AACD,UACE,CAACuV,WAAW,CAACqL,SAAZ,CAAsBjY,IAAtB,CACEkY,QAAD,IAAcA,QAAQ,CAAC7gB,KAAT,KAAmB8hB,QAAQ,CAAC9hB,KAD3C,CADH,EAIE;AACAwV,QAAAA,WAAW,CAACnH,KAAZ,CAAkBvB,UAAlB,CAA6BgV,QAAQ,CAAC9hB,KAAtC;AACD;AACF;;AAED,QAAI+lB,MAAM,CAAC/lB,KAAP,KAAiB8hB,QAAQ,CAAC9hB,KAA9B,EAAqC;;AAErC,QAAmBwV,WAAW,CAACnH,KAA/B,EAAsC;AACpC,YAAMwB,IAAI,GAAI,UAAS2F,WAAW,CAACnH,KAAZ,CAAkB7B,OAAlB,CACrBuZ,MAAM,CAAC/lB,KADc,CAErB,4BAA2B8jB,YAAA,CAC3BvO,WAD2B,EAE3BC,WAF2B,CAG3B,SAAQD,WAAW,CAAChZ,KAAM,EAL5B;AAMA,YAAMiT,OAAO,GAAG;AAAEK,QAAAA;AAAF,OAAhB;AACA,YAAMrQ,MAAM,GAAG,MAAMgW,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACnB,WADmB,EAEnBqV,QAAQ,CAAC/lB,EAFU,EAGnB+lB,QAAQ,CAAC9hB,KAHU,EAInBwP,OAJmB,CAArB;;AAMA,UAAIhQ,MAAJ,EAAY;AACV,cAAMoR,UAAU,CAACrK,WAAX,CAAuB8c,iBAAvB,CAAyChN,SAAzC,CAAmD;AACvDtO,UAAAA,IAAI,EAAE,kBADiD;AAEvDub,UAAAA,MAAM,EAAG,GAAE/N,WAAW,CAACxZ,EAAG,IAAG+lB,QAAQ,CAAC/lB,EAAG,EAFc;AAGvDyT,UAAAA,OAHuD;AAIvDtC,UAAAA,OAAO,EAAEsI,WAAW,CAAClE,YAJkC;AAKvDiS,UAAAA,MAAM,EAAE,CAAC/jB,MAAD;AAL+C,SAAnD,CAAN;AAOD;AACF;AACF,GAzEqB,CAF1B;AA8ED;;AC7ED,MAAMyqB,iBAAiB,GAAI9U,KAAD,IAA2B;AACnD,UAAQA,KAAR;AACE,SAAK,mBAAL;AACE,aAAO,GAAP;;AACF,SAAK,UAAL;AACE,aAAO,kBAAP;;AACF;AACE,aAAO,gBAAP;AANJ;AAQD,CATD;;AAWe,SAAS+U,eAAT,CACb5e,GADa,EAEbsF,UAFa,EAGP;AACNtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,+BADF,EAEEP,wBAAwB,CACtB1M,UADsB,EAErBzD,OAAD,IAAaA,OAAO,CAACqT,YAFC,EAGtB,OACEjL,WADF,EAEEtI,OAFF,EAGEuI,WAHF,EAIEC,mBAJF,KAKoB;AAClB,UAAM;AAAEtI,MAAAA;AAAF,QAAcF,OAApB;AAEA,UAAM;AACJrN,MAAAA,IAAI,EAAEkiB,QADF;AAEJ3M,MAAAA,KAFI;AAGJvL,MAAAA,IAHI;AAIJoX,MAAAA,QAAQ,EAAEmJ;AAJN,QAKFhd,OAAO,CAAC/K,MALZ;AAOA,UAAMgoB,aAAa,GAAG7U,WAAW,CAAC3V,IAAZ,CAAiBI,KAAjB,KAA2B8hB,QAAQ,CAAC9hB,KAA1D;AACA,UAAM;AAAEuhB,MAAAA,SAAF;AAAaK,MAAAA;AAAb,QAA8B,MAAMP,2BAA2B,CACnEpU,OADmE,EAEnEuI,WAFmE,CAArE;AAIA,UAAMkO,SAAS,GAAGnC,SAAS,CAAC/S,MAAV,CACf5O,IAAD,IAAUA,IAAI,CAAC7D,EAAL,KAAY+lB,QAAQ,CAAC/lB,EAArB,IAA2B6D,IAAI,CAAC7D,EAAL,KAAYwZ,WAAW,CAAC3V,IAAZ,CAAiB7D,EADlD,CAAlB;;AAIA,QAAIwZ,WAAW,CAACoB,mBAAhB,EAAqC;AACnC+M,MAAAA,SAAS,CAAC7b,IAAV,CACE,GAAG0N,WAAW,CAACoB,mBAAZ,CAAgCnI,MAAhC,CAAwCyQ,EAAD,IAAQ;AAChD,eACE,CAACyE,SAAS,CAAC/a,IAAV,CAAgBgb,CAAD,IAAOA,CAAC,CAAC5nB,EAAF,KAASkjB,EAAE,CAACljB,EAAlC,CAAD,IACAkjB,EAAE,CAACljB,EAAH,KAAU+lB,QAAQ,CAAC/lB,EADnB,IAEAkjB,EAAE,CAACljB,EAAH,KAAUwZ,WAAW,CAAC3V,IAAZ,CAAiB7D,EAH7B;AAKD,OANE,CADL;AASD;;AAED,QAAI,CAACquB,aAAL,EAAoB;AAClB,YAAMnY,aAAa,GAAGuD,WAAW,CAAC1D,gBAAZ,CAA6BgQ,QAAQ,CAAC9hB,KAAtC,CAAtB;AACA,UAAIuX,MAAJ;;AAEA,UACE9B,mBAAmB,IACnB,CAACD,WAAW,CAAC8F,YADb,IAEArJ,aAFA,IAGAuD,WAAW,CAAC1U,MAAZ,CAAmBkB,MAAnB,CAA0BI,MAA1B,CAAiC6P,aAAjC,CAJF,EAKE;AACA,cAAMwX,2BAA2B,GAAGjU,WAAW,CAACxD,iBAAZ,CAClCC,aADkC,EAElCsD,WAAW,CAACoB,mBAFsB,EAGlC;AACExE,UAAAA,qBAAqB,EAAE,IADzB;AAGE;;AAHF,SAHkC,CAApC;AAUA,cAAMoX,4BAA4B,GAChC3H,YAAY,CAAC3P,aAAD,CAAZ,CAA4BtP,gBAA5B,KAAiD,CADnD;AAGA,cAAMC,QAAQ,GACZ,CAAC6mB,2BAAD,IACA,CAACF,4BADD,IAEApU,KAAK,KAAK,UAHZ;AAKA,cAAM6I,SAAS,GAAG,MAAM5D,OAAO,CAACnN,OAAD,EAAUsI,WAAW,CAACK,MAAtB,CAA/B;AAEA,cAAMyU,SAAS,GAAG,MAAMlL,kBAAkB,CACxCnB,SADwC,EAExC/Q,OAFwC,EAGxCuI,WAHwC,EAIxCvD,aAJwC,EAKxC;AACE1B,UAAAA,GAAG,EAAE,CACH3N,QAAQ,IAAI,UADT,EAEHuS,KAAK,KAAK,mBAAV,IAAiC,aAF9B,EAGHA,KAAK,KAAK,mBAAV,IAAiC,kBAH9B,CADP;AAMEmK,UAAAA,MAAM,EAAE,CACN1c,QAAQ,IAAI,aADN,EAEN,CAAC6mB,2BAAD,IAAgC,WAF1B,EAGNtU,KAAK,KAAK,UAAV,IACE,CAACoU,4BADH,IAEE,kBALI,EAMNpU,KAAK,KAAK,mBAAV,IAAiC,UAN3B;AANV,SALwC,CAA1C;;AAsBA,YAAIvS,QAAQ,IAAI,CAAC2mB,4BAAjB,EAA+C;AAC7ChS,UAAAA,MAAM,GAAG,MAAMjC,mBAAmB,CAChC0I,SADgC,EAEhC/Q,OAFgC,EAGhCuI,WAHgC,EAIhCC,mBAJgC,EAKhC4U,SALgC,CAAlC;AAOD;AACF;;AAED,UAAI9U,WAAW,CAACqL,SAAhB,EAA2B;AACzBrL,QAAAA,WAAW,CAACqL,SAAZ,CAAsB1S,OAAtB,CAA+B2S,QAAD,IAAc;AAC1CrL,UAAAA,WAAW,CAACnH,KAAZ,CAAkBvB,UAAlB,CAA6B+T,QAAQ,CAAC7gB,KAAtC;AACD,SAFD;AAGD;;AACD,UACE,CAACuV,WAAW,CAACqL,SAAZ,CAAsBjY,IAAtB,CACEkY,QAAD,IAAcA,QAAQ,CAAC7gB,KAAT,KAAmB8hB,QAAQ,CAAC9hB,KAD3C,CADH,EAIE;AACAwV,QAAAA,WAAW,CAACnH,KAAZ,CAAkBvB,UAAlB,CAA6BgV,QAAQ,CAAC9hB,KAAtC;AACD;;AAED,YAAM6pB,0BAA0B,GAAG,MAAMjZ,UAAU,CAACrK,WAAX,CAAuB8c,iBAAvB,CAAyCzc,OAAzC,CACvC;AACE,sBAAc4O,WAAW,CAACtI,OAAZ,CAAoB/F,GADpC;AAEE,wBAAgBqO,WAAW,CAACjE,WAF9B;AAGExJ,QAAAA,IAAI,EAAE,kBAHR;AAIEub,QAAAA,MAAM,EAAG,GAAE/N,WAAW,CAACxZ,EAAG,IAAG+lB,QAAQ,CAAC/lB,EAAG;AAJ3C,OADuC,CAAzC;AASA,YAAMsQ,KAAK,GAAG4d,iBAAiB,CAAC9U,KAAD,CAA/B;;AAEA,UAAI0U,0BAAJ,EAAgC;AAC9B,cAAMtG,MAAM,GAAGsG,0BAA0B,CAACtG,MAA3B,CAAkC,CAAlC,CAAf;AACA,cAAM/T,OAAO,GAAGqa,0BAA0B,CAACra,OAA3C;AACA,cAAMlI,OAAO,CAACC,GAAR,CAAY,CAChBiO,WAAW,CAACnH,KAAZ,CAAkB1B,aAAlB,CAAgC4W,MAAM,CAACrT,EAAvC,EAA2CqT,MAAM,CAACtU,OAAlD,EAA2D,EACzD,GAAGO,OADsD;AAEzDK,UAAAA,IAAI,EAAEL,OAAO,CAACK,IAAR,CACHia,KADG,CACG,IADH,EAEHlpB,GAFG,CAEEyT,CAAD,IAAQ,IAAGA,CAAE,GAFd,EAGHgE,IAHG,CAGE,IAHF;AAFmD,SAA3D,CADgB,EAQhB7C,WAAW,CAACnH,KAAZ,CAAkBxB,WAAlB,CAA8B0W,MAAM,CAACrT,EAArC,EAAyCqT,MAAM,CAACtU,OAAhD,EAAyD5C,KAAzD,CARgB,EAShBuE,UAAU,CAACrK,WAAX,CAAuB8c,iBAAvB,CAAyC0G,SAAzC,CACEF,0BADF,CATgB,CAAZ,CAAN;AAaD;;AAED,UAAI,CAACjgB,IAAD,IAASuL,KAAK,KAAK,mBAAnB,IAA0CA,KAAK,KAAK,UAAxD,EAAoE;AAClE;AACD;;AAED,YAAM3I,OAAO,GAAGgJ,WAAW,CAACnH,KAAZ,CAAkB7B,OAAlB,CAA0BsV,QAAQ,CAAC9hB,KAAnC,CAAhB;AACA,YAAM6jB,KAAK,GAAGC,YAAA,CAAwBvO,WAAxB,EAAqCC,WAArC,CAAd;AACA,YAAMuO,YAAY,GAAGvO,WAAW,CAACnH,KAAZ,CAAkB7B,OAAlB,CACnB+I,WAAW,CAAC3V,IAAZ,CAAiBI,KADE,CAArB;;AAIA,YAAMikB,aAAa,GAAIC,OAAD,IAA+B;AACnD,cAAMC,SAAS,GAAGD,OAAO,GAAG,SAAH,GAAgB,GAAEH,YAAa,OAAxD;;AAEA,YAAI5O,KAAK,KAAK,mBAAd,EAAmC;AACjC,iBAAQ,IAAG9I,KAAM,KAAIG,OAAQ,wBAAuB2X,SAAU,IAAGN,KAAM,EAAvE;AACD;;AACD,YAAI1O,KAAK,KAAK,UAAd,EAA0B;AACxB,iBAAQ,GACN+O,OAAO,GAAG,SAAH,GAAe,EACvB,IAAG7X,KAAM,KAAIG,OAAQ,aAAY2X,SAAU,IAAGN,KAAM,GACnDtM,MAAM,GAAG,0BAAH,GAAgC,EACvC,EAJD;AAKD;;AAED,cAAMyM,WAAW,GAAGF,UAAA,CAAsBqG,SAAtB,EAAiC,WAAjC,CAApB;AACA,eAAQ,IAAG9d,KAAM,KAAIG,OAAQ,IAAGwX,WAAY,OAAMG,SAAU,IAAGN,KAAM,EAArE;AACD,OAhBD;;AAkBA,YAAMS,cAAc,GAAG7B,yBAAgB,CAAE7Y,IAAF,CAAvC;AAEA4L,MAAAA,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACE,WADF,EAEE8I,WAAW,CAAC3V,IAAZ,CAAiB7D,EAFnB,EAGEwZ,WAAW,CAAC3V,IAAZ,CAAiBI,KAHnB,EAIEkhB,oCAAoC,CAClC+C,aAAa,CAAC,IAAD,CADqB,EAElCK,cAFkC,CAJtC;AAUA,YAAM9U,OAAO,GAAG0R,oCAAoC,CAClD+C,aAAa,CAAC,KAAD,CADqC,EAElDK,cAFkD,CAApD;AAKAZ,MAAAA,SAAS,CAACxV,OAAV,CAAmBwW,QAAD,IAAc;AAC9BlP,QAAAA,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACE,kBADF,EAEEiY,QAAQ,CAAC3oB,EAFX,EAGE2oB,QAAQ,CAAC1kB,KAHX,EAIEwP,OAJF;AAMD,OAPD;AAQD,KA9JD,MA8JO,IAAI5F,IAAJ,EAAU;AACf,YAAM4C,OAAO,GAAGgJ,WAAW,CAACnH,KAAZ,CAAkB7B,OAAlB,CAA0BsV,QAAQ,CAAC9hB,KAAnC,CAAhB;AACA,YAAM6jB,KAAK,GAAGC,YAAA,CAAwBvO,WAAxB,EAAqCC,WAArC,CAAd;AACA,YAAMwO,WAAW,GAAGF,UAAA,CAAsBqG,SAAtB,EAAiC,WAAjC,CAApB;AAEA,YAAM3a,OAAO,GAAG0R,oCAAoC,CACjD,oBAAmB1U,OAAQ,IAAGwX,WAAY,cAAaH,KAAM,EADZ,EAElDja,IAFkD,CAApD;AAKA8Z,MAAAA,SAAS,CAACxV,OAAV,CAAmBwW,QAAD,IAAc;AAC9BlP,QAAAA,WAAW,CAACnH,KAAZ,CAAkB5B,WAAlB,CACE,kBADF,EAEEiY,QAAQ,CAAC3oB,EAFX,EAGE2oB,QAAQ,CAAC1kB,KAHX,EAIEwP,OAJF;AAMD,OAPD;AAQD;AACF,GAxNqB,CAF1B;AA6ND;;ACjPD,MAAM8a,YAAY,GAAG,CACnBnd,OADmB,EAEnByJ,QAFmB,KAGP;AACZ,MAAI,CAACA,QAAL,EAAe,OAAO,KAAP;AACf,SAAO,CAAC,CAACzJ,OAAO,CAACod,QAAR,CAAiB5hB,IAAjB,CAAuB6hB,CAAD,IAAOA,CAAC,CAACtoB,IAAF,KAAW0U,QAAQ,CAACb,MAAjD,CAAT;AACD,CAND;;AAQe,SAAS/S,MAAT,CAAgBsI,GAAhB,EAA6BsF,UAA7B,EAA2D;AACxEtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,QADF,EAEEH,yBAAyB,CACvB9M,UADuB,EAEvB,CAACzD,OAAD,EAAUqI,WAAV,KAA2C;AACzC,QAAIA,WAAW,CAAC8F,YAAhB,EAA8B,OAAO,EAAP;AAE9B,UAAM1E,QAAQ,GAAGpB,WAAW,CAACqB,gBAAZ,EAAjB;AACA,QAAI,CAACD,QAAL,EAAe,OAAO,EAAP;;AAEf,QAAIzJ,OAAO,CAACgI,KAAR,KAAkB,SAAlB,IAA+BmV,YAAY,CAACnd,OAAD,EAAUyJ,QAAV,CAA/C,EAAoE;AAClE,aAAO,CAACA,QAAD,CAAP;AACD;;AAED,WAAO,EAAP;AACD,GAbsB,EAcvB,CAACrC,EAAD,EAAKtH,OAAL,EAAcuI,WAAd,KAAoC;AAClC,UAAMoB,QAAQ,GAAGpB,WAAW,CAACqB,gBAAZ,EAAjB,CADkC;;AAGlC,QAAIyT,YAAY,CAACrd,OAAO,CAACE,OAAT,EAAkByJ,QAAlB,CAAhB,EAA6C;AAC3CpB,MAAAA,WAAW,CAACgC,UAAZ,CAAuBvK,OAAvB,EAAgC2J,QAAhC;AACD;AACF,GApBsB,CAF3B;AAyBD;;AChCc,SAAS6T,WAAT,CAAqBnf,GAArB,EAAkCsF,UAAlC,EAAgE;AAC7EtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,0BADF,EAEEP,wBAAwB,CACtB1M,UADsB,EAEtB,CAACzD,OAAD,EAAUF,OAAV,EAAmBuI,WAAnB,KAAmC;AACjC,QAAIA,WAAW,CAAC8F,YAAhB,EAA8B,OAAO,IAAP;AAC9B,WAAOnO,OAAO,CAACqT,YAAf;AACD,GALqB,EAMtB,OACEjL,WADF,EAEEtI,OAFF,EAGEuI,WAHF,EAIEC,mBAJF,KAKoB;AAClB,QAAI,CAACA,mBAAL,EAA0B;AAE1B,UAAMuI,SAAS,GAAG,MAAM5D,OAAO,CAACnN,OAAD,EAAUsI,WAAW,CAACK,MAAtB,CAA/B,CAHkB;AAKlB;;AACA,UAAM2I,WAAW,GAAItR,OAAO,CAACE,OAAT,CAAyBud,MAA7C;AAEA,UAAMpjB,OAAO,CAACC,GAAR,CAAY,CAChBsgB,YAAY,CACV7J,SADU,EAEV/Q,OAFU,EAGVuI,WAHU,EAIVC,mBAJU,EAKV,IALU,EAMV8I,WANU,CADI;AAUhBQ,IAAAA,2BAA2B,CACzBf,SADyB,EAEzB/Q,OAFyB,EAGzBuI,WAHyB,EAIzBwI,SAAS,CAAChc,MAJe,EAKzBuc,WALyB,CAVX,CAAZ,CAAN,CARkB;;AA4BlB,UAAMjJ,mBAAmB,CACvB0I,SADuB,EAEvB/Q,OAFuB,EAGvBuI,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,GA7CqB,CAF1B;AAkDD;;ACrDc,SAASkV,UAAT,CAAoBrf,GAApB,EAAiCsF,UAAjC,EAA+D;AAC5EtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,mBADF,EAEE1K,sBAAsB,CACpBvC,UADoB,EAEpB,MAAO3D,OAAP,IAA8C;AAC5C,UAAMuI,WAAW,GAAG,MAAM0H,iBAAiB,CAACtM,UAAD,EAAa3D,OAAb,CAA3C;AACA,QAAI,CAACuI,WAAL,EAAkB;AAClB,UAAMhL,IAAI,GAAGyC,OAAO,CAACE,OAAR,CAAgB9C,UAA7B;AACAmL,IAAAA,WAAW,CAACU,YAAZ,GAA2B1L,IAAI,CAAC2L,SAAhC;AACAX,IAAAA,WAAW,CAACkG,SAAZ,GAAwBvP,2BAA2B,CAAC3B,IAAI,CAACzF,WAAN,CAAnD;AACD,GARmB,CAFxB;AAaD;;AClBD;AAsBe,SAAS6lB,OAAT,CAAiBtf,GAAjB,EAA8BsF,UAA9B,EAA4D;AACzE;AACAtF,EAAAA,GAAG,CAACuS,EAAJ,CACE,CAAC,2BAAD,EAA8B,6BAA9B,CADF,EAEE1K,sBAAsB,CACpBvC,UADoB,EAEpB,OAAO3D,OAAP,EAAgB+F,cAAhB,KAAmC;AACjC,UAAMlM,OAAO,CACX8J,UAAU,CAACrK,WADA,EAEX0G,OAAO,CAACyD,OAFG,EAGXsC,cAAc,CAAC9F,OAAf,CAAuBlG,cAHZ,EAIXiG,OAAO,CAACE,OAAR,CAAgB+F,YAJL,CAAb;AAMD,GATmB,CAFxB;AAeA;;AACA5H,EAAAA,GAAG,CAACuS,EAAJ,CACE,CAAC,cAAD,EAAiB,cAAjB,EAAiC,aAAjC,CADF,EAEE1K,sBAAsB,CACpBvC,UADoB,EAEpB,MAAO3D,OAAP,IAAmC;AACjC,UAAM9E,SAAS,CACbyI,UAAU,CAACrK,WADE,EAEb0G,OAAO,CAACyD,OAFK,EAGbzD,OAAO,CAACE,OAAR,CAAgB+F,YAHH,CAAf;AAKD,GARmB,CAFxB,EAlByE;AAiCzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AACA;;AACAyX,EAAAA,UAAU,CAACrf,GAAD,EAAMsF,UAAN,CAAV,CAlDyE;;AAqDzE;;AACAia,EAAAA,MAAa,CAACvf,GAAD,EAAMsF,UAAN,CAAb;AACAka,EAAAA,MAAa,CAACxf,GAAD,EAAMsF,UAAN,CAAb;AACAma,EAAAA,MAAa,CAACzf,GAAD,EAAMsF,UAAN,CAAb;AACAoa,EAAAA,QAAe,CAAC1f,GAAD,EAAMsF,UAAN,CAAf;AAEAqa,EAAAA,eAAsB,CAAC3f,GAAD,EAAMsF,UAAN,CAAtB;AACAsa,EAAAA,oBAA2B,CAAC5f,GAAD,EAAMsF,UAAN,CAA3B;AACAua,EAAAA,eAAsB,CAAC7f,GAAD,EAAMsF,UAAN,CAAtB;AACAwa,EAAAA,eAAsB,CAAC9f,GAAD,EAAMsF,UAAN,CAAtB;AACA+X,EAAAA,aAAa,CAACrd,GAAD,EAAMsF,UAAN,CAAb;AACAya,EAAAA,WAAkB,CAAC/f,GAAD,EAAMsF,UAAN,CAAlB;AAEA;;AACA;;AACA0a,EAAAA,gBAAc,CAAChgB,GAAD,EAAMsF,UAAN,CAAd;AACA2a,EAAAA,wBAAsB,CAACjgB,GAAD,EAAMsF,UAAN,CAAtB;AAEA;;AACAgN,EAAAA,iBAAiB,CAACtS,GAAD,EAAMsF,UAAN,CAAjB;AAEA;;AACAqN,EAAAA,mBAAmB,CAAC3S,GAAD,EAAMsF,UAAN,CAAnB;AAEA;;AACA5N,EAAAA,MAAM,CAACsI,GAAD,EAAMsF,UAAN,CAAN;AAEA;AACA;AACD;;AC1GD;;AA2HA,IAAI,CAACrV,OAAO,CAACC,GAAR,CAAYgwB,QAAjB,EAA2B;AACzB,QAAM,IAAI9vB,KAAJ,CAAU,oCAAV,CAAN;AACD;;AAEc,SAAS+vB,IAAT,GAA6B;AAC1C,QAAM3qB,MAAM,GAAG,IAAI+E,GAAJ,CAAQ,CACrB,CAAC,MAAD,EAAStK,OAAO,CAACC,GAAR,CAAYkwB,UAAZ,IAA0B,WAAnC,CADqB,EAErB,CAAC,MAAD,EAASnwB,OAAO,CAACC,GAAR,CAAYmwB,UAAZ,IAA0B,OAAnC,CAFqB,EAGrB,CAAC,UAAD,EAAapwB,OAAO,CAACC,GAAR,CAAYgwB,QAAzB,CAHqB,CAAR,CAAf;;AAKA,MAAIjwB,OAAO,CAACC,GAAR,CAAYowB,UAAhB,EAA4B;AAC1B9qB,IAAAA,MAAM,CAACuF,GAAP,CAAW,MAAX,EAAmB9K,OAAO,CAACC,GAAR,CAAYowB,UAA/B;AACA9qB,IAAAA,MAAM,CAACuF,GAAP,CAAW,UAAX,EAAuB9K,OAAO,CAACC,GAAR,CAAYqwB,cAAnC;AACD;;AACD,QAAMC,UAAU,GAAG,IAAIC,yBAAJ,CAAoBjrB,MAApB,CAAnB,CAV0C;AAa1C;AACA;AACA;;AAEA,QAAM6F,cAAc,GAAG,IAAIqlB,oBAAJ,CACrBF,UADqB,EAErB,gBAFqB,CAAvB;AAIAnlB,EAAAA,cAAc,CAACkD,UAAf,CAA0BkJ,IAA1B,CAAgCkZ,IAAD,IAAU;AACvCA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAEhmB,MAAAA,MAAM,EAAE,CAAV;AAAaM,MAAAA,KAAK,EAAE;AAApB,KAAjB,EAA0C;AAAE2lB,MAAAA,MAAM,EAAE;AAAV,KAA1C;AACD,GAFD;AAIA,QAAMtsB,KAAK,GAAG,IAAImsB,oBAAJ,CAAqBF,UAArB,EAAiC,OAAjC,CAAd;AACAjsB,EAAAA,KAAK,CAACgK,UAAN,CAAiBkJ,IAAjB,CAAuBkZ,IAAD,IAAU;AAC9BA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAElsB,MAAAA,KAAK,EAAE;AAAT,KAAjB,EAA+B;AAAEmsB,MAAAA,MAAM,EAAE;AAAV,KAA/B;AACD,GAFD;AAIA,QAAM3rB,IAAI,GAAG,IAAIwrB,oBAAJ,CAAoBF,UAApB,EAAgC,MAAhC,CAAb;AACAtrB,EAAAA,IAAI,CAACqJ,UAAL,CAAgBkJ,IAAhB,CAAsBkZ,IAAD,IAAU;AAC7BA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAElsB,MAAAA,KAAK,EAAE;AAAT,KAAjB,EAA+B;AAAEmsB,MAAAA,MAAM,EAAE;AAAV,KAA/B;AACD,GAFD;AAIA,QAAMrkB,UAAU,GAAG,IAAIkkB,oBAAJ,CAA0BF,UAA1B,EAAsC,YAAtC,CAAnB;AACAhkB,EAAAA,UAAU,CAAC+B,UAAX,CAAsBkJ,IAAtB,CAA4BkZ,IAAD,IAAU;AACnCA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAE,iBAAW,CAAb;AAAgB,gBAAU;AAA1B,KAAjB,EAAgD;AAAEC,MAAAA,MAAM,EAAE;AAAV,KAAhD;AACD,GAFD;AAIA,QAAM7jB,QAAQ,GAAG,IAAI0jB,oBAAJ,CAAwBF,UAAxB,EAAoC,UAApC,CAAjB;AACAxjB,EAAAA,QAAQ,CAACuB,UAAT,CAAoBkJ,IAApB,CAA0BkZ,IAAD,IAAU;AACjCA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAE,gBAAU;AAAZ,KAAjB;AACD,GAFD;AAIA,QAAM7I,iBAAiB,GAAG,IAAI2I,oBAAJ,CACxBF,UADwB,EAExB,mBAFwB,CAA1B;AAIAzI,EAAAA,iBAAiB,CAACxZ,UAAlB,CAA6BkJ,IAA7B,CAAmCkZ,IAAD,IAAU;AAC1CA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AACf,oBAAc,CADC;AAEf,sBAAgB,CAFD;AAGfnkB,MAAAA,IAAI,EAAE,CAHS;AAIfub,MAAAA,MAAM,EAAE;AAJO,KAAjB,EAD0C;;AAQ1C2I,IAAAA,IAAI,CAACjkB,UAAL,CAAgB;AACdmC,MAAAA,OAAO,EAAE;AAAEiiB,QAAAA,GAAG,EAAE,IAAIlsB,IAAJ,CAASA,IAAI,CAACC,GAAL,eAAT;AAAP;AADK,KAAhB;AAGD,GAXD;AAaA,QAAMiW,aAAa,GAAG,IAAI4V,oBAAJ,CACpBF,UADoB,EAEpB,eAFoB,CAAtB;AAIA1V,EAAAA,aAAa,CAACvM,UAAd,CAAyBkJ,IAAzB,CAA+BkZ,IAAD,IAAU;AACtCA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AACfhW,MAAAA,YAAY,EAAE,CADC;AAEfnO,MAAAA,IAAI,EAAE;AAFS,KAAjB;AAIAkkB,IAAAA,IAAI,CAACC,WAAL,CAAiB;AACfhW,MAAAA,YAAY,EAAE,CADC;AAEf,mBAAa;AAFE,KAAjB,EALsC;;AAUtC+V,IAAAA,IAAI,CAACjkB,UAAL,CAAgB;AACdmC,MAAAA,OAAO,EAAE;AAAEiiB,QAAAA,GAAG,EAAE,IAAIlsB,IAAJ,CAASA,IAAI,CAACC,GAAL,eAAT;AAAP;AADK,KAAhB;AAGD,GAbD;AAeA,QAAM6Z,GAAG,GAAG,IAAIgS,oBAAJ,CAA6BF,UAA7B,EAAyC,KAAzC,CAAZ;AACA9R,EAAAA,GAAG,CAACnQ,UAAJ,CAAekJ,IAAf,CAAqBkZ,IAAD,IAAU;AAC5BA,IAAAA,IAAI,CAACC,WAAL,CACE;AACE,oBAAc,CADhB;AAEE,iBAAW,CAFb;AAGE,mBAAa;AAHf,KADF,EAME;AAAEC,MAAAA,MAAM,EAAE;AAAV,KANF,EAD4B;;AAU5BF,IAAAA,IAAI,CAACjkB,UAAL,CAAgB;AACdmC,MAAAA,OAAO,EAAE;AAAEiiB,QAAAA,GAAG,EAAE,IAAIlsB,IAAJ,CAASA,IAAI,CAACC,GAAL,gBAAT;AAAP;AADK,KAAhB;AAGD,GAbD,EAlF0C;;AAkG1C,SAAO;AACL2rB,IAAAA,UADK;AAELnlB,IAAAA,cAFK;AAGL9G,IAAAA,KAHK;AAILW,IAAAA,IAJK;AAKLsH,IAAAA,UALK;AAMLQ,IAAAA,QANK;AAOL+a,IAAAA,iBAPK;AAQLjN,IAAAA,aARK;AASL4D,IAAAA;AATK,GAAP;AAWD;;ACjOM,MAAMqS,qBAAqB,GAAI9lB,WAAD,IAA8B;AACjE,QAAM+lB,YAAY,GAAG,OACnBvlB,MADmB,EAEnB6G,WAFmB,EAGnBhG,MAHmB,KAID;AAAA;;AAClB,QAAI,mBAACA,MAAM,CAACyG,KAAR,0CAAC,cAActS,EAAf,CAAJ,EAAuB,OADL;;AAIlB;;AACA,UAAM,CACJwwB,uBADI,EAEJC,UAFI,EAGJC,uBAHI,EAIJC,UAJI,IAKF,MAAMplB,OAAO,CAACC,GAAR,CAAY,CACpBR,MAAM,CAAC4lB,MAAP,CAAcC,qBAAd,CAAoC;AAClCC,MAAAA,CAAC,EAAG,cAAajlB,MAAM,CAAC/G,GAAP,CAAWb,KAAM,6BAA4B4H,MAAM,CAAChI,IAAP,CAAYI,KAAM,GAD9C;AAElC8sB,MAAAA,IAAI,EAAE,SAF4B;AAGlCC,MAAAA,KAAK,EAAE;AAH2B,KAApC,CADoB,EAMpBhmB,MAAM,CAAC4lB,MAAP,CAAcC,qBAAd,CAAoC;AAClCC,MAAAA,CAAC,EAAG,cAAajlB,MAAM,CAAC/G,GAAP,CAAWb,KAAM,qBAAoB4H,MAAM,CAAChI,IAAP,CAAYI,KAAM,kCADtC;AAElC8sB,MAAAA,IAAI,EAAE,SAF4B;AAGlCC,MAAAA,KAAK,EAAE;AAH2B,KAApC,CANoB,EAWpBhmB,MAAM,CAAC4lB,MAAP,CAAcC,qBAAd,CAAoC;AAClCC,MAAAA,CAAC,EAAG,cAAajlB,MAAM,CAAC/G,GAAP,CAAWb,KAAM,qBAAoB4H,MAAM,CAAChI,IAAP,CAAYI,KAAM,2CADtC;AAElC8sB,MAAAA,IAAI,EAAE,SAF4B;AAGlCC,MAAAA,KAAK,EAAE;AAH2B,KAApC,CAXoB,EAgBpBhmB,MAAM,CAAC4lB,MAAP,CAAcC,qBAAd,CAAoC;AAClCC,MAAAA,CAAC,EAAG,cAAajlB,MAAM,CAAC/G,GAAP,CAAWb,KAAM,qBAAoB4H,MAAM,CAAChI,IAAP,CAAYI,KAAM,aADtC;AAElC8sB,MAAAA,IAAI,EAAE,SAF4B;AAGlCC,MAAAA,KAAK,EAAE,MAH2B;AAIlCxiB,MAAAA,QAAQ,EAAE;AAJwB,KAApC,CAhBoB,CAAZ,CALV;AA6BA,UAAMuF,MAAa,GAAG,EAAtB;;AAEA,UAAMkd,WAAW,GAAG,CAACzwB,KAAD,EAAgB4mB,OAAhB,KAAiC;AACnD,UAAI,CAACA,OAAO,CAAC8J,WAAb,EAA0B;AAE1Bnd,MAAAA,MAAM,CAACjI,IAAP,CACE;AACEE,QAAAA,IAAI,EAAE,SADR;AAEE8H,QAAAA,IAAI,EAAE;AACJ9H,UAAAA,IAAI,EAAE,QADF;AAEJ8H,UAAAA,IAAI,EAAG,IAAGtT,KAAM;AAFZ;AAFR,OADF,EAQE;AACEwL,QAAAA,IAAI,EAAE;AADR,OARF,EAWE,GAAGob,OAAO,CAAC+J,KAAR,CACAtsB,GADA,CACK2T,EAAD,IAAa;AAChB,cAAM2G,QAAQ,GAAG3G,EAAE,CAAC4Y,cAAH,CAAkBvS,KAAlB,IAAjB;AAGA,cAAMwS,UAAU,GAAI,GAAElS,QAAS,IAAG3G,EAAE,CAACqB,MAAO,EAA5C;AAEA,eAAO,CACL;AACE7N,UAAAA,IAAI,EAAE,SADR;AAEE8H,UAAAA,IAAI,EAAE;AACJ9H,YAAAA,IAAI,EAAE,QADF;AAEJ8H,YAAAA,IAAI,EAAG,IAAGiR,UAAU,CAACvM,EAAE,CAACyM,QAAJ,EAAczM,EAAE,CAAChY,KAAjB,CAAwB,GAFxC;;AAAA;AAFR,SADK,EASL;AACEwL,UAAAA,IAAI,EAAE,SADR;AAEEslB,UAAAA,QAAQ,EAAE,CACR;AACEtlB,YAAAA,IAAI,EAAE,QADR;AAEE8H,YAAAA,IAAI,EAAG,GAAEiR,UAAU,CAACvM,EAAE,CAACyM,QAAJ,EAAcoM,UAAd,CAA0B,IAC3C7Y,EAAE,CAAC+Y,KAAH,GAAW,WAAX,GAAyB,EAC1B;AAJH,WADQ,EAOR;AACEvlB,YAAAA,IAAI,EAAE,OADR;AAEEwlB,YAAAA,SAAS,EAAEhZ,EAAE,CAAC3U,IAAH,CAAQ4tB,UAFrB;AAGEC,YAAAA,QAAQ,EAAElZ,EAAE,CAAC3U,IAAH,CAAQI;AAHpB,WAPQ,EAYR;AACE+H,YAAAA,IAAI,EAAE,QADR;AAEE8H,YAAAA,IAAI,EAAG,GAAE0E,EAAE,CAAC3U,IAAH,CAAQI,KAAM;AAFzB,WAZQ;AAFZ,SATK,CAAP;AA8BD,OArCA,EAsCA0tB,IAtCA,EAXL,EAkDE;AACE3lB,QAAAA,IAAI,EAAE,SADR;AAEEslB,QAAAA,QAAQ,EAAE,CACR;AACEtlB,UAAAA,IAAI,EAAE,OADR;AAEEwlB,UAAAA,SAAS,EACP,sEAHJ;AAIEE,UAAAA,QAAQ,EAAE;AAJZ,SADQ;AAFZ,OAlDF;AA8DD,KAjED;;AAmEAT,IAAAA,WAAW,CAAC,0BAAD,EAA6BT,uBAAuB,CAACxsB,IAArD,CAAX;AACAitB,IAAAA,WAAW,CAAC,mCAAD,EAAsCR,UAAU,CAACzsB,IAAjD,CAAX;AACAitB,IAAAA,WAAW,CAAC,uBAAD,EAA0BP,uBAAuB,CAAC1sB,IAAlD,CAAX;AACAitB,IAAAA,WAAW,CAAC,uBAAD,EAA0BN,UAAU,CAAC3sB,IAArC,CAAX;;AAEA,QAAI+P,MAAM,CAACpF,MAAP,KAAkB,CAAtB,EAAyB;AACvBoF,MAAAA,MAAM,CAACjI,IAAP,CAAY;AACVE,QAAAA,IAAI,EAAE,SADI;AAEV8H,QAAAA,IAAI,EAAE;AACJ9H,UAAAA,IAAI,EAAE,QADF;AAEJ8H,UAAAA,IAAI,EAAE;AAFF;AAFI,OAAZ;AAOD;;AAEDjC,IAAAA,WAAW,CAAC+f,KAAZ,CAAkBC,OAAlB,CAA0B;AACxBC,MAAAA,OAAO,EAAEjmB,MAAM,CAACyG,KAAP,CAAatS,EADE;AAExB+xB,MAAAA,IAAI,EAAE;AACJ/lB,QAAAA,IAAI,EAAE,MADF;AAEJ+H,QAAAA;AAFI;AAFkB,KAA1B;AAOD,GAjID;;AAmIA,MAAIie,cAAJ;AACA,QAAMC,SAAS,GAAG,IAAI7c,GAAJ,EAAlB;AACA,QAAM8c,KAAkB,GAAG,EAA3B;;AAEA,QAAMC,IAAI,GAAG,MAAY;AACvB,QAAIH,cAAc,KAAK3vB,SAAvB,EAAkC;AAChC+vB,MAAAA,aAAa,CAACJ,cAAD,CAAb;AACAA,MAAAA,cAAc,GAAG3vB,SAAjB;AACD;AACF,GALD;;AAOA,QAAMgwB,KAAK,GAAG,MAAY;AACxB,QAAIL,cAAc,KAAK3vB,SAAvB,EAAkC;AAClC2vB,IAAAA,cAAc,GAAGM,WAAW,CAAC,MAAM;AAAA;;AACjC,YAAMC,IAAI,GAAGL,KAAK,CAACrR,KAAN,EAAb;;AACA,UAAI,CAAC0R,IAAL,EAAW;AACTJ,QAAAA,IAAI;AACJ;AACD;;AAED,YAAM;AAAEnnB,QAAAA,MAAF;AAAU6G,QAAAA,WAAV;AAAuBhG,QAAAA;AAAvB,UAAkC0mB,IAAxC;AACA,YAAMC,QAAQ,qBAAG3mB,MAAM,CAACyG,KAAV,mDAAG,eAActS,EAA/B;AAEA,YAAMwN,GAAG,GAAI,GAAE3B,MAAM,CAAC/G,GAAP,CAAW9E,EAAG,IAAGwyB,QAAS,EAAzC;AACAP,MAAAA,SAAS,CAAC3d,MAAV,CAAiB9G,GAAjB;AAEA+iB,MAAAA,YAAY,CAACvlB,MAAD,EAAS6G,WAAT,EAAsBhG,MAAtB,CAAZ;AACD,KAd2B,EAczB,IAdyB,CAA5B,CAFwB;AAiBzB,GAjBD;;AAmBA,QAAM6I,oBAAoB,GAAG,CAC3B1J,MAD2B,EAE3B6G,WAF2B,EAG3BhG,MAH2B,KAIlB;AAAA;;AACT,UAAM2mB,QAAQ,qBAAG3mB,MAAM,CAACyG,KAAV,mDAAG,eAActS,EAA/B;AACA,QAAI,CAACwyB,QAAL,EAAe;AAEf,UAAMhlB,GAAG,GAAI,GAAE3B,MAAM,CAAC/G,GAAP,CAAW9E,EAAG,IAAGwyB,QAAS,EAAzC;;AAEA,QAAI,CAACP,SAAS,CAACnf,GAAV,CAActF,GAAd,CAAL,EAAyB;AACvBykB,MAAAA,SAAS,CAACzd,GAAV,CAAchH,GAAd;AACA0kB,MAAAA,KAAK,CAACpmB,IAAN,CAAW;AACTd,QAAAA,MADS;AAET6G,QAAAA,WAFS;AAGThG,QAAAA;AAHS,OAAX;AAKAwmB,MAAAA,KAAK;AACN;AACF,GAnBD;;AAqBA,QAAMI,iBAAiB,GAAG,OACxBznB,MADwB,EAExBlG,GAFwB,EAGxB+M,WAAW,GAAG,IAAIC,gBAAJ,CAAchN,GAAG,CAACuM,UAAlB,CAHU,KAIN;AAClB,UAAMqhB,MAAM,GAAG,MAAMloB,WAAW,CAACuB,UAAZ,CAAuB2mB,MAAvB,EAArB;AACAA,IAAAA,MAAM,CAACvgB,OAAP,CAAgBtG,MAAD,IAAY;AACzB6I,MAAAA,oBAAoB,CAAC1J,MAAD,EAAS6G,WAAT,EAAsBhG,MAAtB,CAApB;AACD,KAFD;AAGD,GATD;;AAsBA,SAAO;AACL6I,IAAAA,oBADK;AAEL+d,IAAAA,iBAFK;AAGLE,IAAAA,qBAAqB,EAdO,OAC5BzyB,IAD4B,KAEV;AAClB,YAAMwyB,MAAM,GAAG,MAAMloB,WAAW,CAAC/F,IAAZ,CAAiBiuB,MAAjB,EAArB;AACAA,MAAAA,MAAM,CAACvgB,OAAP,CAAe,MAAOrN,GAAP,IAAe;AAC5B,YAAI,CAACA,GAAG,CAACuM,UAAL,IAAmB,CAACvM,GAAG,CAACmG,cAA5B,EAA4C;AAC5C,cAAMD,MAAM,GAAG,MAAM9K,IAAI,CAAC4E,GAAG,CAACmG,cAAL,CAAzB;AACA,cAAMwnB,iBAAiB,CAACznB,MAAD,EAASlG,GAAT,CAAvB;AACD,OAJD;AAKD;AAEM,GAAP;AAKD,CAlNM;;ACXP;AASA,IAAI,CAACtF,OAAO,CAACC,GAAR,CAAYgB,eAAjB,EAAkCjB,OAAO,CAACC,GAAR,CAAYgB,eAAZ,GAA8B,YAA9B;AAClC0S,OAAO,CAACO,GAAR,CAAY;AAAEvN,EAAAA,IAAI,EAAE3G,OAAO,CAACC,GAAR,CAAYgB;AAApB,CAAZ;AAGA;AAEA;AACA;AAEA;;AAEAmyB,UAAG,CAAC,CAAC;AAAErjB,EAAAA,GAAF;AAAOC,EAAAA;AAAP,CAAD,KAAwB;AAC1B,QAAMhF,WAAW,GAAGqoB,IAAS,EAA7B;AACA,QAAM5hB,SAAS,GAAGqf,qBAAqB,CAAC9lB,WAAD,CAAvC;AACA,QAAMqK,UAAsB,GAAG;AAAErK,IAAAA,WAAF;AAAeyG,IAAAA;AAAf,GAA/B;AACA3B,EAAAA,SAAS,CAACC,GAAD,EAAMC,SAAN,EAAiBqF,UAAjB,CAAT;AACAga,EAAAA,OAAO,CAACtf,GAAD,EAAMsF,UAAN,CAAP;AACA5D,EAAAA,SAAS,CAAC0hB,qBAAV,CAAiC3yB,EAAD,IAAgBuP,GAAG,CAACrP,IAAJ,CAASF,EAAT,CAAhD;AACD,CAPE,CAAH;;"} \ No newline at end of file +{"version":3,"file":"index-node10-dev.cjs.js","sources":["../src/auth/github.ts","../src/views/Layout.tsx","../src/app/auth.tsx","../src/app/home.tsx","../src/accountConfigs/christophehurpeau.ts","../src/accountConfigs/defaultConfig.ts","../src/accountConfigs/ornikar.ts","../src/accountConfigs/reviewflow.ts","../src/accountConfigs/index.ts","../src/dm/defaultDmSettings.ts","../src/dm/getUserDmSettings.ts","../src/events/account-handlers/actions/syncOrg.ts","../src/events/account-handlers/actions/syncTeams.ts","../src/app/org-settings.tsx","../src/app/repository.tsx","../src/events/account-handlers/actions/syncUser.ts","../src/app/user-settings.tsx","../src/appRouter.tsx","../src/utils/Excludes.ts","../src/context/getOrCreateAccount.ts","../src/context/utils.ts","../src/context/voidTeamSlack.ts","../src/context/initTeamSlack.ts","../src/context/accountContext.ts","../src/events/account-handlers/utils/handler.ts","../src/events/pr-handlers/actions/utils/body/prOptions.ts","../src/events/pr-handlers/actions/utils/body/parseBody.ts","../src/events/pr-handlers/actions/utils/hasLabelInPR.ts","../src/events/pr-handlers/actions/autoMergeIfPossible.ts","../src/events/pr-handlers/actions/utils/body/updateBody.ts","../src/events/pr-handlers/utils/reviewflowComment.ts","../src/events/pr-handlers/utils/createPullRequestContext.ts","../src/events/pr-handlers/utils/fetchPr.ts","../src/context/initRepoLabels.ts","../src/context/repoContext.ts","../src/events/repository-handlers/utils/createRepoHandler.ts","../src/events/pr-handlers/utils/createPullRequestHandler.ts","../src/events/pr-handlers/checkrunCompleted.ts","../src/events/pr-handlers/checksuiteCompleted.ts","../src/events/pr-handlers/actions/utils/createStatus.ts","../src/events/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/events/pr-handlers/actions/updateReviewStatus.ts","../src/events/pr-handlers/closed.ts","../src/slack/utils.ts","../src/events/pr-handlers/utils/createSlackMessageWithSecondaryBlock.ts","../src/events/pr-handlers/utils/getPullRequestFromPayload.ts","../src/events/pr-handlers/utils/getReviewersAndReviewStates.ts","../src/events/pr-handlers/utils/isBotUser.ts","../src/events/pr-handlers/utils/parseMentions.ts","../src/events/pr-handlers/utils/slackifyCommentBody.ts","../src/events/pr-handlers/commentCreated.ts","../src/events/pr-handlers/actions/updatePrCommentBody.ts","../src/events/pr-handlers/actions/utils/syncLabel.ts","../src/events/pr-handlers/actions/syncLabelsAfterCommentBodyEdited.ts","../src/events/pr-handlers/commentEditedOrDeleted.ts","../src/events/pr-handlers/actions/readCommitsAndUpdateInfos.ts","../src/events/pr-handlers/actions/updatePr.ts","../src/events/pr-handlers/actions/utils/cleanTitle.ts","../src/events/pr-handlers/actions/editOpenedPR.ts","../src/events/pr-handlers/edited.ts","../src/events/pr-handlers/actions/updateBranch.ts","../src/events/pr-handlers/labelsChanged.ts","../src/events/pr-handlers/actions/autoApproveAndAutoMerge.ts","../src/events/pr-handlers/actions/autoAssignPRToCreator.ts","../src/events/pr-handlers/opened.ts","../src/events/pr-handlers/reopened.ts","../src/events/pr-handlers/reviewDismissed.ts","../src/events/pr-handlers/reviewRequestRemoved.ts","../src/events/pr-handlers/reviewRequested.ts","../src/events/pr-handlers/reviewSubmitted.ts","../src/events/pr-handlers/status.ts","../src/events/pr-handlers/synchronize.ts","../src/events/repository-handlers/repoEdited.ts","../src/initApp.ts","../src/mongo.ts","../src/slack/home.ts","../src/index.ts"],"sourcesContent":["import { create } from 'simple-oauth2';\n\nif (!process.env.GITHUB_CLIENT_ID) {\n throw new Error('Missing env variable: GITHUB_CLIENT_ID');\n}\n\nif (!process.env.GITHUB_CLIENT_SECRET) {\n throw new Error('Missing env variable: GITHUB_CLIENT_SECRET');\n}\n\nexport const oauth2 = create({\n client: {\n id: process.env.GITHUB_CLIENT_ID,\n secret: process.env.GITHUB_CLIENT_SECRET,\n },\n auth: {\n tokenHost: 'https://github.com',\n tokenPath: '/login/oauth/access_token',\n authorizePath: '/login/oauth/authorize',\n },\n});\n","import type { ReactElement, ReactNode } from 'react';\nimport React from 'react';\n\ninterface LayoutProps {\n lang?: string;\n title?: string;\n children: ReactNode;\n}\n\nexport default function Layout({\n lang = 'en',\n title = process.env.REVIEWFLOW_NAME,\n children,\n}: LayoutProps): ReactElement {\n return (\n \n \n \n \n {title}\n \n \n \n \n
{children}
\n \n \n );\n}\n","import { promisify } from 'util';\nimport { Octokit } from '@octokit/rest';\nimport type { Router, Request, Response } from 'express';\nimport { sign, verify } from 'jsonwebtoken';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport * as githubAuth from '../auth/github';\nimport Layout from '../views/Layout';\n\nif (!process.env.AUTH_SECRET_KEY) {\n throw new Error('Missing env variable: AUTH_SECRET_KEY');\n}\n\nconst AUTH_SECRET_KEY: string = process.env.AUTH_SECRET_KEY;\n\nconst signPromisified: any = promisify(sign);\nconst verifyPromisified: any = promisify(verify);\n\nconst secure =\n !!process.env.SECURE_COOKIE && process.env.SECURE_COOKIE !== 'false';\n\nconst createRedirectUri = (req: Request): string => {\n const host = `http${secure ? 's' : ''}://${req.hostname}${\n req.hostname === 'localhost' ? `:${process.env.PORT}` : ''\n }`;\n return `${host}/app/login-response`;\n};\n\ninterface AuthInfo {\n id: number;\n login: string;\n accessToken: string;\n time: number;\n}\n\nconst readAuthCookie = (\n req: Request,\n strategy: string,\n): undefined | Promise => {\n const cookie = req.cookies[`auth_${strategy}`];\n if (!cookie) return;\n\n return verifyPromisified(cookie, AUTH_SECRET_KEY, {\n algorithm: 'HS512',\n audience: req.headers['user-agent'],\n });\n};\n\nconst getAuthInfoFromCookie = async (\n req: Request,\n res: Response,\n): Promise => {\n const strategy = 'gh'; // req.params.strategy\n const authInfo = await readAuthCookie(req, strategy);\n\n if (authInfo?.id) {\n return authInfo;\n }\n\n res.clearCookie(`auth_${strategy}`);\n return undefined;\n};\n\nfunction createApi(accessToken: string): Octokit {\n return new Octokit({ auth: accessToken });\n}\n\nexport const getUser = async (\n req: Request,\n res: Response,\n): Promise<{\n authInfo: AuthInfo;\n api: Octokit;\n} | null> => {\n const authInfo = await getAuthInfoFromCookie(req, res);\n if (!authInfo) {\n res.redirect('/app/login');\n return null;\n }\n\n const api = createApi(authInfo.accessToken);\n\n return {\n authInfo,\n api,\n };\n};\n\nexport default function auth(router: Router): void {\n router.get('/login', async (req: Request, res: Response) => {\n if (await getAuthInfoFromCookie(req, res)) {\n return res.redirect('/app');\n }\n\n // const state = await randomHex(8);\n // res.cookie(`auth_${strategy}_${state}`, strategy, {\n // maxAge: 10 * 60 * 1000,\n // httpOnly: true,\n // secure,\n // });\n\n const redirectUri = githubAuth.oauth2.authorizationCode.authorizeURL({\n redirect_uri: createRedirectUri(req),\n scope: 'read:user,repo',\n // state,\n // grant_type: options.grantType,\n // access_type: options.accessType,\n // login_hint: req.query.loginHint,\n // include_granted_scopes: options.includeGrantedScopes,\n });\n\n // console.log(redirectUri);\n\n res.redirect(redirectUri);\n });\n\n router.get('/login-response', async (req, res) => {\n if (req.query.error) {\n res.send(req.query.error_description);\n return;\n }\n\n const strategy = 'gh';\n const code: string = req.query.code as string;\n // const state = req.query.state;\n // const cookieName = `auth_${strategy}_${state}`;\n // const cookie = req.cookies && req.cookies[cookieName];\n // if (!cookie) {\n // // res.redirect(`/${strategy}/login`);\n // res.send(\n // 'No cookie for this state. Retry ?',\n // );\n // return;\n // }\n // res.clearCookie(cookieName);\n\n const result = await githubAuth.oauth2.authorizationCode.getToken({\n code,\n redirect_uri: createRedirectUri(req),\n });\n\n if (!result) {\n res.send(\n renderToStaticMarkup(\n \n
\n Could not get access token. Retry ?\n
\n
,\n ),\n );\n return;\n }\n\n const accessToken = result.access_token;\n const api = createApi(accessToken);\n const user = await api.users.getAuthenticated({});\n const id = user.data.id;\n const login = user.data.login;\n\n const authInfo: AuthInfo = { id, login, accessToken, time: Date.now() };\n const token = await signPromisified(authInfo, AUTH_SECRET_KEY, {\n algorithm: 'HS512',\n audience: req.headers['user-agent'],\n expiresIn: '10 days',\n });\n\n res.cookie(`auth_${strategy}`, token, {\n httpOnly: true,\n secure,\n });\n\n res.redirect('/app');\n });\n}\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function home(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{process.env.REVIEWFLOW_NAME}

\n
\n
\n

Choose your account

\n \n
\n
\n
\n
,\n ),\n );\n });\n}\n","import type { 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 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 'merge/skip-ci': {\n name: 'automerge/skip-ci',\n color: '#e1e8ed',\n },\n 'merge/update-branch': {\n name: ':arrows_counterclockwise: update branch',\n color: '#64DD17',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n\n /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n color: '#ef7934',\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 type { Config } from './types';\n\nconst config: Config = {\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 groups: {},\n waitForGroups: {},\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 /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n color: '#ef7934',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n },\n },\n};\n\nexport default config;\n","import type { Config } from './types';\n\nconst config: Config<'dev' | 'design', 'ops' | 'frontends' | 'backends'> = {\n autoAssignToCreator: true,\n trimTitle: true,\n ignoreRepoPattern: '(infra-.*|devenv)',\n requiresReviewRequest: true,\n autoMergeRenovateWithSkipCi: 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 bot: false,\n regExp: /\\s([A-Z][\\dA-Z]+-(\\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 botUsers: ['michael-robot'],\n\n groups: {\n dev: {\n /* ops */\n JulienBreux: `julien.breux${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n TheR3aLp3nGuinJM: `jean-michel${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n\n /* back */\n abarreir: `alexandre${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 machartier: `marie-anne${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n\n /* front */\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n vlbr: `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'budet-b': `benjamin.budet${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n mdcarter: `maxime.dehaye${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n ChibiBlasphem: `christopher${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n PSniezak: `paul.sniezak${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 Lenamari: `lena${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n loicleser: null,\n },\n },\n\n teams: {\n ops: {\n logins: ['JulienBreux', 'Alan-pad', 'CamilSadiki', 'busser'],\n labels: ['teams/ops'],\n },\n\n backends: {\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n 'Radyum',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'vlbr',\n 'budet-b',\n 'mdcarter',\n 'ChibiBlasphem',\n 'PSniezak',\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 'teams/ops': {\n name: 'ops',\n color: '#003b55',\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 'merge/skip-ci': {\n name: 'automerge/skip-ci',\n color: '#e1e8ed',\n },\n 'merge/update-branch': {\n name: ':arrows_counterclockwise: update branch',\n color: '#e1e8ed',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n\n /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n description: 'This issue or pull request will need a new major version',\n color: '#FF6F00',\n },\n duplicate: {\n name: 'duplicate',\n description: 'This issue or pull request already exists',\n color: '#ECEFF1',\n },\n documentation: {\n name: 'documentation',\n description: 'Improvements or additions to documentation',\n color: '#7FCEFF',\n },\n rfc: {\n name: 'RFC',\n description: 'Request For Comments',\n color: '#FFD3B2',\n },\n bug: {\n name: 'bug',\n description: \"Something isn't working\",\n color: '#FF3D00',\n },\n enhancement: {\n name: 'enhancement',\n description: 'New feature or request',\n color: '#7FCEFF',\n },\n 'help-wanted': {\n name: 'help wanted',\n description: 'Extra attention is needed',\n color: '#B1EE8B',\n },\n question: {\n name: 'question',\n description: 'Further information is requested',\n color: '#F860A4',\n },\n wontfix: {\n name: 'wontfix',\n description: 'This will not be worked on',\n color: '#ECEFF1',\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 chrisconfig from './christophehurpeau';\nimport type { Config } from './types';\n\nconst config: Config<'dev', never> = {\n ...chrisconfig,\n requiresReviewRequest: true,\n groups: {\n dev: {\n christophehurpeau: 'christophe@hurpeau.com',\n 'chris-reviewflow': 'christophe.hurpeau+reviewflow@gmail.com',\n },\n },\n};\nexport default config;\n","import christophehurpeau from './christophehurpeau';\nimport defaultConfig from './defaultConfig';\nimport ornikar from './ornikar';\nimport reviewflow from './reviewflow';\nimport type { Config as ConfigType } from './types';\n\nexport type Config<\n GroupNames extends string = any,\n TeamNames extends string = any\n> = ConfigType;\n\nexport const accountConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n reviewflow,\n};\n\nexport { defaultConfig };\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","import type { MessageCategory } from './MessageCategory';\n\nexport const defaultDmSettings: Record = {\n 'pr-review': true,\n 'pr-review-follow': true,\n 'pr-comment': true,\n 'pr-comment-bots': true,\n 'pr-comment-follow': true,\n 'pr-comment-follow-bots': false,\n 'pr-comment-mention': true,\n 'pr-comment-thread': true,\n 'pr-merge-conflicts': true,\n 'issue-comment-mention': true,\n};\n","import { accountConfigs, defaultConfig } from '../accountConfigs';\nimport type { MongoStores } from '../mongo';\nimport type { MessageCategory } from './MessageCategory';\nimport { defaultDmSettings } from './defaultDmSettings';\n\nexport type UserDmSettings = Record;\nconst cache = new Map>();\n\nconst getDefaultDmSettings = (org: string): UserDmSettings => {\n const accountConfig = accountConfigs[org] || defaultConfig;\n return accountConfig.defaultDmSettings\n ? { ...defaultDmSettings, ...accountConfig.defaultDmSettings }\n : defaultDmSettings;\n};\n\nexport const updateCache = (\n org: string,\n userId: number,\n newSettings: Partial,\n): void => {\n let orgCache = cache.get(org);\n if (!orgCache) {\n orgCache = new Map();\n cache.set(org, orgCache);\n }\n orgCache.set(userId, { ...getDefaultDmSettings(org), ...newSettings });\n};\n\nexport const getUserDmSettings = async (\n mongoStores: MongoStores,\n org: string,\n orgId: number,\n userId: number,\n): Promise => {\n const orgDefaultDmSettings = getDefaultDmSettings(org);\n\n const userDmSettingsConfig = await mongoStores.userDmSettings.findOne({\n orgId,\n userId,\n });\n\n const config = userDmSettingsConfig\n ? {\n ...orgDefaultDmSettings,\n ...userDmSettingsConfig.settings,\n }\n : orgDefaultDmSettings;\n\n updateCache(org, userId, config);\n return config;\n};\n","import type { Octokit } from '@octokit/core';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { MongoStores, Org } from '../../../mongo';\n\ninterface OrgInfo {\n login: string;\n id: number;\n}\n\nexport const syncOrg = async (\n mongoStores: MongoStores,\n github: Octokit,\n installationId: number,\n org: OrgInfo,\n): Promise => {\n const orgInStore = await mongoStores.orgs.upsertOne({\n _id: org.id as any, // TODO _id is number\n login: org.login,\n installationId,\n });\n\n const orgEmbed = { id: org.id, login: org.login };\n\n const memberIds: number[] = [];\n\n await Promise.all(\n await github.paginate(\n github.orgs.listMembers.endpoint.merge({\n org: org.login,\n }),\n ({\n data,\n }: RestEndpointMethodTypes['orgs']['listMembers']['response']) => {\n return Promise.all(\n data.map(async (member) => {\n memberIds.push(member.id);\n return Promise.all([\n mongoStores.orgMembers.upsertOne({\n _id: `${org.id}_${member.id}`,\n org: orgEmbed,\n user: {\n id: member.id,\n login: member.login,\n },\n }),\n mongoStores.users.upsertOne({\n _id: member.id as any,\n login: member.login,\n type: member.type,\n }),\n ]);\n }),\n );\n },\n ),\n );\n\n await mongoStores.orgMembers.deleteMany({\n 'org.id': org.id,\n 'user.id': { $not: { $in: memberIds } },\n });\n\n return orgInStore;\n};\n","import type { Octokit } from '@octokit/core';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { MongoStores } from '../../../mongo';\n\nexport const syncTeams = async (\n mongoStores: MongoStores,\n github: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const orgEmbed = { id: org.id, login: org.login };\n\n const teamIds: number[] = [];\n\n await Promise.all(\n await github.paginate(\n github.teams.list.endpoint.merge({\n org: org.login,\n }),\n ({ data }: RestEndpointMethodTypes['teams']['list']['response']) => {\n return Promise.all(\n data.map((team) => {\n teamIds.push(team.id);\n return mongoStores.orgTeams.upsertOne({\n _id: team.id,\n org: orgEmbed,\n name: team.name,\n slug: team.slug,\n description: team.description,\n });\n }),\n );\n },\n ),\n );\n\n await mongoStores.orgTeams.deleteMany({\n 'org.id': org.id,\n _id: { $not: { $in: teamIds } },\n });\n};\n","import bodyParser from 'body-parser';\nimport type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { accountConfigs } from '../accountConfigs';\nimport type { MessageCategory } from '../dm/MessageCategory';\nimport { getUserDmSettings, updateCache } from '../dm/getUserDmSettings';\nimport { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeams } from '../events/account-handlers/actions/syncTeams';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nconst dmMessages: Record = {\n 'pr-review': 'You are assigned to a review, someone reviewed your PR',\n 'pr-review-follow': \"Someone reviewed a PR you're also reviewing\",\n 'pr-comment': 'Someone commented on your PR',\n 'pr-comment-bots': 'A bot commented on your PR',\n 'pr-comment-follow': \"Someone commented on a PR you're reviewing\",\n 'pr-comment-follow-bots': \"A bot commented on a PR you're reviewing\",\n 'pr-comment-mention': 'Someone mentioned you in a PR',\n 'pr-comment-thread': \"Someone replied to a discussion you're in\",\n 'pr-merge-conflicts': 'Your PR has a merge conflict (not implemented)',\n 'issue-comment-mention':\n 'Someone mentioned you in an issue (not implemented)',\n};\n\nexport default function orgSettings(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/org/:org/force-sync', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n const o = await mongoStores.orgs.findByKey(org.id);\n if (!o) return res.redirect('/app');\n\n await syncOrg(mongoStores, user.api, o.installationId as number, org);\n await syncTeams(mongoStores, user.api, org);\n\n res.redirect(`/app/org/${req.params.org}`);\n });\n\n router.get('/org/:org', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n const installation = await octokitApp.apps\n .getOrgInstallation({ org: org.login })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!installation) {\n return res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed for this user. Go to \"}\n \n Github Configuration\n {' '}\n to install it.\n
\n
,\n ),\n );\n }\n\n const accountConfig = accountConfigs[org.login];\n const userDmSettings = await getUserDmSettings(\n mongoStores,\n org.login,\n org.id,\n user.authInfo.id,\n );\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{process.env.REVIEWFLOW_NAME}

\n
\n

{org.login}

\n Switch account\n
\n\n
\n
\n

Information

\n {!accountConfig\n ? 'Default config is used: https://github.com/christophehurpeau/reviewflow/blob/master/src/accountConfigs/defaultConfig.ts'\n : `Custom config: https://github.com/christophehurpeau/reviewflow/blob/master/src/accountConfigs/${org.login}.ts`}\n
\n
\n

My DM Settings

\n {Object.entries(dmMessages).map(([key, name]) => (\n
\n \n
\n ))}\n
\n
\n
\n
,\n ),\n );\n });\n\n router.patch('/org/:org', bodyParser.json(), async (req, res) => {\n if (!req.body) {\n res.status(400).send('not ok');\n return;\n }\n\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n (await mongoStores.userDmSettings.collection).updateOne(\n {\n _id: `${org.id}_${user.authInfo.id}`,\n },\n {\n $set: {\n [`settings.${req.body.key}`]: req.body.value,\n updated: new Date(),\n },\n $setOnInsert: {\n orgId: org.id,\n userId: user.authInfo.id,\n created: new Date(),\n },\n },\n { upsert: true },\n );\n\n const userDmSettingsConfig = await mongoStores.userDmSettings.findOne({\n orgId: org.id,\n userId: user.authInfo.id,\n });\n\n if (userDmSettingsConfig) {\n updateCache(org.login, user.authInfo.id, userDmSettingsConfig.settings);\n }\n\n res.send('ok');\n });\n}\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function repository(\n router: Router,\n octokitApp: InstanceType,\n): void {\n router.get('/repositories', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n const { data } = await user.api.repos.listForAuthenticatedUser({\n per_page: 100,\n });\n\n res.send(\n renderToStaticMarkup(\n \n
\n

Your repositories

\n \n\n {data.length === 100 && (\n
We currently have a limit to 100 repositories
\n )}\n
\n
,\n ),\n );\n });\n\n router.get('/repository/:owner/:repository', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n const { data } = await user.api.repos.get({\n owner: req.params.owner,\n repo: req.params.repository,\n });\n\n if (!data) {\n res.status(404).send(\n renderToStaticMarkup(\n \n
repo not found
\n
,\n ),\n );\n return;\n }\n\n if (!data.permissions || !data.permissions.admin) {\n res.status(401).send(\n renderToStaticMarkup(\n \n
\n not authorized to see this repo, you need to have admin permission\n
\n
,\n ),\n );\n return;\n }\n\n const { data: data2 } = await octokitApp.apps\n .getRepoInstallation({\n owner: req.params.owner,\n repo: req.params.repository,\n })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!data2) {\n res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed on this repo. Go to \"}\n \n Github Configuration\n {' '}\n to add it.\n
\n
,\n ),\n );\n return;\n }\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{req.params.repository}

\n
\n
,\n ),\n );\n });\n}\n","import type { Octokit } from '@octokit/core';\nimport type { MongoStores, User } from '../../../mongo';\n\ninterface UserInfo {\n login: string;\n id: number;\n}\n\nexport const syncUser = async (\n mongoStores: MongoStores,\n github: Octokit,\n installationId: number,\n userInfo: UserInfo,\n): Promise => {\n const user = await mongoStores.users.upsertOne({\n _id: userInfo.id,\n login: userInfo.login,\n type: 'User',\n installationId,\n });\n\n return user;\n};\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function userSettings(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/user/force-sync', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n // const { data: installation } = await api.apps\n // .getUserInstallation({\n // username: user.authInfo.login,\n // })\n // .catch((err) => {\n // return { status: err.status, data: undefined };\n // });\n\n // console.log(installation);\n\n const u = await mongoStores.users.findByKey(user.authInfo.id);\n if (!u || !u.installationId) return res.redirect('/app');\n\n await syncUser(\n mongoStores,\n user.api,\n u.installationId as number,\n user.authInfo,\n );\n\n res.redirect('/app/user');\n });\n\n router.get('/user', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const { data: installation } = await octokitApp.apps\n .getUserInstallation({\n username: user.authInfo.login,\n })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!installation) {\n return res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed for this user. Go to \"}\n \n Github Configuration\n {' '}\n to install it.\n
\n
,\n ),\n );\n }\n\n return res.send(\n renderToStaticMarkup(\n \n
{process.env.REVIEWFLOW_NAME} is installed for this user
\n
,\n ),\n );\n });\n}\n","import cookieParser from 'cookie-parser';\nimport type { Probot, run } from 'probot';\nimport auth from './app/auth';\nimport home from './app/home';\nimport orgSettings from './app/org-settings';\nimport repository from './app/repository';\nimport userSettings from './app/user-settings';\nimport type { AppContext } from './context/AppContext';\n\nexport default async function appRouter(\n app: Probot,\n getRouter: Parameters<\n // eslint-disable-next-line @typescript-eslint/ban-types\n Extract[0], Function>\n >[0]['getRouter'],\n { mongoStores }: AppContext,\n): Promise {\n const router = getRouter('/app');\n const octokitApp = await app.auth();\n\n router.use(cookieParser());\n\n auth(router);\n repository(router, octokitApp);\n home(router, octokitApp, mongoStores);\n orgSettings(router, octokitApp, mongoStores);\n userSettings(router, octokitApp, mongoStores);\n}\n","export const ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const ExcludesNullish = (((res: any) => res !== null) as any) as (\n x: T | null,\n) => x is T;\n","import type { Octokit } from '@octokit/core';\nimport { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeams } from '../events/account-handlers/actions/syncTeams';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { Org, User } from '../mongo';\nimport type { AppContext } from './AppContext';\n\nexport interface AccountInfo {\n id: number;\n login: string;\n type: string;\n}\n\nexport const getOrCreateAccount = async (\n { mongoStores }: AppContext,\n github: Octokit,\n installationId: number,\n accountInfo: AccountInfo,\n): Promise => {\n switch (accountInfo.type) {\n case 'Organization': {\n let org = await mongoStores.orgs.findByKey(accountInfo.id);\n if (org?.installationId) return org;\n\n // TODO diff org vs user...\n org = await syncOrg(mongoStores, github, installationId, accountInfo);\n await syncTeams(mongoStores, github, accountInfo);\n return org;\n }\n\n case 'User': {\n let user = await mongoStores.users.findByKey(accountInfo.id);\n if (user?.installationId) return user;\n\n user = await syncUser(mongoStores, github, installationId, accountInfo);\n return user;\n }\n\n default:\n throw new Error(`Account type not supported ${accountInfo.type}`);\n }\n};\n","import createEmojiRegex from 'emoji-regex';\n\nexport const getKeys = >(\n o: T,\n): (keyof T)[] => Object.keys(o) as (keyof T)[];\n\nconst emojiRegex = createEmojiRegex();\n\nexport const getEmojiFromRepoDescription = (\n description: string | null,\n): string => {\n if (!description) return '';\n if (description.startsWith(':')) {\n const [, emoji] = /^(:\\w+:)/.exec(description) || [];\n return emoji || '';\n }\n const match = emojiRegex.exec(description);\n if (match && description.startsWith(match[0])) return match[0];\n return '';\n};\n","import type { TeamSlack } from './TeamSlack';\n\nexport const voidTeamSlack = (): TeamSlack => ({\n mention: (): string => '',\n postMessage: (): Promise => Promise.resolve(null),\n updateMessage: (): Promise => Promise.resolve(null),\n deleteMessage: (): Promise => Promise.resolve(undefined),\n addReaction: (): Promise => Promise.resolve(undefined),\n updateHome: (): void => undefined,\n});\n","import { WebClient } from '@slack/web-api';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport type { MessageCategory } from '../dm/MessageCategory';\nimport { getUserDmSettings } from '../dm/getUserDmSettings';\nimport type { Org, User } from '../mongo';\nimport type { AppContext } from './AppContext';\nimport type { SlackMessage } from './SlackMessage';\nimport type { TeamSlack, PostSlackMessageResult } from './TeamSlack';\nimport { getKeys } from './utils';\nimport { voidTeamSlack } from './voidTeamSlack';\n\nexport type { TeamSlack };\n\nexport const initTeamSlack = async (\n { mongoStores, slackHome }: AppContext,\n context: Context,\n config: Config,\n account: Org | User,\n): Promise => {\n const owner = context.payload.repository.owner;\n const slackToken = 'slackToken' in account && account.slackToken;\n\n if (!slackToken) {\n return voidTeamSlack();\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 slackEmails = Object.values(githubLoginToSlackEmail);\n const slackClient = new WebClient(slackToken);\n\n const membersInDb = await mongoStores.orgMembers.findAll({\n 'org.id': account._id,\n });\n\n const members: [string, { member: any; im: any }][] = [];\n const foundEmailMembers: string[] = [];\n\n Object.entries(githubLoginToSlackEmail).forEach(([login, email]) => {\n const member = membersInDb.find((m) => m.user.login === login);\n if (member?.slack?.id) {\n foundEmailMembers.push(email);\n members.push([email, { member: { id: member.slack.id }, im: undefined }]);\n }\n });\n\n if (foundEmailMembers.length !== slackEmails.length) {\n const missingEmails = slackEmails.filter(\n (email) => !foundEmailMembers.includes(email),\n );\n\n const memberEmailToMemberId = new Map(\n Object.entries(githubLoginToSlackEmail).map(([login, email]) => [\n email,\n membersInDb.find((m) => m.user.login === login)?._id as any,\n ]),\n );\n\n await slackClient.paginate('users.list', {}, (page: any) => {\n page.members.forEach((member: any) => {\n const email = member.profile?.email;\n if (email && missingEmails.includes(email)) {\n members.push([email, { member, im: undefined }]);\n if (memberEmailToMemberId.has(email)) {\n mongoStores.orgMembers.partialUpdateMany(\n {\n _id: memberEmailToMemberId.get(email),\n },\n { $set: { slack: { id: member.id } } },\n );\n }\n }\n });\n return false;\n });\n }\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.conversations.open({\n users: user.member.id,\n });\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): string => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (\n category: MessageCategory,\n githubId: number,\n githubLogin: string,\n message: SlackMessage,\n ): Promise => {\n context.log.debug(\n {\n category,\n githubLogin,\n message,\n },\n 'slack: post message',\n );\n if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null;\n\n const userDmSettings = await getUserDmSettings(\n mongoStores,\n owner.login,\n owner.id,\n githubId,\n );\n\n if (!userDmSettings[category]) return null;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return null;\n const result = await slackClient.chat.postMessage({\n username: process.env.REVIEWFLOW_NAME,\n channel: user.im.id,\n text: message.text,\n blocks: message.blocks,\n attachments: message.secondaryBlocks\n ? [{ blocks: message.secondaryBlocks }]\n : undefined,\n thread_ts: message.ts,\n });\n if (!result.ok) return null;\n return { ts: result.ts as string, channel: result.channel as string };\n },\n updateMessage: async (\n ts: string,\n channel: string,\n message: SlackMessage,\n ): Promise => {\n context.log.debug({ ts, channel, message }, 'slack: update message');\n if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null;\n\n const result = await slackClient.chat.update({\n ts,\n channel,\n text: message.text,\n blocks: message.blocks,\n attachments: message.secondaryBlocks\n ? [{ blocks: message.secondaryBlocks }]\n : undefined,\n });\n if (!result.ok) return null;\n return { ts: result.ts as string, channel: result.channel as string };\n },\n deleteMessage: async (ts: string, channel: string): Promise => {\n context.log.debug({ ts, channel }, 'slack: delete message');\n await slackClient.chat.delete({\n ts,\n channel,\n });\n },\n addReaction: async (\n ts: string,\n channel: string,\n name: string,\n ): Promise => {\n context.log.debug({ ts, channel, name }, 'slack: add reaction');\n await slackClient.reactions.add({\n timestamp: ts,\n channel,\n name,\n });\n },\n\n updateHome: (githubLogin: string): void => {\n context.log.debug({ githubLogin }, 'update slack home');\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.member) return;\n\n slackHome.scheduleUpdateMember(context.octokit, slackClient, {\n user: { id: null, login: githubLogin },\n org: { id: account._id, login: account.login },\n slack: { id: user.member.id },\n } as any);\n },\n };\n};\n","import { Lock } from 'lock';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport type { Org, User, AccountEmbed, AccountType } from '../mongo';\nimport { ExcludesFalsy } from '../utils/Excludes';\nimport type { AppContext } from './AppContext';\nimport type { AccountInfo } from './getOrCreateAccount';\nimport { getOrCreateAccount } from './getOrCreateAccount';\nimport type { TeamSlack } from './initTeamSlack';\nimport { initTeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface AccountContext<\n GroupNames extends string = any,\n TeamNames extends string = any\n> {\n config: Config;\n accountType: AccountType;\n account: Org | User;\n accountEmbed: AccountEmbed;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => GroupNames | undefined;\n getReviewerGroups: (githubLogins: string[]) => GroupNames[];\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\n approveShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n\n lock: (callback: () => Promise | void) => Promise;\n}\n\nconst initAccountContext = async (\n appContext: AppContext,\n context: Context,\n config: Config,\n accountInfo: AccountInfo,\n): Promise => {\n const account = await getOrCreateAccount(\n appContext,\n context.octokit,\n context.payload.installation.id,\n accountInfo,\n );\n const slackPromise = initTeamSlack(appContext, context, config, account);\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((teamName) => {\n (config.teams as NonNullable)[teamName].logins.forEach(\n (login) => {\n const teams = githubLoginToTeams.get(login);\n if (teams) {\n teams.push(teamName);\n } else {\n githubLoginToTeams.set(login, [teamName]);\n }\n },\n );\n });\n\n const getReviewerGroups = (githubLogins: string[]): string[] => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ];\n\n const lock = Lock();\n\n return {\n config,\n account,\n accountEmbed: {\n id: accountInfo.id,\n login: accountInfo.login,\n type: accountInfo.type as AccountType,\n },\n accountType: accountInfo.type as AccountType,\n lock: (callback: () => Promise | void): Promise => {\n return new Promise((resolve, reject) => {\n const logInfos = { account: accountInfo.login };\n context.log.info(logInfos, 'lock: try to lock account');\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n lock('_', async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n context.log.info(logInfos, 'lock: lock account acquired');\n try {\n await callback();\n } catch (err) {\n context.log.info(logInfos, 'lock: release account (with error)');\n release();\n reject(err);\n return;\n }\n context.log.info(logInfos, 'lock: release account');\n release();\n resolve();\n });\n });\n },\n getReviewerGroup: (githubLogin): string | undefined =>\n githubLoginToGroup.get(githubLogin),\n getReviewerGroups,\n\n getTeamsForLogin: (githubLogin): string[] =>\n githubLoginToTeams.get(githubLogin) || [],\n\n approveShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ): boolean => {\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 accountContextsPromise = new Map();\nconst accountContexts = new Map();\n\nexport const obtainAccountContext = (\n appContext: AppContext,\n context: Context,\n config: Config,\n accountInfo: AccountInfo,\n): Promise => {\n const existingAccountContext = accountContexts.get(accountInfo.login);\n if (existingAccountContext) return existingAccountContext;\n\n const existingPromise = accountContextsPromise.get(accountInfo.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initAccountContext(appContext, context, config, accountInfo);\n accountContextsPromise.set(accountInfo.login, promise);\n\n return promise.then((accountContext) => {\n accountContextsPromise.delete(accountInfo.login);\n accountContexts.set(accountInfo.login, accountContext);\n return accountContext;\n });\n};\n","import type { Context } from 'probot';\nimport { accountConfigs, defaultConfig } from '../../../accountConfigs';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { AccountContext } from '../../../context/accountContext';\nimport { obtainAccountContext } from '../../../context/accountContext';\n\ntype CallbackContextAndAccountContext = (\n context: Context,\n accountContext: AccountContext,\n) => void | Promise;\n\nexport const handlerOrgChange = async <\n T extends { organization?: { id: number; login: string } }\n>(\n appContext: AppContext,\n context: Context,\n callback: CallbackContextAndAccountContext,\n): Promise => {\n const org = context.payload.organization;\n if (!org) return;\n const config = accountConfigs[org.login] || defaultConfig;\n const accountContext = await obtainAccountContext(\n appContext,\n context,\n config,\n { ...org, type: 'Organization' },\n );\n if (!accountContext) return;\n\n return accountContext.lock(async () => {\n await callback(context, accountContext);\n });\n};\n\nexport const createHandlerOrgChange = <\n T extends { organization?: { id: number; login: string } }\n>(\n appContext: AppContext,\n callback: CallbackContextAndAccountContext,\n) => (context: Context) => {\n return handlerOrgChange(appContext, context, callback);\n};\n","export type OptionsKeys =\n | 'featureBranch'\n | 'autoMergeWithSkipCi'\n | 'autoMerge'\n | 'deleteAfterMerge';\n\nexport type Options = Record;\n\nexport const options: OptionsKeys[] = [\n 'featureBranch',\n 'autoMergeWithSkipCi',\n 'autoMerge',\n 'deleteAfterMerge',\n];\nexport const optionsRegexps: {\n key: OptionsKeys;\n regexp: RegExp;\n}[] = options.map((option) => ({\n key: option,\n regexp: new RegExp(`\\\\[([ xX]?)]\\\\s*`),\n}));\n\nexport const optionsLabels: { key: OptionsKeys; label: string }[] = [\n { key: 'featureBranch', label: 'This PR is a feature branch' },\n {\n key: 'autoMergeWithSkipCi',\n label: 'Add `[skip ci]` on merge commit',\n },\n {\n key: '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 key: 'deleteAfterMerge',\n label: 'Automatic branch delete after this PR is merged',\n },\n];\n","import { optionsRegexps } from './prOptions';\nimport type { Options } from './prOptions';\n\nexport type { Options } from './prOptions';\n\nexport const parseOptions = (\n content: string,\n defaultOptions: Options,\n): Options => {\n return optionsRegexps.reduce((acc, { key, regexp }) => {\n const match = regexp.exec(content);\n acc[key] = !match\n ? defaultOptions[key] || false\n : match[1] === 'x' || match[1] === 'X';\n return acc;\n }, {}) as Options;\n};\n\nexport const parseCommitNotes = (content: string): string => {\n const commitNotes = content.replace(\n /^.*#### Commits Notes:(.*)#### Options:.*$/s,\n '$1',\n );\n\n if (commitNotes === content) {\n return '';\n } else {\n return commitNotes.trim();\n }\n};\n\ninterface ParsedBody {\n options: Options;\n commitNotes: string;\n}\n\nexport const parseBody = (\n content: string,\n defaultOptions: Options,\n): ParsedBody => {\n return {\n options: parseOptions(content, defaultOptions),\n commitNotes: parseCommitNotes(content),\n };\n};\n","import type { PullRequestLabels } from 'events/pr-handlers/utils/PullRequestData';\nimport type { LabelResponse } from '../../../../context/initRepoLabels';\n\nexport default function hasLabelInPR(\n prLabels: PullRequestLabels,\n label: LabelResponse,\n): boolean {\n if (!label) return false;\n return prLabels.some((l): boolean => l.id === label.id);\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { AutomergeLog } from 'mongo';\nimport type {\n PullRequestData,\n PullRequestFromRestEndpoint,\n PullRequestLabels,\n} from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { parseBody } from './utils/body/parseBody';\nimport hasLabelInPR from './utils/hasLabelInPR';\n\nconst hasFailedStatusOrChecks = async (\n pr: PullRequestData,\n context: Context,\n): Promise => {\n const checks = await context.octokit.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(\n {\n checks: failedChecks.map((check) => check.name),\n },\n `automerge not possible: failed check pr ${pr.id}`,\n );\n return true;\n }\n\n const combinedStatus = await context.octokit.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(\n {\n statuses: failedStatuses.map((status) => status.context),\n },\n `automerge not possible: failed status pr ${pr.id}`,\n );\n\n return true;\n }\n\n return false;\n};\n\nexport const autoMergeIfPossible = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n prLabels: PullRequestLabels = pullRequest.labels,\n): Promise => {\n if (reviewflowPrContext === null) return false;\n\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n\n if (!hasLabelInPR(prLabels, autoMergeLabel)) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'no automerge label',\n );\n return false;\n }\n\n const isRenovatePr = pullRequest.head.ref.startsWith('renovate/');\n\n const createMergeLockPrFromPr = () => ({\n id: pullRequest.id,\n number: pullRequest.number,\n branch: pullRequest.head.ref,\n });\n\n if (pullRequest.state !== 'open') {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr is not opened',\n );\n }\n\n const addLog = (\n type: AutomergeLog['type'],\n action: AutomergeLog['action'],\n ): void => {\n const repoFullName = pullRequest.head.repo.full_name;\n context.log.info(`automerge: ${repoFullName}#${pullRequest.id} ${type}`);\n repoContext.appContext.mongoStores.automergeLogs.insertOne({\n account: repoContext.accountEmbed,\n repoFullName,\n pr: {\n id: pullRequest.id,\n number: pullRequest.number,\n isRenovate: isRenovatePr,\n mergeableState: pullRequest.mergeable_state,\n },\n type,\n action,\n });\n };\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'blocking labels',\n );\n return false;\n }\n\n if (pullRequest.requested_reviewers.length > 0) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested reviewers',\n );\n return false;\n }\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (lockedPr && String(lockedPr.number) !== String(pullRequest.number)) {\n context.log.info(\n {\n prId: pullRequest.id,\n prNumber: pullRequest.number,\n },\n 'automerge not possible: locked pr',\n );\n repoContext.pushAutomergeQueue(createMergeLockPrFromPr());\n return false;\n }\n\n repoContext.addMergeLockPr(createMergeLockPrFromPr());\n\n if (pullRequest.mergeable == null) {\n const prResult = await context.octokit.pulls.get(\n context.repo({\n pull_number: pullRequest.number,\n }),\n );\n pullRequest = prResult.data;\n }\n\n if (pullRequest.merged) {\n addLog('already merged', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr already merged',\n );\n return false;\n }\n\n context.log.info(\n `automerge?: ${pullRequest.id}, #${pullRequest.number}, mergeable=${pullRequest.mergeable} state=${pullRequest.mergeable_state}`,\n );\n\n // https://github.com/octokit/octokit.net/issues/1763\n if (\n !(\n pullRequest.mergeable_state === 'clean' ||\n pullRequest.mergeable_state === 'has_hooks' ||\n pullRequest.mergeable_state === 'unstable'\n )\n ) {\n if (\n !pullRequest.mergeable_state ||\n pullRequest.mergeable_state === 'unknown'\n ) {\n addLog('unknown mergeable_state', 'reschedule');\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n\n if (isRenovatePr) {\n if (\n pullRequest.mergeable_state === 'behind' ||\n pullRequest.mergeable_state === 'dirty'\n ) {\n addLog('rebase-renovate', 'wait');\n\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n if (pullRequest.body.includes('')) {\n if (pullRequest.body.includes('[x] ')) {\n return false;\n }\n\n const renovateRebaseBody = pullRequest.body.replace(\n '[ ] ',\n '[x] ',\n );\n await context.octokit.issues.update(\n context.repo({\n issue_number: pullRequest.number,\n body: renovateRebaseBody,\n }),\n );\n } else if (!pullRequest.title.startsWith('rebase!')) {\n await context.octokit.issues.update(\n context.repo({\n issue_number: pullRequest.number,\n title: `rebase!${pullRequest.title}`,\n }),\n );\n }\n return false;\n }\n\n if (await hasFailedStatusOrChecks(pullRequest, context)) {\n addLog('failed status or checks', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'failed status or checks',\n );\n return false;\n } else if (pullRequest.mergeable_state === 'blocked') {\n addLog('blocked mergeable_state', 'wait');\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=${pullRequest.mergeable_state}`,\n );\n return false;\n }\n\n if (pullRequest.mergeable_state === 'blocked') {\n if (await hasFailedStatusOrChecks(pullRequest, context)) {\n addLog('failed status or checks', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'failed status or checks',\n );\n return false;\n } else {\n addLog('blocked mergeable_state', 'wait');\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n }\n\n if (pullRequest.mergeable_state === 'behind') {\n addLog('behind mergeable_state', 'update branch');\n context.log.info(\n {\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n },\n 'automerge not possible: update branch',\n );\n\n await context.octokit.repos.merge({\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n head: pullRequest.base.ref,\n base: pullRequest.head.ref,\n });\n\n return false;\n }\n\n addLog('not mergeable', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n `mergeable_state=${pullRequest.mergeable_state}`,\n );\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${pullRequest.mergeable_state}`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pullRequest.number}`);\n\n const parsedBody = parseBody(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n );\n const options = parsedBody?.options || repoContext.config.prDefaultOptions;\n\n const mergeResult = await context.octokit.pulls.merge({\n merge_method: options.featureBranch ? 'merge' : 'squash',\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n pull_number: pullRequest.number,\n commit_title: options.featureBranch\n ? undefined\n : `${pullRequest.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pullRequest.number})`,\n commit_message: options.featureBranch ? undefined : '', // TODO add BC\n });\n context.log.debug(mergeResult.data, 'merge result:');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'merged',\n );\n return Boolean('merged' in mergeResult.data && mergeResult.data.merged);\n } catch (err) {\n context.log.info({ errorMessage: err.message }, 'could not merge:');\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n};\n","import type { StatusInfo } from 'accountConfigs/types';\nimport type { Options } from './parseBody';\nimport { parseOptions } from './parseBody';\nimport { optionsLabels } from './prOptions';\n\nexport const defaultCommentBody = 'This will be auto filled by reviewflow.';\n\nconst toMarkdownOptions = (options: Options) => {\n return optionsLabels\n .map(\n ({ key, label }) =>\n `- [${options[key] ? 'x' : ' '}] ${label}`,\n )\n .join('\\n');\n};\n\nconst toMarkdownInfos = (infos: StatusInfo[]): string => {\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 commentBody: string;\n options?: Options;\n}\n\nconst getReplacement = (infos?: StatusInfo[]): string => {\n if (!infos) return '$1$2';\n return infos.length > 0\n ? `#### Infos:\\n\\n${toMarkdownInfos(infos)}\\n\\n$2`\n : '$2';\n};\n\nconst updateOptions = (\n options: Options,\n optionsToUpdate?: Partial,\n): Options => {\n if (!optionsToUpdate) return options;\n return { ...options, ...optionsToUpdate };\n};\n\nconst internalUpdateBodyOptionsAndInfos = (\n body: string,\n options: Options,\n infos?: StatusInfo[],\n): string => {\n const infosAndCommitNotesParagraph = body.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*)?(#### Commits Notes:.*)?#### Options:)?.*$/s,\n getReplacement(infos),\n );\n\n return `${infosAndCommitNotesParagraph}#### Options:\\n${toMarkdownOptions(\n options,\n )}`;\n};\n\nexport const createCommentBody = (\n defaultOptions: Options,\n infos?: StatusInfo[],\n): string => {\n return internalUpdateBodyOptionsAndInfos('', defaultOptions, infos);\n};\n\nexport const updateCommentOptions = (\n commentBody: string,\n defaultOptions: Options,\n optionsToUpdate?: Partial,\n): UpdatedBodyWithOptions => {\n const options = parseOptions(commentBody, defaultOptions);\n const updatedOptions = updateOptions(options, optionsToUpdate);\n\n return {\n options: updatedOptions,\n commentBody: internalUpdateBodyOptionsAndInfos(commentBody, updatedOptions),\n };\n};\n\nexport const updateCommentBodyInfos = (\n commentBody: string,\n infos?: StatusInfo[],\n): string => {\n return commentBody.replace(\n // * - zero or more\n // *? - zero or more (non-greedy)\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*?)?(#### Commits Notes:.*?)?(#### Options:.*?)?)?$/s,\n `${getReplacement(infos)}$3`,\n );\n};\n\nexport const updateCommentBodyCommitsNotes = (\n commentBody: string,\n commitNotes?: string,\n): string => {\n return commentBody.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /(?:#### Commits Notes:.*?)?(#### Options:)/s,\n // eslint-disable-next-line no-nested-ternary\n !commitNotes ? '$1' : `#### Commits Notes:\\n\\n${commitNotes}\\n\\n$1`,\n );\n};\n\nexport const removeDeprecatedReviewflowInPrBody = (prBody: string): string => {\n return prBody.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(.*)(.*)(.*)$/is,\n // eslint-disable-next-line no-nested-ternary\n '$1$3',\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\n\nexport const createReviewflowComment = (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n body: string,\n): Promise<\n RestEndpointMethodTypes['issues']['createComment']['response']['data']\n> => {\n return context.octokit.issues\n .createComment(context.repo({ issue_number: pullRequestNumber, body }))\n .then(({ data }) => data);\n};\n\nexport const getReviewflowCommentById = (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n commentId: number,\n): Promise<\n RestEndpointMethodTypes['issues']['getComment']['response']['data'] | null\n> => {\n return context.octokit.issues\n .getComment(\n context.repo({\n issue_number: pullRequestNumber,\n comment_id: commentId,\n }),\n )\n .then(\n ({ data }) => data,\n () => null,\n );\n};\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { ReviewflowPr } from 'mongo';\nimport { defaultCommentBody } from '../actions/utils/body/updateBody';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\nimport {\n createReviewflowComment,\n getReviewflowCommentById,\n} from './reviewflowComment';\n\nexport interface CreatePrContextOptions {\n reviewflowCommentPromise?: ReturnType;\n}\n\nexport interface ReviewflowPrContext {\n reviewflowPr: ReviewflowPr;\n commentBody: string;\n}\n\nexport const getReviewflowPrContext = async (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n repoContext: RepoContext,\n reviewflowCommentPromise?: ReturnType,\n): Promise => {\n const appContext = repoContext.appContext;\n const prEmbed = { number: pullRequestNumber };\n\n if (reviewflowCommentPromise) {\n const comment = await reviewflowCommentPromise;\n const reviewflowPr = await appContext.mongoStores.prs.insertOne({\n account: repoContext.accountEmbed,\n repo: repoContext.repoEmbed,\n pr: prEmbed,\n commentId: comment.id,\n });\n return { reviewflowPr, commentBody: comment.body };\n }\n\n const existing = await appContext.mongoStores.prs.findOne({\n 'account.id': repoContext.accountEmbed.id,\n 'repo.id': repoContext.repoEmbed.id,\n 'pr.number': pullRequestNumber,\n });\n const comment =\n existing &&\n (await getReviewflowCommentById(\n pullRequestNumber,\n context,\n existing.commentId,\n ));\n\n if (!comment || !existing) {\n const comment = await createReviewflowComment(\n pullRequestNumber,\n context,\n defaultCommentBody,\n );\n\n if (!existing) {\n const reviewflowPr = await appContext.mongoStores.prs.insertOne({\n account: repoContext.accountEmbed,\n repo: repoContext.repoEmbed,\n pr: prEmbed,\n commentId: comment.id,\n });\n return { reviewflowPr, commentBody: comment.body };\n } else {\n await appContext.mongoStores.prs.partialUpdateByKey(existing._id, {\n $set: { commentId: comment.id },\n });\n }\n }\n\n return { reviewflowPr: existing, commentBody: comment!.body };\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\n\nexport const fetchPr = async (\n context: Context,\n prNumber: number,\n): Promise => {\n const prResult = await context.octokit.pulls.get(\n context.repo({ pull_number: prNumber }),\n );\n\n return prResult.data;\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\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 LabelsRecord {\n [key: string]: LabelResponse;\n}\n\nexport const getLabelsForRepo = async (\n context: Context,\n): Promise<\n RestEndpointMethodTypes['issues']['listLabelsForRepo']['response']['data']\n> => {\n const { data: labels } = await context.octokit.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n return labels;\n};\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const labels = await getLabelsForRepo(context);\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 = labelConfig.description\n ? `${labelConfig.description} - Synced by reviewflow`\n : `Synced by reviewflow 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 if (labelKey === 'teams/ops') {\n existingLabel = labels.find((label) => label.name === 'archi');\n }\n }\n\n if (!existingLabel) {\n const result = await context.octokit.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 existingLabel.description !== description\n ) {\n context.log.info(\n {\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 'Needs to update label',\n );\n\n const result = await context.octokit.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","import { Lock } from 'lock';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport { accountConfigs, defaultConfig } from '../accountConfigs';\nimport type { GroupLabels } from '../accountConfigs/types';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../events/pr-handlers/actions/autoMergeIfPossible';\nimport type {\n PullRequestData,\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../events/pr-handlers/utils/PullRequestData';\nimport { getReviewflowPrContext } from '../events/pr-handlers/utils/createPullRequestContext';\nimport { fetchPr } from '../events/pr-handlers/utils/fetchPr';\nimport { ExcludesFalsy } from '../utils/Excludes';\nimport type { AppContext } from './AppContext';\nimport type { AccountContext } from './accountContext';\nimport { obtainAccountContext } from './accountContext';\nimport type { LabelResponse, LabelsRecord } from './initRepoLabels';\nimport { initRepoLabels } from './initRepoLabels';\nimport { getEmojiFromRepoDescription } from './utils';\n\nexport interface LockedMergePr {\n id: number;\n number: number;\n branch: string;\n}\n\ninterface RepoContextWithoutTeamContext {\n appContext: AppContext;\n repoFullName: string;\n repoEmbed: { id: number; name: string };\n repoEmoji: string | undefined;\n labels: LabelsRecord;\n protectedLabelIds: readonly LabelResponse['id'][];\n shouldIgnore: boolean;\n\n hasNeedsReview: (labels: PullRequestLabels) => boolean;\n hasRequestedReview: (labels: PullRequestLabels) => boolean;\n hasChangesRequestedReview: (labels: PullRequestLabels) => boolean;\n hasApprovesReview: (labels: PullRequestLabels) => boolean;\n getNeedsReviewGroupNames: (labels: PullRequestLabels) => GroupNames[];\n\n lockPullRequest: (\n pullRequest: PullRequestData,\n callback: () => Promise | void,\n ) => Promise;\n\n /** @deprecated */\n lockPR: (\n prId: string,\n prNumber: number,\n callback: () => Promise | void,\n ) => Promise;\n\n getMergeLockedPr: () => LockedMergePr;\n addMergeLockPr: (pr: LockedMergePr) => void;\n removePrFromAutomergeQueue: (\n context: Context,\n prNumber: number,\n reason: string,\n ) => void;\n reschedule: (context: Context, pr: LockedMergePr) => void;\n pushAutomergeQueue: (pr: LockedMergePr) => void;\n}\n\nexport type RepoContext = AccountContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nexport const shouldIgnoreRepo = (\n repoName: string,\n accountConfig: Config,\n): boolean => {\n const ignoreRepoRegexp =\n accountConfig.ignoreRepoPattern &&\n new RegExp(`^${accountConfig.ignoreRepoPattern}$`);\n\n if (repoName === 'reviewflow-test') {\n return process.env.REVIEWFLOW_NAME !== 'reviewflow-dev';\n }\n\n if (ignoreRepoRegexp) {\n return ignoreRepoRegexp.test(repoName);\n }\n\n return false;\n};\n\nconst createGetReviewLabelIds = (\n shouldIgnore: boolean,\n config: Config,\n reviewGroupNames: GroupNames[],\n labels: LabelsRecord,\n): ((labelKey: GroupLabels) => number[]) => {\n if (shouldIgnore) return (labelKey: GroupLabels): number[] => [];\n return (labelKey: GroupLabels): number[] =>\n reviewGroupNames\n .map((key) => config.labels.review[key][labelKey])\n .filter(Boolean)\n .map((name) => labels[name].id);\n};\n\nasync function initRepoContext(\n appContext: AppContext,\n context: Context,\n config: Config,\n): Promise> {\n const {\n id,\n name,\n full_name: fullName,\n owner: org,\n description,\n } = context.payload.repository;\n const repoEmoji = getEmojiFromRepoDescription(description);\n\n const accountContext = await obtainAccountContext(\n appContext,\n context,\n config,\n org,\n );\n const repoContext = Object.create(accountContext);\n\n const shouldIgnore = shouldIgnoreRepo(name, config);\n\n const labels = shouldIgnore ? {} : await initRepoLabels(context, config);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const getReviewLabelIds = createGetReviewLabelIds(\n shouldIgnore,\n config,\n reviewGroupNames,\n labels,\n );\n\n const needsReviewLabelIds = getReviewLabelIds('needsReview');\n const requestedReviewLabelIds = getReviewLabelIds('requested');\n const changesRequestedLabelIds = getReviewLabelIds('changesRequested');\n const approvedReviewLabelIds = getReviewLabelIds('approved');\n\n const protectedLabelIds = [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ];\n\n const labelIdToGroupName = new Map();\n if (!shouldIgnore) {\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\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: PullRequestLabels): 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 lockPR = (\n prOrPrIssueId: string,\n prNumber: number,\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n const logInfos = {\n repo: fullName,\n prOrPrIssueId,\n prNumber,\n };\n context.log.debug(logInfos, 'lock: try to lock pr');\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n lock(String(prNumber), async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n context.log.info(logInfos, 'lock: lock pr acquired');\n try {\n await callback();\n } catch (err) {\n context.log.info(logInfos, 'lock: release pr (with error)');\n release();\n reject(err);\n return;\n }\n context.log.info(logInfos, 'lock: release pr');\n release();\n resolve();\n });\n });\n\n const lockPullRequest = (\n pullRequest: PullRequestWithDecentData,\n callback: () => Promise | void,\n ): Promise => {\n return lockPR(String(pullRequest.id), pullRequest.number, callback);\n };\n\n const reschedule = (context: Context, pr: LockedMergePr): void => {\n if (!pr) throw new Error('Cannot reschedule undefined');\n context.log.info(pr, 'reschedule');\n setTimeout(() => {\n lockPR('reschedule', -1, () => {\n return lockPR(String(pr.id), pr.number, async () => {\n const [pullRequest, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pr.number),\n getReviewflowPrContext(pr.number, context, repoContext),\n ]);\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n });\n });\n }, 10_000);\n };\n\n return Object.assign(repoContext, {\n appContext,\n labels,\n repoFullName: fullName,\n repoEmbed: { id, name },\n repoEmoji,\n protectedLabelIds,\n shouldIgnore,\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', {\n repo: fullName,\n pr,\n });\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: (\n context,\n prNumber: number | string,\n reason: string,\n ): void => {\n if (lockMergePr && String(lockMergePr.number) === String(prNumber)) {\n lockMergePr = automergeQueue.shift();\n context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`);\n if (lockMergePr) {\n context.log(lockMergePr, `merge lock: next ${fullName}`);\n } else {\n context.log(`merge lock: nothing next ${fullName}`);\n }\n if (lockMergePr) {\n reschedule(context, lockMergePr);\n }\n } else {\n const previousLength = automergeQueue.length;\n automergeQueue = automergeQueue.filter(\n (value) => String(value.number) !== String(prNumber),\n );\n if (automergeQueue.length !== previousLength) {\n context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`);\n }\n }\n },\n pushAutomergeQueue: (pr: LockedMergePr): void => {\n context.log(\n {\n repo: fullName,\n pr,\n lockMergePr,\n automergeQueue,\n },\n 'merge lock: push queue',\n );\n if (!automergeQueue.some((p) => p.number === pr.number)) {\n automergeQueue.push(pr);\n }\n },\n reschedule,\n\n lockPR,\n lockPullRequest,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n appContext: AppContext,\n context: Context,\n): Promise | RepoContext | null => {\n const repo = context.payload.repository;\n const owner = repo.owner;\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 let accountConfig = accountConfigs[owner.login];\n\n if (!accountConfig) {\n console.warn(`using default config for ${owner.login}`);\n accountConfig = defaultConfig as Config;\n }\n\n const promise = initRepoContext(appContext, context, accountConfig);\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 type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { OnCallback } from 'probot/lib/application';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { RepoContext } from '../../../context/repoContext';\nimport { obtainRepoContext } from '../../../context/repoContext';\n\nexport const createRepoHandler = <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n appContext: AppContext,\n callback: (\n context: Context,\n repoContext: RepoContext,\n ) => Promise | void,\n): OnCallback => {\n return async (context): Promise => {\n const repoContext = await obtainRepoContext(appContext, context);\n if (!repoContext) return;\n\n return callback(context, repoContext);\n };\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { OnCallback } from 'probot/lib/application';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { RepoContext, LockedMergePr } from '../../../context/repoContext';\nimport { createRepoHandler } from '../../repository-handlers/utils/createRepoHandler';\nimport type {\n PullRequestData,\n PullRequestFromWebhook,\n} from './PullRequestData';\nimport type {\n CreatePrContextOptions,\n ReviewflowPrContext,\n} from './createPullRequestContext';\nimport { getReviewflowPrContext } from './createPullRequestContext';\n\nexport type CallbackWithPRAndRepoContext = (\n pullRequest: T,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createPullRequestHandler = <\n T extends\n | EventPayloads.WebhookPayloadPullRequest\n | EventPayloads.WebhookPayloadPullRequestReview\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n | EventPayloads.WebhookPayloadPullRequestReviewComment,\n U extends PullRequestFromWebhook\n>(\n appContext: AppContext,\n getPullRequestInPayload: (\n payload: Context['payload'],\n context: Context,\n repoContext: RepoContext,\n ) => U | null,\n callbackPr: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext | null,\n ) => void | Promise,\n callbackBeforeLock?: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n ) => CreatePrContextOptions,\n): OnCallback => {\n return createRepoHandler(appContext, async (context, repoContext) => {\n const pullRequest: U | null = getPullRequestInPayload(\n context.payload,\n context,\n repoContext,\n );\n if (pullRequest === null) return;\n const options = callbackBeforeLock\n ? callbackBeforeLock(pullRequest, context, repoContext)\n : {};\n\n await repoContext.lockPullRequest(pullRequest, async () => {\n /*\n * When repo are ignored, only slack notifications are sent.\n * PR is not linted, commented, nor auto merged.\n */\n const reviewflowPrContext = repoContext.shouldIgnore\n ? null\n : await getReviewflowPrContext(\n pullRequest.number,\n context,\n repoContext,\n options.reviewflowCommentPromise,\n );\n\n return callbackPr(pullRequest, context, repoContext, reviewflowPrContext);\n });\n });\n};\n\nexport const createPullRequestsHandler = <\n T extends { repository: EventPayloads.PayloadRepository },\n U extends PullRequestFromWebhook | LockedMergePr\n>(\n appContext: AppContext,\n getPrs: (payload: Context['payload'], repoContext: RepoContext) => U[],\n callbackPr: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n ) => void | Promise,\n): OnCallback => {\n return createRepoHandler(appContext, async (context, repoContext) => {\n const prs = getPrs(context.payload, repoContext);\n if (prs.length === 0) return;\n\n await Promise.all(\n prs.map((pr) =>\n repoContext.lockPR(String(pr.id), pr.number, async () => {\n return callbackPr(pr, context, repoContext);\n }),\n ),\n );\n });\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { getReviewflowPrContext } from './utils/createPullRequestContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function checkrunCompleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'check_run.completed',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext) => {\n if (repoContext.shouldIgnore) return [];\n return payload.check_run.pull_requests;\n },\n async (pullRequest, context, repoContext) => {\n const [updatedPr, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pullRequest.number),\n getReviewflowPrContext(pullRequest.number, context, repoContext),\n ]);\n\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { getReviewflowPrContext } from './utils/createPullRequestContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function checksuiteCompleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'check_suite.completed',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext) => {\n if (repoContext.shouldIgnore) return [];\n return payload.check_suite.pull_requests;\n },\n async (pullRequest, context, repoContext) => {\n const [updatedPr, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pullRequest.number),\n getReviewflowPrContext(pullRequest.number, context, repoContext),\n ]);\n\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\n\nexport default async function createStatus<\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n context: Context,\n name: string,\n sha: string,\n type: 'failure' | 'success',\n description: string,\n url?: string,\n): Promise {\n await context.octokit.repos.createCommitStatus(\n context.repo({\n context:\n name === ''\n ? process.env.REVIEWFLOW_NAME\n : `${process.env.REVIEWFLOW_NAME}/${name}`,\n sha,\n state: type,\n description,\n target_url: url,\n }),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport createStatus from './utils/createStatus';\n\nconst addStatusCheck = async function <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n { state, description }: { state: 'failure' | 'success'; description: string },\n previousSha?: string,\n): Promise {\n const hasPrCheck = (\n await context.octokit.checks.listForRef(\n context.repo({\n ref: pullRequest.head.sha,\n }),\n )\n ).data.check_runs.find((check) => check.name === process.env.REVIEWFLOW_NAME);\n\n context.log.debug({ hasPrCheck, state, description }, 'add status check');\n\n if (hasPrCheck) {\n await context.octokit.checks.create(\n context.repo({\n name: process.env.REVIEWFLOW_NAME as string,\n head_sha: pullRequest.head.sha,\n started_at: pullRequest.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 if (previousSha && state === 'failure') {\n await Promise.all([\n createStatus(\n context,\n '',\n previousSha,\n 'success',\n 'New commits have been pushed',\n ),\n createStatus(context, '', pullRequest.head.sha, state, description),\n ]);\n } else {\n await createStatus(context, '', pullRequest.head.sha, state, description);\n }\n};\n\nexport const updateStatusCheckFromLabels = <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n labels: PullRequestLabels = pullRequest.labels || [],\n previousSha?: string,\n): Promise => {\n context.log.debug(\n {\n labels: labels.map((l) => l?.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n },\n 'updateStatusCheckFromLabels',\n );\n\n const createFailedStatusCheck = (description: string): Promise =>\n addStatusCheck(\n pullRequest,\n context,\n {\n state: 'failure',\n description,\n },\n previousSha,\n );\n\n if (pullRequest.requested_reviewers.length > 0) {\n return createFailedStatusCheck(\n // TODO remove `as`\n // https://github.com/probot/probot/issues/1219\n `Awaiting review from: ${pullRequest.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\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 `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 '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(\n pullRequest,\n context,\n {\n state: 'success',\n description: '✓ PR ready to merge !',\n },\n previousSha,\n );\n // }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { GroupLabels } from '../../../accountConfigs/types';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends { repository: EventPayloads.PayloadRepository },\n GroupNames extends string = any\n>(\n pullRequest: PullRequestWithDecentData,\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.debug(\n {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n },\n 'updateReviewStatus',\n );\n\n let prLabels: PullRequestLabels = pullRequest.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(prLabels.map((label) => label.name));\n\n const toAdd = new Set();\n const toAddNames = new Set();\n const toDelete = new Set();\n const toDeleteNames = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (\n key: GroupLabels,\n ): undefined | PullRequestLabels[number] => {\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 toAddNames.add(label.name);\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 toDeleteNames.add(existing.name);\n }\n });\n }\n\n // TODO move that elsewhere\n\n repoContext.getTeamsForLogin(pullRequest.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 toAddNames.add(label.name);\n }\n });\n }\n });\n\n // if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return;\n\n if (toAdd.size !== 0 || toDelete.size !== 0) {\n if (toDelete.size === 0 || toDelete.size < 4) {\n context.log.debug(\n {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n toAddNames: [...toAddNames],\n toDeleteNames: [...toDeleteNames],\n },\n 'updateReviewStatus',\n );\n\n if (toAdd.size !== 0) {\n const result = await context.octokit.issues.addLabels(\n context.issue({\n labels: [...toAddNames],\n }),\n );\n prLabels = result.data;\n }\n\n if (toDelete.size !== 0) {\n for (const toDeleteName of [...toDeleteNames]) {\n try {\n const result = await context.octokit.issues.removeLabel(\n context.issue({\n name: toDeleteName,\n }),\n );\n prLabels = result.data;\n } catch (err) {\n context.log.warn(\n {\n err: err?.message,\n },\n 'error removing label',\n );\n }\n }\n }\n } else {\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.debug(\n {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l) => l.name),\n newLabelNames: newLabelNamesArray,\n },\n 'updateReviewStatus',\n );\n\n const result = await context.octokit.issues.setLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(\n pullRequest,\n context,\n repoContext,\n prLabels,\n );\n // }\n\n return prLabels;\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseOptions } from './actions/utils/body/parseBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function closed(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.closed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n if (!repoContext.shouldIgnore && reviewflowPrContext) {\n const repo = context.payload.repository;\n\n if (pullRequest.merged) {\n const isNotFork = pullRequest.head.repo.id === repo.id;\n const options = parseOptions(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n );\n\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr closed',\n ),\n isNotFork && options.deleteAfterMerge\n ? context.octokit.git\n .deleteRef(\n context.repo({ ref: `heads/${pullRequest.head.ref}` }),\n )\n .catch(() => {})\n : undefined,\n ]);\n } else {\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr closed',\n ),\n updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n },\n ),\n );\n}\n","import type { RepoContext } from '../context/repoContext';\n\nexport const createLink = (url: string, text: string): string => {\n return `<${url}|${text}>`;\n};\n\nexport const createPrLink = (\n pr: { html_url: string; number: number },\n repoContext: RepoContext,\n): string => {\n return createLink(\n pr.html_url,\n `${repoContext.repoEmoji ? `${repoContext.repoEmoji} ` : ''}${\n repoContext.repoFullName\n }#${pr.number}`,\n );\n};\n","import type { KnownBlock } from '@slack/web-api';\nimport type { SlackMessage } from '../../../context/SlackMessage';\n\nexport const createMrkdwnSectionBlock = (text: string): KnownBlock => ({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text,\n },\n});\n\nexport const createSlackMessageWithSecondaryBlock = (\n message: string,\n secondaryBlockText?: string | null,\n): SlackMessage => {\n return {\n text: message,\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: message,\n },\n },\n ],\n secondaryBlocks: !secondaryBlockText\n ? undefined\n : [createMrkdwnSectionBlock(secondaryBlockText)],\n };\n};\n","import type { EventPayloads } from '@octokit/webhooks';\n\ntype WebhookPr =\n | EventPayloads.WebhookPayloadPullRequest['pull_request']\n | EventPayloads.WebhookPayloadPullRequestReviewPullRequest;\n\ntype PullRequestHandlerAllowedPayloads =\n | {\n repository: EventPayloads.PayloadRepository;\n pull_request: WebhookPr;\n }\n | {\n repository: EventPayloads.PayloadRepository;\n issue: EventPayloads.WebhookPayloadIssueCommentIssue;\n };\n\nexport type PullRequestFromPayload<\n T extends PullRequestHandlerAllowedPayloads\n> = T extends { pull_request: WebhookPr }\n ? T['pull_request']\n : T extends { issue: EventPayloads.WebhookPayloadIssueCommentIssue }\n ? T['issue'] /* & T['issue']['pull_request'] */\n : never;\n\n/** deprecated */\nexport const getPullRequestFromPayload = <\n T extends PullRequestHandlerAllowedPayloads\n>(\n payload: T,\n): PullRequestFromPayload => {\n const pullRequest: WebhookPr = (payload as any).pull_request;\n if (pullRequest) {\n return pullRequest as PullRequestFromPayload;\n }\n\n const issue = (payload as any).issue;\n if (issue?.pull_request) {\n return {\n ...issue,\n ...issue.pull_request,\n };\n }\n\n throw new Error('No pull_request in payload');\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { RepoContext } from '../../../context/repoContext';\nimport { getKeys } from '../../../context/utils';\n\ntype ReviewState = 'CHANGES_REQUESTED' | 'APPROVED' | 'DISMISSED';\n\ninterface ReviewStates {\n approved: number;\n changesRequested: number;\n dismissed: number;\n}\ninterface Reviewer {\n id: number;\n login: string;\n}\n\nexport const getReviewersAndReviewStates = async (\n context: Context,\n repoContext: RepoContext,\n): Promise<{\n reviewers: Reviewer[];\n reviewStates: Record;\n}> => {\n const userIds = new Set();\n const reviewers: Reviewer[] = [];\n const reviewStatesByUser = new Map();\n\n await context.octokit.paginate(\n context.octokit.pulls.listReviews,\n context.pullRequest(),\n ({\n data: reviews,\n }: RestEndpointMethodTypes['pulls']['listReviews']['response']) => {\n reviews.forEach((review) => {\n if (!userIds.has(review.user.id)) {\n userIds.add(review.user.id);\n reviewers.push({ id: review.user.id, login: review.user.login });\n }\n const state = review.state.toUpperCase();\n if (state !== 'COMMENTED') {\n reviewStatesByUser.set(review.user.id, state as ReviewState);\n }\n });\n\n return [];\n },\n );\n\n const reviewStates: Record = {} as Record<\n GroupNames,\n ReviewStates\n >;\n\n getKeys(repoContext.config.groups).forEach((groupName) => {\n reviewStates[groupName] = {\n approved: 0,\n changesRequested: 0,\n dismissed: 0,\n };\n });\n\n reviewers.forEach((reviewer) => {\n const group = repoContext.getReviewerGroup(reviewer.login);\n if (group) {\n const state = reviewStatesByUser.get(reviewer.id);\n switch (state) {\n case 'APPROVED':\n reviewStates[group].approved++;\n break;\n case 'CHANGES_REQUESTED':\n reviewStates[group].changesRequested++;\n break;\n case 'DISMISSED':\n reviewStates[group].dismissed++;\n break;\n }\n }\n });\n\n return { reviewers, reviewStates };\n};\n","import type { RepoContext } from '../../../context/repoContext';\n\nexport const checkIfUserIsBot = (\n repoContext: RepoContext,\n user: { login: string; type: string },\n): boolean => {\n if (user.type === 'Bot') return true;\n if (repoContext.config.botUsers) {\n return repoContext.config.botUsers.includes(user.login);\n }\n return false;\n};\n\nexport const checkIfIsThisBot = (user: {\n login: string;\n type: string;\n}): boolean => {\n return (\n user.type === 'Bot' && user.login === `${process.env.REVIEWFLOW_NAME}[bot]`\n );\n};\n","import issueParser from 'issue-parser';\n\nconst parse = issueParser('github', { actions: {}, issuePrefixes: [] });\n\nexport const parseMentions = (body: string): readonly string[] => {\n return parse(body).mentions.map((m) => m.user);\n};\n","import slackifyMarkdown from 'slackify-markdown';\n\nexport const slackifyCommentBody = (\n body: string,\n multipleLines: boolean,\n): string => {\n return slackifyMarkdown(\n body\n .replace('```suggestion', '_Suggested change:_\\n```suggestion')\n .replace(\n '```suggestion\\r\\n```',\n `_Suggestion to remove line${multipleLines ? 's' : ''}._\\n`,\n ),\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport type { SlackMessage } from '../../context/SlackMessage';\nimport type { PostSlackMessageResult } from '../../context/TeamSlack';\nimport type { AccountEmbed } from '../../mongo';\nimport * as slackUtils from '../../slack/utils';\nimport { ExcludesNullish } from '../../utils/Excludes';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createSlackMessageWithSecondaryBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport type { PullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getPullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { checkIfUserIsBot, checkIfIsThisBot } from './utils/isBotUser';\nimport { parseMentions } from './utils/parseMentions';\nimport { slackifyCommentBody } from './utils/slackifyCommentBody';\n\nconst getDiscussion = async (\n context: Context,\n comment: any,\n): Promise<\n RestEndpointMethodTypes['pulls']['listComments']['response']['data']\n> => {\n if (!comment.in_reply_to_id) return [comment];\n return context.octokit.paginate(\n context.octokit.pulls.listComments.endpoint.merge(context.pullRequest()),\n ({\n data,\n }: RestEndpointMethodTypes['pulls']['listComments']['response']) => {\n return data.filter(\n (c) =>\n c.in_reply_to_id === comment.in_reply_to_id ||\n c.id === comment.in_reply_to_id,\n );\n },\n );\n};\n\nconst getMentions = (\n discussion: RestEndpointMethodTypes['pulls']['listComments']['response']['data'],\n): string[] => {\n const mentions = new Set();\n\n discussion.forEach((c) => {\n parseMentions(c.body).forEach((m) => mentions.add(m));\n });\n\n return [...mentions];\n};\n\nconst getUsersInThread = (\n discussion: RestEndpointMethodTypes['pulls']['listComments']['response']['data'],\n): { id: number; login: string }[] => {\n const userIds = new Set();\n const users: { id: number; login: string }[] = [];\n\n discussion.forEach((c) => {\n if (userIds.has(c.user.id)) return;\n userIds.add(c.user.id);\n users.push({ id: c.user.id, login: c.user.login });\n });\n\n return users;\n};\n\nexport default function prCommentCreated(\n app: Probot,\n appContext: AppContext,\n): void {\n const saveInDb = async (\n type: 'review-comment' | 'issue-comment',\n commentId: number,\n accountEmbed: AccountEmbed,\n results: PostSlackMessageResult[],\n message: SlackMessage,\n ): Promise => {\n const filtered = results.filter(ExcludesNullish);\n if (filtered.length === 0) return;\n\n await appContext.mongoStores.slackSentMessages.insertOne({\n type,\n typeId: commentId,\n message,\n account: accountEmbed,\n sentTo: filtered,\n });\n };\n\n app.on(\n [\n 'pull_request_review_comment.created',\n // comments without review and without path are sent with issue_comment.created.\n // createHandlerPullRequestChange checks if pull_request event is present, removing real issues comments.\n 'issue_comment.created',\n ],\n createPullRequestHandler<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment,\n | PullRequestFromPayload<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n >\n | any\n >(\n appContext,\n (payload, context) => {\n if (checkIfIsThisBot(payload.comment.user)) {\n // ignore comments from this bot\n return null;\n }\n return getPullRequestFromPayload(payload);\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const pr = await fetchPr(context, pullRequest.number);\n const { comment } = context.payload;\n const type = (comment as any).pull_request_review_id\n ? 'review-comment'\n : 'issue-comment';\n\n const body = comment.body;\n if (!body) return;\n\n const commentByOwner = pr.user.login === comment.user.login;\n const [discussion, { reviewers }] = await Promise.all([\n getDiscussion(context, comment),\n getReviewersAndReviewStates(context, repoContext),\n ]);\n\n const followers = reviewers.filter(\n (u) => u.id !== pr.user.id && u.id !== comment.user.id,\n );\n\n if (pr.requested_reviewers) {\n followers.push(\n ...pr.requested_reviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== comment.user.id &&\n rr.id !== pr.user.id\n );\n }),\n );\n }\n\n const usersInThread = getUsersInThread(discussion).filter(\n (u) =>\n u.id !== pr.user.id &&\n u.id !== comment.user.id &&\n !followers.find((f) => f.id === u.id),\n );\n const mentions = getMentions(discussion).filter(\n (m) =>\n m !== pr.user.login &&\n m !== comment.user.login &&\n !followers.find((f) => f.login === m) &&\n !usersInThread.find((u) => u.login === m),\n );\n\n const mention = repoContext.slack.mention(comment.user.login);\n const prUrl = slackUtils.createPrLink(pr, repoContext);\n const ownerMention = repoContext.slack.mention(pr.user.login);\n const commentLink = slackUtils.createLink(\n comment.html_url,\n (comment as any).in_reply_to_id ? 'replied' : 'commented',\n );\n\n const createMessage = (toOwner?: boolean): string => {\n const ownerPart = toOwner\n ? 'your PR'\n : `${\n pr.user.id === comment.user.id ? 'his' : `${ownerMention}'s`\n } PR`;\n return `:speech_balloon: ${mention} ${commentLink} on ${ownerPart} ${prUrl}`;\n };\n\n const promisesOwner = [];\n const promisesNotOwner = [];\n const slackifiedBody = slackifyCommentBody(\n comment.body,\n (comment as any).start_line !== null,\n );\n const isBotUser = checkIfUserIsBot(repoContext, comment.user);\n\n if (!commentByOwner) {\n const slackMessage = createSlackMessageWithSecondaryBlock(\n createMessage(true),\n slackifiedBody,\n );\n\n promisesOwner.push(\n repoContext.slack\n .postMessage(\n isBotUser ? 'pr-comment-bots' : 'pr-comment',\n pr.user.id,\n pr.user.login,\n slackMessage,\n )\n .then((res) =>\n saveInDb(\n type,\n comment.id,\n repoContext.accountEmbed,\n [res],\n slackMessage,\n ),\n ),\n );\n }\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n promisesNotOwner.push(\n ...followers.map((follower) =>\n repoContext.slack.postMessage(\n isBotUser ? 'pr-comment-follow-bots' : 'pr-comment-follow',\n follower.id,\n follower.login,\n message,\n ),\n ),\n );\n\n promisesNotOwner.push(\n ...usersInThread.map((user) =>\n repoContext.slack.postMessage(\n 'pr-comment-thread',\n user.id,\n user.login,\n message,\n ),\n ),\n );\n\n if (mentions.length > 0) {\n await appContext.mongoStores.users\n .findAll({ login: { $in: mentions } })\n .then((users) => {\n promisesNotOwner.push(\n ...users.map((u) =>\n repoContext.slack.postMessage(\n 'pr-comment-mention',\n u._id,\n u.login,\n message,\n ),\n ),\n );\n });\n }\n\n await Promise.all([\n Promise.all(promisesOwner),\n Promise.all(promisesNotOwner).then((results) =>\n saveInDb(\n type,\n comment.id,\n repoContext.accountEmbed,\n results,\n message,\n ),\n ),\n ]);\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport type { Options } from './utils/body/prOptions';\nimport { updateCommentOptions } from './utils/body/updateBody';\n\nconst updatePrCommentBody = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n reviewflowPrContext: ReviewflowPrContext,\n newBody: string,\n): Promise => {\n await context.octokit.issues.updateComment(\n context.repo({\n comment_id: reviewflowPrContext.reviewflowPr.commentId,\n body: newBody,\n }),\n );\n reviewflowPrContext.commentBody = newBody;\n};\n\nexport const updatePrCommentBodyIfNeeded = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n reviewflowPrContext: ReviewflowPrContext,\n newBody: string,\n): Promise => {\n if (reviewflowPrContext.commentBody !== newBody) {\n await updatePrCommentBody(context, reviewflowPrContext, newBody);\n }\n};\n\nexport const updatePrCommentBodyOptions = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n updateOptions: Partial,\n): Promise => {\n const { commentBody: newBody } = updateCommentOptions(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n updateOptions,\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newBody);\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from 'events/pr-handlers/utils/PullRequestData';\nimport type { LabelResponse } from '../../../../context/initRepoLabels';\nimport hasLabelInPR from './hasLabelInPR';\n\ninterface SyncLabelOptions {\n onRemove?: () => void | Promise;\n onAdd?: (prLabels: LabelResponse[]) => void | Promise;\n}\n\nexport default async function syncLabel<\n T extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n shouldHaveLabel: boolean,\n label: LabelResponse,\n prHasLabel = hasLabelInPR(pullRequest.labels, label),\n { onRemove, onAdd }: SyncLabelOptions = {},\n): Promise {\n if (prHasLabel && !shouldHaveLabel) {\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n if (onRemove) await onRemove();\n }\n if (shouldHaveLabel && !prHasLabel) {\n const response = await context.octokit.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n if (onAdd) await onAdd(response.data);\n }\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type {\n PullRequestFromRestEndpoint,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport type { Options } from './utils/body/prOptions';\nimport { updateCommentOptions } from './utils/body/updateBody';\nimport hasLabelInPR from './utils/hasLabelInPR';\nimport syncLabel from './utils/syncLabel';\n\nexport const calcDefaultOptions = (\n repoContext: RepoContext,\n pullRequest: PullRequestWithDecentData,\n): Options => {\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasFeatureBranchLabel = hasLabelInPR(\n pullRequest.labels,\n featureBranchLabel,\n );\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n return {\n ...repoContext.config.prDefaultOptions,\n featureBranch: prHasFeatureBranchLabel,\n autoMergeWithSkipCi: prHasSkipCiLabel,\n autoMerge: prHasAutoMergeLabel,\n };\n};\n\nexport const syncLabelsAfterCommentBodyEdited = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n): Promise => {\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasFeatureBranchLabel = hasLabelInPR(\n pullRequest.labels,\n featureBranchLabel,\n );\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n const { commentBody, options } = updateCommentOptions(\n reviewflowPrContext.commentBody,\n calcDefaultOptions(repoContext, pullRequest),\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, commentBody);\n\n if (options && (featureBranchLabel || automergeLabel)) {\n await Promise.all([\n featureBranchLabel &&\n syncLabel(\n pullRequest,\n context,\n options.featureBranch,\n featureBranchLabel,\n prHasFeatureBranchLabel,\n ),\n skipCiLabel &&\n syncLabel(\n pullRequest,\n context,\n options.autoMergeWithSkipCi,\n skipCiLabel,\n prHasSkipCiLabel,\n ),\n automergeLabel &&\n syncLabel(\n pullRequest,\n context,\n options.autoMerge,\n automergeLabel,\n prHasAutoMergeLabel,\n {\n onAdd: async (prLabels) => {\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n prLabels,\n );\n },\n onRemove: () => {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'label removed',\n );\n },\n },\n ),\n ]);\n }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { syncLabelsAfterCommentBodyEdited } from './actions/syncLabelsAfterCommentBodyEdited';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createMrkdwnSectionBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport type { PullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getPullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { checkIfIsThisBot } from './utils/isBotUser';\nimport { slackifyCommentBody } from './utils/slackifyCommentBody';\n\nexport default function prCommentEditedOrDeleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n [\n 'pull_request_review_comment.edited',\n 'pull_request_review_comment.deleted',\n // comments without review and without path are sent with issue_comment.created.\n // createHandlerPullRequestChange checks if pull_request event is present, removing real issues comments.\n 'issue_comment.edited',\n 'issue_comment.deleted',\n ],\n createPullRequestHandler<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment,\n | PullRequestFromPayload<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n >\n | any\n >(\n appContext,\n (payload) => {\n if (checkIfIsThisBot(payload.sender)) {\n // ignore edits made from this bot\n return null;\n }\n return getPullRequestFromPayload(payload);\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const { comment } = context.payload;\n\n if (\n reviewflowPrContext !== null &&\n context.payload.action === 'edited' &&\n checkIfIsThisBot(comment.user)\n ) {\n const updatedPr = await fetchPr(context, pullRequest.number);\n if (!updatedPr.closed_at) {\n await syncLabelsAfterCommentBodyEdited(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n }\n return;\n }\n\n const type = (comment as any).pull_request_review_id\n ? 'review-comment'\n : 'issue-comment';\n\n const criteria = {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type,\n typeId: comment.id,\n };\n\n const sentMessages = await appContext.mongoStores.slackSentMessages.findAll(\n criteria,\n );\n\n if (sentMessages.length === 0) return;\n\n if (context.payload.action === 'deleted') {\n await Promise.all([\n Promise.all(\n sentMessages.map((sentMessage) =>\n Promise.all(\n sentMessage.sentTo.map((sentTo) =>\n repoContext.slack.deleteMessage(sentTo.ts, sentTo.channel),\n ),\n ),\n ),\n ),\n appContext.mongoStores.slackSentMessages.deleteMany(criteria),\n ]);\n } else {\n const secondaryBlocks = [\n createMrkdwnSectionBlock(\n slackifyCommentBody(\n comment.body,\n (comment as any).start_line !== null,\n ),\n ),\n ];\n\n await Promise.all([\n Promise.all(\n sentMessages.map((sentMessage) =>\n Promise.all(\n sentMessage.sentTo.map((sentTo) =>\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...sentMessage.message,\n secondaryBlocks,\n }),\n ),\n ),\n ),\n ),\n appContext.mongoStores.slackSentMessages.partialUpdateMany(\n criteria,\n { $set: { 'message.secondaryBlocks': secondaryBlocks } },\n ),\n ]);\n }\n },\n ),\n );\n}\n","import type { CommitNote } from '@commitlint/parse';\nimport parse from '@commitlint/parse';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport { updateCommentBodyCommitsNotes } from './utils/body/updateBody';\nimport syncLabel from './utils/syncLabel';\n\ninterface BreakingChangesCommits {\n commit: RestEndpointMethodTypes['pulls']['listCommits']['response']['data'][number];\n breakingChangesNotes: CommitNote[];\n}\n\nexport const readCommitsAndUpdateInfos = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n commentBody = reviewflowPrContext.commentBody,\n): Promise => {\n // tmp.data[0].sha\n // tmp.data[0].commit.message\n\n const commits = await context.octokit.paginate(\n context.octokit.pulls.listCommits,\n context.pullRequest({\n // A custom page size up to 100. Default is 30.\n per_page: 100,\n }),\n (res) => res.data,\n );\n\n const conventionalCommits = await Promise.all(\n commits.map((c) => parse(c.commit.message)),\n );\n\n const breakingChangesCommits: BreakingChangesCommits[] = [];\n conventionalCommits.forEach((c, index) => {\n const breakingChangesNotes = c.notes.filter(\n (note) => note.title === 'BREAKING CHANGE',\n );\n if (breakingChangesNotes.length > 0) {\n breakingChangesCommits.push({\n commit: commits[index],\n breakingChangesNotes,\n });\n }\n });\n\n const breakingChangesLabel = repoContext.labels['breaking-changes'];\n const newCommentBody = updateCommentBodyCommitsNotes(\n commentBody,\n breakingChangesCommits.length === 0\n ? ''\n : `Breaking Changes:\\n${breakingChangesCommits\n .map(({ commit, breakingChangesNotes }) =>\n breakingChangesNotes.map(\n (note) => `- ${note.text.replace('\\n', ' ')} (${commit.sha})`,\n ),\n )\n .join('')}`,\n );\n\n await Promise.all([\n syncLabel(\n pullRequest,\n context,\n breakingChangesCommits.length !== 0,\n breakingChangesLabel,\n ),\n updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newCommentBody),\n ]);\n\n // TODO auto update ! in front of : to signal a breaking change when https://github.com/conventional-changelog/commitlint/issues/658 is closed\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\n\ninterface UpdatePr {\n title?: string;\n body?: string;\n}\n\nconst cleanNewLines = (text: string): string => text.replace(/\\r\\n/g, '\\n');\nconst checkIfHasDiff = (text1: string, text2: string): boolean =>\n cleanNewLines(text1) !== cleanNewLines(text2);\n\nexport const updatePrIfNeeded = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n update: UpdatePr,\n): Promise => {\n const hasDiffInTitle = update.title && pullRequest.title !== update.title;\n const hasDiffInBody =\n update.body && checkIfHasDiff(pullRequest.body, update.body);\n\n if (hasDiffInTitle || hasDiffInBody) {\n const diff: Partial> = {};\n if (hasDiffInTitle) {\n diff.title = update.title;\n pullRequest.title = update.title as string;\n }\n if (hasDiffInBody) {\n diff.body = update.body;\n pullRequest.body = update.body as string;\n }\n\n await context.octokit.pulls.update(\n context.repo({\n pull_number: pullRequest.number,\n ...diff,\n }),\n );\n }\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(\n /[\\s-]+\\[?\\s*([A-Za-z][\\dA-Za-z]+)[ -](\\d+)\\s*]?\\s*$/,\n (s, arg1, arg2) => ` ${arg1.toUpperCase()}-${arg2}`,\n )\n .replace(/^([A-Za-z]+)[/:]\\s*/, (s, arg1) => `${arg1.toLowerCase()}: `)\n .replace(/^Revert \"([^\"]+)\"$/, 'revert: $1')\n .replace(/\\s+[[\\]]\\s*no\\s*issue\\s*[[\\]]$/i, ' [no issue]')\n // eslint-disable-next-line unicorn/no-unsafe-regex\n .replace(/^(revert:.*)(\\s+\\(#\\d+\\))$/, '$1');\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { StatusError, StatusInfo } from '../../../accountConfigs/types';\nimport { ExcludesFalsy } from '../../../utils/Excludes';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { readCommitsAndUpdateInfos } from './readCommitsAndUpdateInfos';\nimport { calcDefaultOptions } from './syncLabelsAfterCommentBodyEdited';\nimport { updatePrIfNeeded } from './updatePr';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport {\n updateCommentBodyInfos,\n defaultCommentBody,\n createCommentBody,\n removeDeprecatedReviewflowInPrBody,\n} from './utils/body/updateBody';\nimport { cleanTitle } from './utils/cleanTitle';\nimport createStatus from './utils/createStatus';\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\nexport const editOpenedPR = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext | null,\n shouldUpdateCommentBodyInfos: boolean,\n previousSha?: string,\n): Promise => {\n if (reviewflowPrContext === null) return;\n\n const title = repoContext.config.trimTitle\n ? cleanTitle(pullRequest.title)\n : pullRequest.title;\n\n const isPrFromBot = pullRequest.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(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 = (\n await context.octokit.checks.listForRef(\n context.repo({\n ref: pullRequest.head.sha,\n }),\n )\n ).data.check_runs.find(\n (check): boolean => check.name === `${process.env.REVIEWFLOW_NAME}/lint-pr`,\n );\n\n const promises: Promise[] = [\n ...statuses.map(\n ({ name, error, info }): Promise =>\n createStatus(\n context,\n name,\n pullRequest.head.sha,\n error ? 'failure' : 'success',\n error ? error.title : (info as StatusInfo).title,\n error ? undefined : (info as StatusInfo).url,\n ),\n ),\n ...(previousSha\n ? statuses\n .map(({ name, error, info }): Promise | undefined =>\n error\n ? createStatus(\n context,\n name,\n previousSha,\n 'success',\n 'New commits have been pushed',\n )\n : undefined,\n )\n .filter(ExcludesFalsy)\n : []),\n hasLintPrCheck &&\n context.octokit.checks.create(\n context.repo({\n name: `${process.env.REVIEWFLOW_NAME}/lint-pr`,\n head_sha: pullRequest.head.sha,\n status: 'completed' as const,\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 && previousSha && errorRule\n ? createStatus(\n context,\n 'lint-pr',\n previousSha,\n 'success',\n 'New commits have been pushed',\n )\n : undefined,\n !hasLintPrCheck &&\n createStatus(\n context,\n 'lint-pr',\n pullRequest.head.sha,\n errorRule ? 'failure' : 'success',\n errorRule ? errorRule.error.title : '✓ Your PR is valid',\n ),\n ].filter(ExcludesFalsy);\n\n const body = removeDeprecatedReviewflowInPrBody(pullRequest.body);\n promises.push(updatePrIfNeeded(pullRequest, context, { title, body }));\n\n const commentBodyInfos = statuses\n .filter((status) => status.info?.inBody)\n .map((status) => status.info) as StatusInfo[];\n\n const shouldCreateCommentBody =\n reviewflowPrContext.commentBody === defaultCommentBody;\n\n const newBody = shouldCreateCommentBody\n ? createCommentBody(\n calcDefaultOptions(repoContext, pullRequest),\n commentBodyInfos,\n )\n : updateCommentBodyInfos(reviewflowPrContext.commentBody, commentBodyInfos);\n\n if (shouldCreateCommentBody || shouldUpdateCommentBodyInfos) {\n promises.push(\n readCommitsAndUpdateInfos(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n newBody,\n ),\n );\n } else {\n promises.push(\n updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newBody),\n );\n }\n\n await Promise.all(promises);\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { checkIfIsThisBot } from './utils/isBotUser';\n\nexport default function edited(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.edited',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n if (reviewflowPrContext == null) return;\n\n const sender = context.payload.sender;\n if (checkIfIsThisBot(sender)) {\n return;\n }\n\n const updatedPullRequest = await fetchPr(\n context,\n context.payload.pull_request.number,\n );\n\n await editOpenedPR(\n updatedPullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n false,\n );\n await autoMergeIfPossible(\n updatedPullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\n\nexport const updateBranch = async (\n pullRequest: PullRequestWithDecentData,\n context: Context,\n login: string,\n): Promise => {\n context.log.info('update branch', {\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n });\n\n const result = await context.octokit.repos\n .merge({\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n head: pullRequest.base.ref,\n base: pullRequest.head.ref,\n })\n .catch((err) => ({ error: err } as any));\n\n context.log.info(\n {\n status: result.status,\n sha: result.data?.sha,\n error: result.error,\n },\n 'update branch result',\n );\n\n if (result.status === 204) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch: base already contains the head, nothing to merge.`,\n }),\n );\n } else if (result.status === 409) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch: merge conflict. Please resolve manually.`,\n }),\n );\n } else if (!result || !result.data || !result.data.sha) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch (unknown error)`,\n }),\n );\n } else {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} branch updated: ${result.data.sha}`,\n }),\n );\n }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateBranch } from './actions/updateBranch';\nimport { updatePrCommentBodyOptions } from './actions/updatePrCommentBody';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport hasLabelInPR from './actions/utils/hasLabelInPR';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nconst isFromRenovate = (\n payload: EventPayloads.WebhookPayloadPullRequest,\n): boolean => {\n const sender = payload.sender;\n return (\n sender.type === 'Bot' &&\n sender.login === 'renovate[bot]' &&\n payload.pull_request.head.ref.startsWith('renovate/')\n );\n};\n\nexport default function labelsChanged(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n createPullRequestHandler<\n EventPayloads.WebhookPayloadPullRequest,\n EventPayloads.WebhookPayloadPullRequest['pull_request']\n >(\n appContext,\n (payload, context, repoContext) => {\n if (payload.sender.type === 'Bot' && !isFromRenovate(payload)) {\n return null;\n }\n\n if (repoContext.shouldIgnore) return null;\n\n return payload.pull_request;\n },\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n if (reviewflowPrContext === null) return;\n\n const fromRenovate = isFromRenovate(context.payload);\n const updatedPr = await fetchPr(context, pullRequest.number);\n\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 const autoMergeSkipCiLabel = repoContext.labels['merge/skip-ci'];\n if (context.payload.action === 'labeled') {\n if (codeApprovedLabel && label.id === codeApprovedLabel.id) {\n // const { data: reviews } = await context.octokit.pulls.listReviews(\n // context.pullRequest({ per_page: 1 }),\n // );\n // if (reviews.length !== 0) {\n await context.octokit.pulls.createReview(\n context.pullRequest({ event: 'APPROVE' }),\n );\n\n let labels = updatedPr.labels;\n const autoMergeWithSkipCi =\n autoMergeSkipCiLabel &&\n repoContext.config.autoMergeRenovateWithSkipCi;\n if (autoMergeWithSkipCi) {\n const result = await context.octokit.issues.addLabels(\n context.issue({\n labels: [autoMergeSkipCiLabel.name],\n }),\n );\n labels = result.data;\n }\n await updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n labels,\n );\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n autoMergeWithSkipCi,\n // force label to avoid racing events (when both events are sent in the same time, reviewflow treats them one by one but the second event wont have its body updated)\n autoMerge: hasLabelInPR(labels, autoMergeLabel)\n ? true\n : repoContext.config.prDefaultOptions.autoMerge,\n },\n );\n // }\n } else if (autoMergeLabel && label.id === autoMergeLabel.id) {\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n autoMerge: true,\n // force label to avoid racing events (when both events are sent in the same time, reviewflow treats them one by one but the second event wont have its body updated)\n // Note: si c'est renovate qui ajoute le label autoMerge, le label codeApprovedLabel n'aurait pu etre ajouté que par renovate également (on est a quelques secondes de l'ouverture de la pr par renovate)\n autoMergeWithSkipCi: hasLabelInPR(\n pullRequest.labels,\n codeApprovedLabel,\n )\n ? true\n : repoContext.config.prDefaultOptions.autoMergeWithSkipCi,\n },\n );\n }\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n }\n return;\n }\n\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.octokit.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(updatedPr, context, repoContext);\n\n const updateBranchLabel = repoContext.labels['merge/update-branch'];\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const option = (() => {\n if (featureBranchLabel && label.id === featureBranchLabel.id) {\n return 'featureBranch';\n }\n if (automergeLabel && label.id === automergeLabel.id) {\n return 'autoMerge';\n }\n if (skipCiLabel && label.id === skipCiLabel.id) {\n return 'autoMergeWithSkipCi';\n }\n return null;\n })();\n\n if (option) {\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n [option]: context.payload.action === 'labeled',\n },\n );\n } // not an else if\n if (automergeLabel && label.id === automergeLabel.id) {\n if (context.payload.action === 'labeled') {\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n } else {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'automerge label removed',\n );\n }\n }\n if (updateBranchLabel && label.id === updateBranchLabel.id) {\n if (context.payload.action === 'labeled') {\n await updateBranch(\n updatedPr,\n context,\n context.payload.sender.login,\n );\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n }\n }\n },\n ),\n );\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestFromRestEndpoint } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\nimport hasLabelInPR from './utils/hasLabelInPR';\n\nexport const autoApproveAndAutoMerge = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n): Promise => {\n // const autoMergeLabel = repoContext.labels['merge/automerge'];\n const codeApprovedLabel = repoContext.labels['code/approved'];\n if (hasLabelInPR(pullRequest.labels, codeApprovedLabel)) {\n await context.octokit.pulls.createReview(\n context.pullRequest({ event: 'APPROVE' }),\n );\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n return true;\n }\n\n return false;\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestFromRestEndpoint } from '../utils/PullRequestData';\n\nexport const autoAssignPRToCreator = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: E['pull_request'] | PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n): Promise => {\n if (!repoContext.config.autoAssignToCreator) return;\n if (pullRequest.assignees.length > 0) return;\n if (pullRequest.user.type === 'Bot') return;\n\n await context.octokit.issues.addAssignees(\n context.issue({\n assignees: [pullRequest.user.login],\n }),\n );\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from 'context/AppContext';\nimport { autoApproveAndAutoMerge } from './actions/autoApproveAndAutoMerge';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { defaultCommentBody } from './actions/utils/body/updateBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { createReviewflowComment } from './utils/reviewflowComment';\n\nexport default function opened(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.opened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n const fromRenovate = pullRequest.head.ref.startsWith('renovate/');\n if (reviewflowPrContext === null) return;\n\n await Promise.all([\n autoAssignPRToCreator(pullRequest, context, repoContext),\n editOpenedPR(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n ),\n fromRenovate\n ? fetchPr(context, pullRequest.number).then((updatedPr) =>\n autoApproveAndAutoMerge(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n ).then(\n async (approved: boolean): Promise => {\n if (!approved && repoContext.config.requiresReviewRequest) {\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n 'dev',\n {\n add: ['needsReview'],\n },\n );\n }\n },\n ),\n )\n : updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n add: repoContext.config.requiresReviewRequest\n ? ['needsReview']\n : [],\n remove: ['approved', 'changesRequested'],\n }),\n ]);\n },\n (pullRequest, context, repoContext) => {\n return {\n reviewflowCommentPromise: createReviewflowComment(\n pullRequest.number,\n context,\n defaultCommentBody,\n ),\n };\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function closed(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.reopened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n await Promise.all([\n updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n add: ['needsReview'],\n remove: ['approved'],\n }),\n editOpenedPR(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n ),\n ]);\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nexport default function reviewDismissed(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request_review.dismissed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n const reviewer = (context.payload as any).review.user;\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const updatedPr = await fetchPr(context, pullRequest.number);\n\n const { reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n const hasApprovals = reviewStates[reviewerGroup].approved !== 0;\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n updatedPr.requested_reviewers,\n { includesReviewerGroup: true },\n );\n\n await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n !hasApprovals && 'needsReview',\n hasApprovals &&\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'approved',\n ],\n remove: [\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n !hasChangesRequestedInReviews && 'changesRequested',\n !hasApprovals && 'approved',\n ],\n },\n );\n\n if (updatedPr.assignees) {\n updatedPr.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !updatedPr.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.postMessage(\n 'pr-review',\n assignee.id,\n assignee.login,\n {\n text: `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n } else {\n repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n {\n text: `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n }\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nexport default function reviewRequestRemoved(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request.review_request_removed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n\n const hasApprovedInReviews =\n reviewStates[reviewerGroup].approved !== 0;\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n // if changes requested by the one which requests was removed (should still be in changed requested anyway, but we never know)\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 && 'requested',\n ],\n },\n );\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n\n const sentMessageRequestedReview = await appContext.mongoStores.slackSentMessages.findOne(\n {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n },\n );\n\n if (sentMessageRequestedReview) {\n const sentTo = sentMessageRequestedReview.sentTo[0];\n const message = sentMessageRequestedReview.message;\n await Promise.all([\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...message,\n text: message.text\n .split('\\n')\n .map((l) => `~${l}~`)\n .join('\\n'),\n }),\n repoContext.slack.addReaction(\n sentTo.ts,\n sentTo.channel,\n 'skull_and_crossbones',\n ),\n appContext.mongoStores.slackSentMessages.deleteOne(\n sentMessageRequestedReview,\n ),\n ]);\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function reviewRequested(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request.review_requested',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n const shouldWait = false;\n // repoContext.approveShouldWait(reviewerGroup, pr.requested_reviewers, { includesWaitForGroups: true });\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n reviewerGroup,\n {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved'],\n },\n );\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n const text = `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )} !\\n> ${pullRequest.title}`;\n const message = { text };\n const result = await repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n message,\n );\n if (result) {\n await appContext.mongoStores.slackSentMessages.insertOne({\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n message,\n account: repoContext.accountEmbed,\n sentTo: [result],\n });\n }\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport slackifyMarkdown from 'slackify-markdown';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createSlackMessageWithSecondaryBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nconst getEmojiFromState = (state: string): string => {\n switch (state) {\n case 'changes_requested':\n return 'x';\n case 'approved':\n return 'white_check_mark';\n default:\n return 'speech_balloon';\n }\n};\n\nexport default function reviewSubmitted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request_review.submitted',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const { payload } = context;\n\n const {\n user: reviewer,\n state,\n body,\n html_url: reviewUrl,\n } = payload.review;\n\n const reviewByOwner = pullRequest.user.login === reviewer.login;\n const { reviewers, reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const followers = reviewers.filter(\n (user) => user.id !== reviewer.id && user.id !== pullRequest.user.id,\n );\n\n if (pullRequest.requested_reviewers) {\n followers.push(\n ...pullRequest.requested_reviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== reviewer.id &&\n rr.id !== pullRequest.user.id\n );\n }),\n );\n }\n\n if (!reviewByOwner) {\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged: boolean;\n\n if (\n reviewflowPrContext &&\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest.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\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const updatedPr = await fetchPr(context, pullRequest.number);\n\n const newLabels = await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'needsReview',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup && '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 updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n newLabels,\n );\n }\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n\n const sentMessageRequestedReview = await appContext.mongoStores.slackSentMessages.findOne(\n {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n },\n );\n\n const emoji = getEmojiFromState(state);\n\n if (sentMessageRequestedReview) {\n const sentTo = sentMessageRequestedReview.sentTo[0];\n const message = sentMessageRequestedReview.message;\n await Promise.all([\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...message,\n text: message.text\n .split('\\n')\n .map((l) => `~${l}~`)\n .join('\\n'),\n }),\n repoContext.slack.addReaction(sentTo.ts, sentTo.channel, emoji),\n appContext.mongoStores.slackSentMessages.deleteOne(\n sentMessageRequestedReview,\n ),\n ]);\n }\n\n if (!body && state !== 'changes_requested' && state !== 'approved') {\n return;\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = slackUtils.createPrLink(pullRequest, repoContext);\n const ownerMention = repoContext.slack.mention(\n pullRequest.user.login,\n );\n\n const createMessage = (toOwner?: boolean): string => {\n const ownerPart = toOwner ? 'your PR' : `${ownerMention}'s PR`;\n\n if (state === 'changes_requested') {\n return `:${emoji}: ${mention} requests changes on ${ownerPart} ${prUrl}`;\n }\n if (state === 'approved') {\n return `${\n toOwner ? ':clap: ' : ''\n }:${emoji}: ${mention} approves ${ownerPart} ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n\n const commentLink = slackUtils.createLink(reviewUrl, 'commented');\n return `:${emoji}: ${mention} ${commentLink} on ${ownerPart} ${prUrl}`;\n };\n\n const slackifiedBody = slackifyMarkdown((body as unknown) as string);\n\n repoContext.slack.postMessage(\n 'pr-review',\n pullRequest.user.id,\n pullRequest.user.login,\n createSlackMessageWithSecondaryBlock(\n createMessage(true),\n slackifiedBody,\n ),\n );\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n followers.forEach((follower) => {\n repoContext.slack.postMessage(\n 'pr-review-follow',\n follower.id,\n follower.login,\n message,\n );\n });\n } else if (body) {\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = slackUtils.createPrLink(pullRequest, repoContext);\n const commentLink = slackUtils.createLink(reviewUrl, 'commented');\n\n const message = createSlackMessageWithSecondaryBlock(\n `:speech_balloon: ${mention} ${commentLink} on his PR ${prUrl}`,\n body,\n );\n\n followers.forEach((follower) => {\n repoContext.slack.postMessage(\n 'pr-review-follow',\n follower.id,\n follower.login,\n message,\n );\n });\n }\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport type { LockedMergePr } from '../../context/repoContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\n\nconst isSameBranch = (\n payload: Context['payload'],\n lockedPr: LockedMergePr,\n): boolean => {\n if (!lockedPr) return false;\n return !!payload.branches.find((b) => b.name === lockedPr.branch);\n};\n\nexport default function status(app: Probot, appContext: AppContext): void {\n app.on(\n 'status',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext): LockedMergePr[] => {\n if (repoContext.shouldIgnore) return [];\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (!lockedPr) return [];\n\n if (payload.state !== 'loading' && isSameBranch(payload, lockedPr)) {\n return [lockedPr];\n }\n\n return [];\n },\n (pr, context, repoContext): void => {\n const lockedPr = repoContext.getMergeLockedPr();\n // check if changed\n if (isSameBranch(context.payload, lockedPr)) {\n repoContext.reschedule(context, lockedPr);\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function synchronize(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.synchronize',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n if (!reviewflowPrContext) return;\n\n const updatedPr = await fetchPr(context, pullRequest.number);\n // old and new sha\n // const { before, after } = context.payload;\n const previousSha = (context.payload as any).before as string;\n\n await Promise.all([\n editOpenedPR(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n previousSha,\n ),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n updatedPr.labels,\n previousSha,\n ),\n ]);\n\n // call autoMergeIfPossible to re-add to the queue when push is fixed\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { obtainRepoContext } from '../../context/repoContext';\nimport { getEmojiFromRepoDescription } from '../../context/utils';\nimport { createHandlerOrgChange } from '../account-handlers/utils/handler';\n\nexport default function repoEdited(app: Probot, appContext: AppContext): void {\n app.on(\n 'repository.edited',\n createHandlerOrgChange(\n appContext,\n async (context, orgContext): Promise => {\n const repoContext = await obtainRepoContext(appContext, context);\n if (!repoContext) return;\n const repo = context.payload.repository;\n repoContext.repoFullName = repo.full_name;\n repoContext.repoEmoji = getEmojiFromRepoDescription(repo.description);\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\n// import commands from 'probot-commands';\nimport type { AppContext } from './context/AppContext';\nimport { syncOrg } from './events/account-handlers/actions/syncOrg';\nimport { syncTeams } from './events/account-handlers/actions/syncTeams';\nimport { createHandlerOrgChange } from './events/account-handlers/utils/handler';\nimport checkrunCompleted from './events/pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './events/pr-handlers/checksuiteCompleted';\nimport closedHandler from './events/pr-handlers/closed';\nimport commentCreated from './events/pr-handlers/commentCreated';\nimport commentEditedOrDeleted from './events/pr-handlers/commentEditedOrDeleted';\nimport editedHandler from './events/pr-handlers/edited';\nimport labelsChanged from './events/pr-handlers/labelsChanged';\nimport openedHandler from './events/pr-handlers/opened';\nimport reopenedHandler from './events/pr-handlers/reopened';\nimport reviewDismissedHandler from './events/pr-handlers/reviewDismissed';\nimport reviewRequestRemovedHandler from './events/pr-handlers/reviewRequestRemoved';\nimport reviewRequestedHandler from './events/pr-handlers/reviewRequested';\nimport reviewSubmittedHandler from './events/pr-handlers/reviewSubmitted';\nimport status from './events/pr-handlers/status';\nimport synchronizeHandler from './events/pr-handlers/synchronize';\nimport repoEdited from './events/repository-handlers/repoEdited';\n\nexport default function initApp(app: Probot, appContext: AppContext): void {\n /* https://developer.github.com/webhooks/event-payloads/#organization */\n app.on(\n ['organization.member_added', 'organization.member_removed'],\n createHandlerOrgChange(\n appContext,\n async (context, accountContext) => {\n await syncOrg(\n appContext.mongoStores,\n context.octokit,\n accountContext.account.installationId as number,\n context.payload.organization,\n );\n },\n ),\n );\n\n /* https://developer.github.com/webhooks/event-payloads/#team */\n app.on(\n ['team.created', 'team.deleted', 'team.edited'],\n createHandlerOrgChange(\n appContext,\n async (context, accountContext) => {\n await syncTeams(\n appContext.mongoStores,\n context.octokit,\n context.payload.organization,\n );\n },\n ),\n );\n\n // /* https://developer.github.com/webhooks/event-payloads/#membership */\n // app.on(\n // ['membership.added', 'membership.removed'],\n // createHandlerOrgChange(\n // mongoStores,\n // async (context, accountContext) => {\n // await syncTeamMembers(\n // mongoStores,\n // context.octokit,\n // context.payload.organization,\n // context.payload.team,\n // );\n // },\n // ),\n // );\n\n // Repo\n /* https://developer.github.com/webhooks/event-payloads/#repository */\n repoEdited(app, appContext);\n\n // PR\n /* https://developer.github.com/webhooks/event-payloads/#pull_request */\n openedHandler(app, appContext);\n editedHandler(app, appContext);\n closedHandler(app, appContext);\n reopenedHandler(app, appContext);\n\n reviewRequestedHandler(app, appContext);\n reviewRequestRemovedHandler(app, appContext);\n reviewSubmittedHandler(app, appContext);\n reviewDismissedHandler(app, appContext);\n labelsChanged(app, appContext);\n synchronizeHandler(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#pull_request_review_comment */\n /* https://developer.github.com/webhooks/event-payloads/#issue_comment */\n commentCreated(app, appContext);\n commentEditedOrDeleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#check_run */\n checkrunCompleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#check_suite */\n checksuiteCompleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#status */\n status(app, appContext);\n\n /* commands */\n // commands(app, 'update-branch', () => {});\n}\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { MongoBaseModel } from 'liwi-mongo';\nimport { MongoStore, MongoConnection } from 'liwi-mongo';\nimport type { SlackMessage } from './context/SlackMessage';\nimport type { MessageCategory } from './dm/MessageCategory';\n\n// export interface PrEventsModel extends MongoModel {\n// owner: string;\n// repo: string;\n// prId: string;\n// prNumber: string;\n// event: string;\n// }\n\nexport type AccountType = 'Organization' | 'User';\n\nexport interface AccountEmbed {\n id: number;\n login: string;\n type: AccountType;\n}\n\ninterface RepoEmbed {\n id: number;\n name: string;\n}\n\ninterface PrEmbed {\n number: number;\n}\n\ntype AccountEmbedWithoutType = Omit;\n\nexport interface UserDmSettings extends MongoBaseModel {\n userId: number;\n orgId: number;\n settings: Record;\n}\n\n// TODO _id is number\ninterface BaseAccount extends MongoBaseModel {\n login: string;\n installationId?: number;\n}\n\nexport interface User extends BaseAccount {\n type: string;\n}\n\nexport interface Org extends BaseAccount {\n slackToken?: string;\n}\n\nexport interface OrgMember extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n user: AccountEmbedWithoutType;\n slack?: { id: string };\n}\n\nexport interface OrgTeam extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n name: string;\n slug: string;\n description: string;\n}\n\nexport type SlackMessageType =\n | 'review-comment'\n | 'issue-comment'\n | 'review-submitted'\n | 'review-requested';\n\nexport interface SlackSentMessage extends MongoBaseModel {\n type: SlackMessageType;\n typeId: number | string;\n account: AccountEmbed;\n message: SlackMessage;\n sentTo: {\n channel: string;\n ts: string;\n }[];\n}\n\nexport interface AutomergeLog extends MongoBaseModel {\n account: AccountEmbed;\n repoFullName: string;\n pr: {\n id: number;\n number: number;\n isRenovate: boolean;\n mergeableState: string;\n };\n type:\n | 'rebase-renovate'\n | 'unknown mergeable_state'\n | 'blocked mergeable_state'\n | 'behind mergeable_state'\n | 'not mergeable'\n | 'failed status or checks'\n | 'already merged';\n action: 'remove' | 'reschedule' | 'wait' | 'update branch';\n}\n\nexport interface ReviewflowPr extends MongoBaseModel {\n account: AccountEmbed;\n repo: RepoEmbed;\n pr: PrEmbed;\n commentId: number;\n}\n\nexport interface MongoStores {\n connection: MongoConnection;\n userDmSettings: MongoStore;\n users: MongoStore;\n orgs: MongoStore;\n orgMembers: MongoStore;\n orgTeams: MongoStore;\n slackSentMessages: MongoStore;\n automergeLogs: MongoStore;\n prs: MongoStore;\n // prEvents: MongoStore;\n}\n\nif (!process.env.MONGO_DB) {\n throw new Error('MONGO_DB is missing in process.env');\n}\n\nexport default function init(): MongoStores {\n const config = new Map([\n ['host', process.env.MONGO_HOST || 'localhost'],\n ['port', process.env.MONGO_PORT || '27017'],\n ['database', process.env.MONGO_DB as string],\n ]);\n if (process.env.MONGO_USER) {\n config.set('user', process.env.MONGO_USER);\n config.set('password', process.env.MONGO_PASSWORD as string);\n }\n const connection = new MongoConnection(config);\n\n // const prEvents = new MongoStore(connection, 'prEvents');\n // prEvents.collection.then((coll) => {\n // coll.createIndex({ owner: 1, repo: 1, ???: 1 });\n // });\n\n const userDmSettings = new MongoStore(\n connection,\n 'userDmSettings',\n );\n userDmSettings.collection.then((coll) => {\n coll.createIndex({ userId: 1, orgId: 1 }, { unique: true });\n });\n\n const users = new MongoStore(connection, 'users');\n users.collection.then((coll) => {\n coll.createIndex({ login: 1 }, { unique: true });\n });\n\n const orgs = new MongoStore(connection, 'orgs');\n orgs.collection.then((coll) => {\n coll.createIndex({ login: 1 }, { unique: true });\n });\n\n const orgMembers = new MongoStore(connection, 'orgMembers');\n orgMembers.collection.then((coll) => {\n coll.createIndex({ 'user.id': 1, 'org.id': 1 }, { unique: true });\n });\n\n const orgTeams = new MongoStore(connection, 'orgTeams');\n orgTeams.collection.then((coll) => {\n coll.createIndex({ 'org.id': 1 });\n });\n\n const slackSentMessages = new MongoStore(\n connection,\n 'slackSentMessages',\n );\n slackSentMessages.collection.then((coll) => {\n coll.createIndex({\n 'account.id': 1,\n 'account.type': 1,\n type: 1,\n typeId: 1,\n });\n // remove older than 14 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 14 * 24 * 60 * 60 * 1000) },\n });\n });\n\n const automergeLogs = new MongoStore(\n connection,\n 'automergeLogs',\n );\n automergeLogs.collection.then((coll) => {\n coll.createIndex({\n repoFullName: 1,\n type: 1,\n });\n coll.createIndex({\n repoFullName: 1,\n 'pr.number': 1,\n });\n // remove older than 30 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) },\n });\n });\n\n const prs = new MongoStore(connection, 'prs');\n prs.collection.then((coll) => {\n coll.createIndex(\n {\n 'account.id': 1,\n 'repo.id': 1,\n 'pr.number': 1,\n },\n { unique: true },\n );\n // remove older than 12 * 30 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 12 * 30 * 24 * 60 * 60 * 1000) },\n });\n });\n\n // return { connection, prEvents };\n return {\n connection,\n userDmSettings,\n users,\n orgs,\n orgMembers,\n orgTeams,\n slackSentMessages,\n automergeLogs,\n prs,\n };\n}\n","import type { Octokit } from '@octokit/core';\nimport { WebClient } from '@slack/web-api';\nimport type { MongoStores, Org, OrgMember } from '../mongo';\nimport { createLink } from './utils';\n\ninterface QueueItem {\n github: Octokit;\n slackClient: WebClient;\n member: OrgMember;\n}\n\nexport const createSlackHomeWorker = (mongoStores: MongoStores) => {\n const updateMember = async (\n github: Octokit,\n slackClient: WebClient,\n member: OrgMember,\n ): Promise => {\n if (!member.slack?.id) return;\n // console.log('update member', member.org.login, member.user.login);\n\n /* search limit: 30 requests per minute = 7 update/min max */\n const [\n prsWithRequestedReviews,\n prsToMerge,\n prsWithRequestedChanges,\n prsInDraft,\n ] = await Promise.all([\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open review-requested:${member.user.login} `,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} label:\":ok_hand: code/approved\"`,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} label:\":ok_hand: code/changes-requested\"`,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} draft:true`,\n sort: 'created',\n order: 'desc',\n per_page: 5,\n }),\n ]);\n\n const blocks: any[] = [];\n\n const buildBlocks = (title: string, results: any) => {\n if (!results.total_count) return;\n\n blocks.push(\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*${title}*`,\n },\n },\n {\n type: 'divider',\n },\n ...results.items\n .map((pr: any) => {\n const repoName = pr.repository_url.slice(\n 'https://api.github.com/repos/'.length,\n );\n const prFullName = `${repoName}#${pr.number}`;\n\n return [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*${createLink(pr.html_url, pr.title)}*`,\n // ${pr.labels.map((l) => `{${l.name}}`).join(' · ')}\n },\n },\n {\n type: 'context',\n elements: [\n {\n type: 'mrkdwn',\n text: `${createLink(pr.html_url, prFullName)} ${\n pr.draft ? '· _Draft_' : ''\n }`,\n },\n {\n type: 'image',\n image_url: pr.user.avatar_url,\n alt_text: pr.user.login,\n },\n {\n type: 'mrkdwn',\n text: `${pr.user.login}`,\n },\n ],\n },\n ];\n })\n .flat(),\n {\n type: 'context',\n elements: [\n {\n type: 'image',\n image_url:\n 'https://api.slack.com/img/blocks/bkb_template_images/placeholder.png',\n alt_text: 'placeholder',\n },\n ],\n },\n );\n };\n\n buildBlocks(':eyes: Requested Reviews', prsWithRequestedReviews.data);\n buildBlocks(':white_check_mark: Ready to Merge', prsToMerge.data);\n buildBlocks(':x: Changes Requested', prsWithRequestedChanges.data);\n buildBlocks(':construction: Drafts', prsInDraft.data);\n\n if (blocks.length === 0) {\n blocks.push({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: \":tada: It looks like you don't have any PR to review!\",\n },\n });\n }\n\n slackClient.views.publish({\n user_id: member.slack.id,\n view: {\n type: 'home',\n blocks,\n },\n });\n };\n\n let workerInterval: ReturnType | undefined;\n const queueKeys = new Set();\n const queue: QueueItem[] = [];\n\n const stop = (): void => {\n if (workerInterval !== undefined) {\n clearInterval(workerInterval);\n workerInterval = undefined;\n }\n };\n\n const start = (): void => {\n if (workerInterval !== undefined) return;\n workerInterval = setInterval(() => {\n const item = queue.shift();\n if (!item) {\n stop();\n return;\n }\n\n const { github, slackClient, member } = item;\n const memberId = member.slack?.id;\n\n const key = `${member.org.id}_${memberId}`;\n queueKeys.delete(key);\n\n updateMember(github, slackClient, member);\n }, 9000); // 7/min 60s 1min = 1 ttes les 8.5s max\n };\n\n const scheduleUpdateMember = (\n github: Octokit,\n slackClient: WebClient,\n member: OrgMember,\n ): void => {\n const memberId = member.slack?.id;\n if (!memberId) return;\n\n const key = `${member.org.id}_${memberId}`;\n\n if (!queueKeys.has(key)) {\n queueKeys.add(key);\n queue.push({\n github,\n slackClient,\n member,\n });\n start();\n }\n };\n\n const scheduleUpdateOrg = async (\n github: Octokit,\n org: Org,\n slackClient = new WebClient(org.slackToken),\n ): Promise => {\n const cursor = await mongoStores.orgMembers.cursor();\n cursor.forEach((member) => {\n scheduleUpdateMember(github, slackClient, member);\n });\n };\n\n const scheduleUpdateAllOrgs = async (\n auth: (installationId: number) => Promise,\n ): Promise => {\n const cursor = await mongoStores.orgs.cursor();\n cursor.forEach(async (org) => {\n if (!org.slackToken || !org.installationId) return;\n const github = await auth(org.installationId);\n await scheduleUpdateOrg(github, org);\n });\n };\n\n return {\n scheduleUpdateMember,\n scheduleUpdateOrg,\n scheduleUpdateAllOrgs,\n };\n};\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport 'dotenv/config';\nimport { run } from 'probot';\nimport appRouter from './appRouter';\nimport type { AppContext } from './context/AppContext';\nimport initApp from './initApp';\nimport mongoInit from './mongo';\nimport { createSlackHomeWorker } from './slack/home';\n\nif (!process.env.REVIEWFLOW_NAME) process.env.REVIEWFLOW_NAME = 'reviewflow';\nconsole.log({ name: process.env.REVIEWFLOW_NAME });\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\nrun(({ app, getRouter }) => {\n const mongoStores = mongoInit();\n const slackHome = createSlackHomeWorker(mongoStores);\n const appContext: AppContext = { mongoStores, slackHome };\n appRouter(app, getRouter, appContext);\n initApp(app, appContext);\n slackHome.scheduleUpdateAllOrgs((id: number) => app.auth(id));\n});\n"],"names":["process","env","GITHUB_CLIENT_ID","Error","GITHUB_CLIENT_SECRET","oauth2","create","client","id","secret","auth","tokenHost","tokenPath","authorizePath","Layout","lang","title","REVIEWFLOW_NAME","children","React","padding","AUTH_SECRET_KEY","signPromisified","promisify","sign","verifyPromisified","verify","secure","SECURE_COOKIE","createRedirectUri","req","host","hostname","PORT","readAuthCookie","strategy","cookie","cookies","algorithm","audience","headers","getAuthInfoFromCookie","res","authInfo","clearCookie","undefined","createApi","accessToken","Octokit","getUser","redirect","api","router","get","redirectUri","githubAuth","authorizationCode","authorizeURL","redirect_uri","scope","query","error","send","error_description","code","result","getToken","renderToStaticMarkup","access_token","user","users","getAuthenticated","data","login","time","Date","now","token","expiresIn","httpOnly","home","orgs","listForAuthenticatedUser","display","flexGrow","map","org","config","autoAssignToCreator","trimTitle","requiresReviewRequest","prDefaultOptions","featureBranch","autoMergeWithSkipCi","autoMerge","deleteAfterMerge","parsePR","regExp","summary","groups","dev","christophehurpeau","tilap","waitForGroups","teams","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","ignoreRepoPattern","autoMergeRenovateWithSkipCi","bot","status","statusInfoFromMatch","match","issue","inBody","url","botUsers","JulienBreux","ORNIKAR_EMAIL_DOMAIN","TheR3aLp3nGuinJM","abarreir","damienorny","darame07","Pixy","machartier","HugoGarrido","CorentinAndre","Mxime","vlbr","mdcarter","ChibiBlasphem","PSniezak","design","jperriere","CoralineColasse","Lenamari","loicleser","ops","logins","backends","frontends","description","duplicate","documentation","rfc","bug","enhancement","question","wontfix","chrisconfig","accountConfigs","ornikar","reviewflow","defaultDmSettings","cache","Map","getDefaultDmSettings","accountConfig","defaultConfig","updateCache","userId","newSettings","orgCache","set","getUserDmSettings","mongoStores","orgId","orgDefaultDmSettings","userDmSettingsConfig","userDmSettings","findOne","settings","syncOrg","github","installationId","orgInStore","upsertOne","_id","orgEmbed","memberIds","Promise","all","paginate","listMembers","endpoint","merge","member","push","orgMembers","type","deleteMany","$not","$in","syncTeams","teamIds","team","orgTeams","slug","dmMessages","orgSettings","octokitApp","find","o","params","findByKey","installation","apps","getOrgInstallation","catch","err","width","Object","entries","key","__html","patch","bodyParser","json","body","collection","updateOne","$set","value","updated","$setOnInsert","created","upsert","repository","repos","per_page","repo","owner","length","permissions","admin","data2","getRepoInstallation","syncUser","userInfo","userSettings","u","getUserInstallation","username","appRouter","app","getRouter","use","cookieParser","ExcludesFalsy","Boolean","ExcludesNullish","getOrCreateAccount","accountInfo","getKeys","keys","emojiRegex","createEmojiRegex","getEmojiFromRepoDescription","startsWith","emoji","exec","voidTeamSlack","mention","postMessage","resolve","updateMessage","deleteMessage","addReaction","updateHome","initTeamSlack","slackHome","context","account","payload","slackToken","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackEmails","values","slackClient","WebClient","membersInDb","findAll","members","foundEmailMembers","forEach","email","m","slack","im","missingEmails","filter","includes","memberEmailToMemberId","page","profile","has","partialUpdateMany","conversations","open","channel","console","membersMap","getUserFromGithubLogin","githubLogin","category","githubId","message","log","debug","DRY_RUN","chat","text","blocks","attachments","secondaryBlocks","thread_ts","ts","ok","update","delete","reactions","add","timestamp","scheduleUpdateMember","octokit","initAccountContext","appContext","slackPromise","githubLoginToGroup","githubLoginToTeams","teamName","getReviewerGroups","githubLogins","Set","lock","Lock","accountEmbed","accountType","callback","reject","logInfos","info","createReleaseCallback","release","getReviewerGroup","getTeamsForLogin","approveShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","some","group","accountContextsPromise","accountContexts","obtainAccountContext","existingAccountContext","existingPromise","promise","then","accountContext","handlerOrgChange","organization","createHandlerOrgChange","options","optionsRegexps","option","regexp","RegExp","optionsLabels","label","parseOptions","content","defaultOptions","parseCommitNotes","commitNotes","replace","trim","parseBody","hasLabelInPR","prLabels","l","hasFailedStatusOrChecks","pr","checks","listForRef","ref","head","sha","failedChecks","check_runs","check","conclusion","combinedStatus","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","pullRequest","repoContext","reviewflowPrContext","autoMergeLabel","removePrFromAutomergeQueue","number","isRenovatePr","createMergeLockPrFromPr","branch","addLog","action","repoFullName","full_name","automergeLogs","insertOne","isRenovate","mergeableState","mergeable_state","hasNeedsReview","hasRequestedReview","requested_reviewers","lockedPr","getMergeLockedPr","String","prId","prNumber","pushAutomergeQueue","addMergeLockPr","mergeable","prResult","pulls","pull_number","merged","reschedule","renovateRebaseBody","issues","issue_number","base","parsedBody","commentBody","mergeResult","merge_method","commit_title","commit_message","errorMessage","defaultCommentBody","toMarkdownOptions","join","toMarkdownInfos","infos","getReplacement","updateOptions","optionsToUpdate","internalUpdateBodyOptionsAndInfos","infosAndCommitNotesParagraph","createCommentBody","updateCommentOptions","updatedOptions","updateCommentBodyInfos","updateCommentBodyCommitsNotes","removeDeprecatedReviewflowInPrBody","prBody","createReviewflowComment","pullRequestNumber","createComment","getReviewflowCommentById","commentId","getComment","comment_id","getReviewflowPrContext","reviewflowCommentPromise","prEmbed","comment","reviewflowPr","prs","repoEmbed","existing","partialUpdateByKey","fetchPr","getLabelsForRepo","listLabelsForRepo","initRepoLabels","finalLabels","labelKey","labelConfig","labelColor","slice","existingLabel","createLabel","current_name","updateLabel","shouldIgnoreRepo","repoName","ignoreRepoRegexp","test","createGetReviewLabelIds","shouldIgnore","reviewGroupNames","initRepoContext","fullName","repoEmoji","getReviewLabelIds","needsReviewLabelIds","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","protectedLabelIds","labelIdToGroupName","reviewGroupLabels","lockMergePr","automergeQueue","lockPR","prOrPrIssueId","setTimeout","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","reason","shift","previousLength","p","lockPullRequest","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","warn","createRepoHandler","createPullRequestHandler","getPullRequestInPayload","callbackPr","callbackBeforeLock","createPullRequestsHandler","getPrs","checkrunCompleted","on","check_run","pull_requests","updatedPr","checksuiteCompleted","check_suite","createStatus","createCommitStatus","target_url","addStatusCheck","previousSha","hasPrCheck","head_sha","started_at","created_at","completed_at","toISOString","output","updateStatusCheckFromLabels","createFailedStatusCheck","rr","needsReviewGroupNames","updateReviewStatus","reviewGroup","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toAddNames","toDelete","toDeleteNames","getLabelFromKey","reviewConfig","prLabel","size","addLabels","toDeleteName","removeLabel","newLabelNamesArray","oldLabels","setLabels","closed","pull_request","isNotFork","git","deleteRef","assignees","assignee","createLink","createPrLink","html_url","createMrkdwnSectionBlock","createSlackMessageWithSecondaryBlock","secondaryBlockText","getPullRequestFromPayload","getReviewersAndReviewStates","userIds","reviewers","reviewStatesByUser","listReviews","reviews","toUpperCase","reviewStates","dismissed","reviewer","checkIfUserIsBot","checkIfIsThisBot","parse","issueParser","actions","issuePrefixes","parseMentions","mentions","slackifyCommentBody","multipleLines","slackifyMarkdown","getDiscussion","in_reply_to_id","listComments","c","getMentions","discussion","getUsersInThread","prCommentCreated","saveInDb","results","filtered","slackSentMessages","typeId","sentTo","pull_request_review_id","commentByOwner","followers","f","usersInThread","prUrl","slackUtils","ownerMention","commentLink","createMessage","toOwner","ownerPart","promisesOwner","promisesNotOwner","slackifiedBody","start_line","isBotUser","slackMessage","follower","updatePrCommentBody","newBody","updateComment","updatePrCommentBodyIfNeeded","updatePrCommentBodyOptions","syncLabel","shouldHaveLabel","prHasLabel","onRemove","onAdd","response","calcDefaultOptions","featureBranchLabel","automergeLabel","skipCiLabel","prHasFeatureBranchLabel","prHasSkipCiLabel","prHasAutoMergeLabel","syncLabelsAfterCommentBodyEdited","prCommentEditedOrDeleted","sender","closed_at","criteria","sentMessages","sentMessage","readCommitsAndUpdateInfos","commits","listCommits","conventionalCommits","commit","breakingChangesCommits","index","breakingChangesNotes","notes","note","breakingChangesLabel","newCommentBody","cleanNewLines","checkIfHasDiff","text1","text2","updatePrIfNeeded","hasDiffInTitle","hasDiffInBody","diff","cleanTitle","s","arg1","arg2","toLowerCase","editOpenedPR","shouldUpdateCommentBodyInfos","isPrFromBot","errorRule","rule","date","hasLintPrCheck","promises","commentBodyInfos","shouldCreateCommentBody","edited","updatedPullRequest","updateBranch","isFromRenovate","labelsChanged","fromRenovate","codeApprovedLabel","autoMergeSkipCiLabel","createReview","event","updateBranchLabel","autoApproveAndAutoMerge","autoAssignPRToCreator","addAssignees","opened","reviewDismissed","hasChangesRequestedInReviews","hasApprovals","hasRequestedReviewsForGroup","reviewRequestRemoved","requested_reviewer","hasApprovedInReviews","sentMessageRequestedReview","split","deleteOne","reviewRequested","getEmojiFromState","reviewSubmitted","reviewUrl","reviewByOwner","newLabels","isSameBranch","branches","b","synchronize","before","repoEdited","initApp","openedHandler","editedHandler","closedHandler","reopenedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","synchronizeHandler","commentCreated","commentEditedOrDeleted","MONGO_DB","init","MONGO_HOST","MONGO_PORT","MONGO_USER","MONGO_PASSWORD","connection","MongoConnection","MongoStore","coll","createIndex","unique","$lt","createSlackHomeWorker","updateMember","prsWithRequestedReviews","prsToMerge","prsWithRequestedChanges","prsInDraft","search","issuesAndPullRequests","q","sort","order","buildBlocks","total_count","items","repository_url","prFullName","elements","draft","image_url","avatar_url","alt_text","flat","views","publish","user_id","view","workerInterval","queueKeys","queue","stop","clearInterval","start","setInterval","item","memberId","scheduleUpdateOrg","cursor","scheduleUpdateAllOrgs","run","mongoInit"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index-node10.cjs.js b/dist/index-node10.cjs.js index d7559ddf7..be0ac89e2 100644 --- a/dist/index-node10.cjs.js +++ b/dist/index-node10.cjs.js @@ -1150,11 +1150,11 @@ const initTeamSlack = async ({ return `<@${user.member.id}>`; }, postMessage: async (category, githubId, githubLogin, message) => { - context.log.debug('slack: post message', { + context.log.debug({ category, githubLogin, message - }); + }, 'slack: post message'); if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null; const userDmSettings = await getUserDmSettings(mongoStores, owner.login, owner.id, githubId); if (!userDmSettings[category]) return null; @@ -1177,11 +1177,11 @@ const initTeamSlack = async ({ }; }, updateMessage: async (ts, channel, message) => { - context.log.debug('slack: update message', { + context.log.debug({ ts, channel, message - }); + }, 'slack: update message'); if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null; const result = await slackClient.chat.update({ ts, @@ -1199,21 +1199,21 @@ const initTeamSlack = async ({ }; }, deleteMessage: async (ts, channel) => { - context.log.debug('slack: delete message', { + context.log.debug({ ts, channel - }); + }, 'slack: delete message'); await slackClient.chat.delete({ ts, channel }); }, addReaction: async (ts, channel, name) => { - context.log.debug('slack: add reaction', { + context.log.debug({ ts, channel, name - }); + }, 'slack: add reaction'); await slackClient.reactions.add({ timestamp: ts, channel, @@ -1221,9 +1221,9 @@ const initTeamSlack = async ({ }); }, updateHome: githubLogin => { - context.log.debug('update slack home', { + context.log.debug({ githubLogin - }); + }, 'update slack home'); const user = getUserFromGithubLogin(githubLogin); if (!user || !user.member) return; slackHome.scheduleUpdateMember(context.octokit, slackClient, { @@ -1282,22 +1282,22 @@ const initAccountContext = async (appContext, context, config, accountInfo) => { const logInfos = { account: accountInfo.login }; - context.log.info('lock: try to lock account', logInfos); // eslint-disable-next-line @typescript-eslint/no-misused-promises + context.log.info(logInfos, 'lock: try to lock account'); // eslint-disable-next-line @typescript-eslint/no-misused-promises lock$1('_', async createReleaseCallback => { const release = createReleaseCallback(() => {}); - context.log.info('lock: lock account acquired', logInfos); + context.log.info(logInfos, 'lock: lock account acquired'); try { await callback(); } catch (err) { - context.log.info('lock: release account (with error)', logInfos); + context.log.info(logInfos, 'lock: release account (with error)'); release(); reject(err); return; } - context.log.info('lock: release account', logInfos); + context.log.info(logInfos, 'lock: release account'); release(); resolve(); }); @@ -1419,9 +1419,9 @@ const hasFailedStatusOrChecks = async (pr, context) => { const failedChecks = checks.data.check_runs.filter(check => check.conclusion === 'failure'); if (failedChecks.length > 0) { - context.log.info(`automerge not possible: failed check pr ${pr.id}`, { + context.log.info({ checks: failedChecks.map(check => check.name) - }); + }, `automerge not possible: failed check pr ${pr.id}`); return true; } @@ -1432,9 +1432,9 @@ const hasFailedStatusOrChecks = async (pr, context) => { if (combinedStatus.data.state === 'failure') { const failedStatuses = combinedStatus.data.statuses.filter(status => status.state === 'failure' || status.state === 'error'); - context.log.info(`automerge not possible: failed status pr ${pr.id}`, { + context.log.info({ statuses: failedStatuses.map(status => status.context) - }); + }, `automerge not possible: failed status pr ${pr.id}`); return true; } @@ -1492,10 +1492,10 @@ const autoMergeIfPossible = async (pullRequest, context, repoContext, reviewflow const lockedPr = repoContext.getMergeLockedPr(); if (lockedPr && String(lockedPr.number) !== String(pullRequest.number)) { - context.log.info('automerge not possible: locked pr', { + context.log.info({ prId: pullRequest.id, prNumber: pullRequest.number - }); + }, 'automerge not possible: locked pr'); repoContext.pushAutomergeQueue(createMergeLockPrFromPr()); return false; } @@ -1577,10 +1577,10 @@ const autoMergeIfPossible = async (pullRequest, context, repoContext, reviewflow if (pullRequest.mergeable_state === 'behind') { addLog('behind mergeable_state', 'update branch'); - context.log.info('automerge not possible: update branch', { + context.log.info({ head: pullRequest.head.ref, base: pullRequest.base.ref - }); + }, 'automerge not possible: update branch'); await context.octokit.repos.merge({ owner: pullRequest.head.repo.owner.login, repo: pullRequest.head.repo.name, @@ -1609,11 +1609,13 @@ const autoMergeIfPossible = async (pullRequest, context, repoContext, reviewflow commit_message: options.featureBranch ? undefined : '' // TODO add BC }); - context.log.debug('merge result:', mergeResult.data); + context.log.debug(mergeResult.data, 'merge result:'); repoContext.removePrFromAutomergeQueue(context, pullRequest.number, 'merged'); return Boolean('merged' in mergeResult.data && mergeResult.data.merged); } catch (err) { - context.log.info('could not merge:', err.message); + context.log.info({ + errorMessage: err.message + }, 'could not merge:'); repoContext.reschedule(context, createMergeLockPrFromPr()); return false; } @@ -1804,12 +1806,12 @@ const initRepoLabels = async (context, config) => { })); finalLabels[labelKey] = result.data; } else if (existingLabel.name !== labelConfig.name || existingLabel.color !== labelColor || existingLabel.description !== description) { - context.log.info('Needs to update label', { + context.log.info({ current_name: existingLabel.name, name: existingLabel.name !== labelConfig.name && labelConfig.name, color: existingLabel.color !== labelColor && labelColor, description: existingLabel.description !== description && description - }); + }, 'Needs to update label'); const result = await context.octokit.issues.updateLabel(context.repo({ current_name: existingLabel.name, name: labelConfig.name, @@ -1886,22 +1888,22 @@ async function initRepoContext(appContext, context, config) { prOrPrIssueId, prNumber }; - context.log.debug('lock: try to lock pr', logInfos); // eslint-disable-next-line @typescript-eslint/no-misused-promises + context.log.debug(logInfos, 'lock: try to lock pr'); // eslint-disable-next-line @typescript-eslint/no-misused-promises lock$1(String(prNumber), async createReleaseCallback => { const release = createReleaseCallback(() => {}); - context.log.info('lock: lock pr acquired', logInfos); + context.log.info(logInfos, 'lock: lock pr acquired'); try { await callback(); } catch (err) { - context.log.info('lock: release pr (with error)', logInfos); + context.log.info(logInfos, 'lock: release pr (with error)'); release(); reject(err); return; } - context.log.info('lock: release pr', logInfos); + context.log.info(logInfos, 'lock: release pr'); release(); resolve(); }); @@ -1909,7 +1911,7 @@ async function initRepoContext(appContext, context, config) { const reschedule = (context, pr) => { if (!pr) throw new Error('Cannot reschedule undefined'); - context.log.info('reschedule', pr); + context.log.info(pr, 'reschedule'); setTimeout(() => { lockPR('reschedule', -1, () => { return lockPR(String(pr.id), pr.number, async () => { @@ -1954,7 +1956,12 @@ async function initRepoContext(appContext, context, config) { if (lockMergePr && String(lockMergePr.number) === String(prNumber)) { lockMergePr = automergeQueue.shift(); context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`); - context.log(`merge lock: next ${fullName}`, lockMergePr); + + if (lockMergePr) { + context.log(lockMergePr, `merge lock: next ${fullName}`); + } else { + context.log(`merge lock: nothing next ${fullName}`); + } if (lockMergePr) { reschedule(context, lockMergePr); @@ -1969,12 +1976,12 @@ async function initRepoContext(appContext, context, config) { } }, pushAutomergeQueue: pr => { - context.log('merge lock: push queue', { + context.log({ repo: fullName, pr, lockMergePr, automergeQueue - }); + }, 'merge lock: push queue'); if (!automergeQueue.some(p => p.number === pr.number)) { automergeQueue.push(pr); @@ -2084,11 +2091,11 @@ const addStatusCheck = async function (pullRequest, context, { const hasPrCheck = (await context.octokit.checks.listForRef(context.repo({ ref: pullRequest.head.sha }))).data.check_runs.find(check => check.name === process.env.REVIEWFLOW_NAME); - context.log.debug('add status check', { + context.log.debug({ hasPrCheck, state, description - }); + }, 'add status check'); if (hasPrCheck) { await context.octokit.checks.create(context.repo({ @@ -2111,11 +2118,11 @@ const addStatusCheck = async function (pullRequest, context, { }; const updateStatusCheckFromLabels = (pullRequest, context, repoContext, labels = pullRequest.labels || [], previousSha) => { - context.log.debug('updateStatusCheckFromLabels', { + context.log.debug({ labels: labels.map(l => l === null || l === void 0 ? void 0 : l.name), hasNeedsReview: repoContext.hasNeedsReview(labels), hasApprovesReview: repoContext.hasApprovesReview(labels) - }); + }, 'updateStatusCheckFromLabels'); const createFailedStatusCheck = description => addStatusCheck(pullRequest, context, { state: 'failure', @@ -2167,11 +2174,11 @@ const updateReviewStatus = async (pullRequest, context, repoContext, reviewGroup add: labelsToAdd, remove: labelsToRemove }) => { - context.log.debug('updateReviewStatus', { + context.log.debug({ reviewGroup, labelsToAdd, labelsToRemove - }); + }, 'updateReviewStatus'); let prLabels = pullRequest.labels || []; if (!reviewGroup) return prLabels; const newLabelNames = new Set(prLabels.map(label => label.name)); @@ -2236,13 +2243,13 @@ const updateReviewStatus = async (pullRequest, context, repoContext, reviewGroup if (toAdd.size !== 0 || toDelete.size !== 0) { if (toDelete.size === 0 || toDelete.size < 4) { - context.log.debug('updateReviewStatus', { + context.log.debug({ reviewGroup, toAdd: [...toAdd], toDelete: [...toDelete], toAddNames: [...toAddNames], toDeleteNames: [...toDeleteNames] - }); + }, 'updateReviewStatus'); if (toAdd.size !== 0) { const result = await context.octokit.issues.addLabels(context.issue({ @@ -2259,21 +2266,21 @@ const updateReviewStatus = async (pullRequest, context, repoContext, reviewGroup })); prLabels = result.data; } catch (err) { - context.log.warn('error removing label', { + context.log.warn({ err: err === null || err === void 0 ? void 0 : err.message - }); + }, 'error removing label'); } } } } else { const newLabelNamesArray = [...newLabelNames]; - context.log.debug('updateReviewStatus', { + context.log.debug({ reviewGroup, toAdd: [...toAdd], toDelete: [...toDelete], oldLabels: prLabels.map(l => l.name), newLabelNames: newLabelNamesArray - }); + }, 'updateReviewStatus'); const result = await context.octokit.issues.setLabels(context.issue({ labels: newLabelNamesArray })); @@ -2856,11 +2863,11 @@ const updateBranch = async (pullRequest, context, login) => { }).catch(err => ({ error: err })); - context.log.info('update branch result', { + context.log.info({ status: result.status, sha: (_result$data = result.data) === null || _result$data === void 0 ? void 0 : _result$data.sha, error: result.error - }); + }, 'update branch result'); if (result.status === 204) { context.octokit.issues.createComment(context.repo({ diff --git a/dist/index-node10.cjs.js.map b/dist/index-node10.cjs.js.map index e9c202911..29213ba0f 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/auth/github.ts","../src/views/Layout.tsx","../src/app/auth.tsx","../src/app/home.tsx","../src/accountConfigs/christophehurpeau.ts","../src/accountConfigs/defaultConfig.ts","../src/accountConfigs/ornikar.ts","../src/accountConfigs/reviewflow.ts","../src/accountConfigs/index.ts","../src/dm/defaultDmSettings.ts","../src/dm/getUserDmSettings.ts","../src/events/account-handlers/actions/syncOrg.ts","../src/events/account-handlers/actions/syncTeams.ts","../src/app/org-settings.tsx","../src/app/repository.tsx","../src/events/account-handlers/actions/syncUser.ts","../src/app/user-settings.tsx","../src/appRouter.tsx","../src/utils/Excludes.ts","../src/context/getOrCreateAccount.ts","../src/context/utils.ts","../src/context/voidTeamSlack.ts","../src/context/initTeamSlack.ts","../src/context/accountContext.ts","../src/events/account-handlers/utils/handler.ts","../src/events/pr-handlers/actions/utils/body/prOptions.ts","../src/events/pr-handlers/actions/utils/body/parseBody.ts","../src/events/pr-handlers/actions/utils/hasLabelInPR.ts","../src/events/pr-handlers/actions/autoMergeIfPossible.ts","../src/events/pr-handlers/actions/utils/body/updateBody.ts","../src/events/pr-handlers/utils/reviewflowComment.ts","../src/events/pr-handlers/utils/createPullRequestContext.ts","../src/events/pr-handlers/utils/fetchPr.ts","../src/context/initRepoLabels.ts","../src/context/repoContext.ts","../src/events/repository-handlers/utils/createRepoHandler.ts","../src/events/pr-handlers/utils/createPullRequestHandler.ts","../src/events/pr-handlers/checkrunCompleted.ts","../src/events/pr-handlers/checksuiteCompleted.ts","../src/events/pr-handlers/actions/utils/createStatus.ts","../src/events/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/events/pr-handlers/actions/updateReviewStatus.ts","../src/events/pr-handlers/closed.ts","../src/slack/utils.ts","../src/events/pr-handlers/utils/createSlackMessageWithSecondaryBlock.ts","../src/events/pr-handlers/utils/getPullRequestFromPayload.ts","../src/events/pr-handlers/utils/getReviewersAndReviewStates.ts","../src/events/pr-handlers/utils/isBotUser.ts","../src/events/pr-handlers/utils/parseMentions.ts","../src/events/pr-handlers/utils/slackifyCommentBody.ts","../src/events/pr-handlers/commentCreated.ts","../src/events/pr-handlers/actions/updatePrCommentBody.ts","../src/events/pr-handlers/actions/utils/syncLabel.ts","../src/events/pr-handlers/actions/syncLabelsAfterCommentBodyEdited.ts","../src/events/pr-handlers/commentEditedOrDeleted.ts","../src/events/pr-handlers/actions/readCommitsAndUpdateInfos.ts","../src/events/pr-handlers/actions/updatePr.ts","../src/events/pr-handlers/actions/utils/cleanTitle.ts","../src/events/pr-handlers/actions/editOpenedPR.ts","../src/events/pr-handlers/edited.ts","../src/events/pr-handlers/actions/updateBranch.ts","../src/events/pr-handlers/labelsChanged.ts","../src/events/pr-handlers/actions/autoApproveAndAutoMerge.ts","../src/events/pr-handlers/actions/autoAssignPRToCreator.ts","../src/events/pr-handlers/opened.ts","../src/events/pr-handlers/reopened.ts","../src/events/pr-handlers/reviewDismissed.ts","../src/events/pr-handlers/reviewRequestRemoved.ts","../src/events/pr-handlers/reviewRequested.ts","../src/events/pr-handlers/reviewSubmitted.ts","../src/events/pr-handlers/status.ts","../src/events/pr-handlers/synchronize.ts","../src/events/repository-handlers/repoEdited.ts","../src/initApp.ts","../src/mongo.ts","../src/slack/home.ts","../src/index.ts"],"sourcesContent":["import { create } from 'simple-oauth2';\n\nif (!process.env.GITHUB_CLIENT_ID) {\n throw new Error('Missing env variable: GITHUB_CLIENT_ID');\n}\n\nif (!process.env.GITHUB_CLIENT_SECRET) {\n throw new Error('Missing env variable: GITHUB_CLIENT_SECRET');\n}\n\nexport const oauth2 = create({\n client: {\n id: process.env.GITHUB_CLIENT_ID,\n secret: process.env.GITHUB_CLIENT_SECRET,\n },\n auth: {\n tokenHost: 'https://github.com',\n tokenPath: '/login/oauth/access_token',\n authorizePath: '/login/oauth/authorize',\n },\n});\n","import type { ReactElement, ReactNode } from 'react';\nimport React from 'react';\n\ninterface LayoutProps {\n lang?: string;\n title?: string;\n children: ReactNode;\n}\n\nexport default function Layout({\n lang = 'en',\n title = process.env.REVIEWFLOW_NAME,\n children,\n}: LayoutProps): ReactElement {\n return (\n \n \n \n \n {title}\n \n \n \n \n
{children}
\n \n \n );\n}\n","import { promisify } from 'util';\nimport { Octokit } from '@octokit/rest';\nimport type { Router, Request, Response } from 'express';\nimport { sign, verify } from 'jsonwebtoken';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport * as githubAuth from '../auth/github';\nimport Layout from '../views/Layout';\n\nif (!process.env.AUTH_SECRET_KEY) {\n throw new Error('Missing env variable: AUTH_SECRET_KEY');\n}\n\nconst AUTH_SECRET_KEY: string = process.env.AUTH_SECRET_KEY;\n\nconst signPromisified: any = promisify(sign);\nconst verifyPromisified: any = promisify(verify);\n\nconst secure =\n !!process.env.SECURE_COOKIE && process.env.SECURE_COOKIE !== 'false';\n\nconst createRedirectUri = (req: Request): string => {\n const host = `http${secure ? 's' : ''}://${req.hostname}${\n req.hostname === 'localhost' ? `:${process.env.PORT}` : ''\n }`;\n return `${host}/app/login-response`;\n};\n\ninterface AuthInfo {\n id: number;\n login: string;\n accessToken: string;\n time: number;\n}\n\nconst readAuthCookie = (\n req: Request,\n strategy: string,\n): undefined | Promise => {\n const cookie = req.cookies[`auth_${strategy}`];\n if (!cookie) return;\n\n return verifyPromisified(cookie, AUTH_SECRET_KEY, {\n algorithm: 'HS512',\n audience: req.headers['user-agent'],\n });\n};\n\nconst getAuthInfoFromCookie = async (\n req: Request,\n res: Response,\n): Promise => {\n const strategy = 'gh'; // req.params.strategy\n const authInfo = await readAuthCookie(req, strategy);\n\n if (authInfo?.id) {\n return authInfo;\n }\n\n res.clearCookie(`auth_${strategy}`);\n return undefined;\n};\n\nfunction createApi(accessToken: string): Octokit {\n return new Octokit({ auth: accessToken });\n}\n\nexport const getUser = async (\n req: Request,\n res: Response,\n): Promise<{\n authInfo: AuthInfo;\n api: Octokit;\n} | null> => {\n const authInfo = await getAuthInfoFromCookie(req, res);\n if (!authInfo) {\n res.redirect('/app/login');\n return null;\n }\n\n const api = createApi(authInfo.accessToken);\n\n return {\n authInfo,\n api,\n };\n};\n\nexport default function auth(router: Router): void {\n router.get('/login', async (req: Request, res: Response) => {\n if (await getAuthInfoFromCookie(req, res)) {\n return res.redirect('/app');\n }\n\n // const state = await randomHex(8);\n // res.cookie(`auth_${strategy}_${state}`, strategy, {\n // maxAge: 10 * 60 * 1000,\n // httpOnly: true,\n // secure,\n // });\n\n const redirectUri = githubAuth.oauth2.authorizationCode.authorizeURL({\n redirect_uri: createRedirectUri(req),\n scope: 'read:user,repo',\n // state,\n // grant_type: options.grantType,\n // access_type: options.accessType,\n // login_hint: req.query.loginHint,\n // include_granted_scopes: options.includeGrantedScopes,\n });\n\n // console.log(redirectUri);\n\n res.redirect(redirectUri);\n });\n\n router.get('/login-response', async (req, res) => {\n if (req.query.error) {\n res.send(req.query.error_description);\n return;\n }\n\n const strategy = 'gh';\n const code: string = req.query.code as string;\n // const state = req.query.state;\n // const cookieName = `auth_${strategy}_${state}`;\n // const cookie = req.cookies && req.cookies[cookieName];\n // if (!cookie) {\n // // res.redirect(`/${strategy}/login`);\n // res.send(\n // 'No cookie for this state. Retry ?',\n // );\n // return;\n // }\n // res.clearCookie(cookieName);\n\n const result = await githubAuth.oauth2.authorizationCode.getToken({\n code,\n redirect_uri: createRedirectUri(req),\n });\n\n if (!result) {\n res.send(\n renderToStaticMarkup(\n \n
\n Could not get access token. Retry ?\n
\n
,\n ),\n );\n return;\n }\n\n const accessToken = result.access_token;\n const api = createApi(accessToken);\n const user = await api.users.getAuthenticated({});\n const id = user.data.id;\n const login = user.data.login;\n\n const authInfo: AuthInfo = { id, login, accessToken, time: Date.now() };\n const token = await signPromisified(authInfo, AUTH_SECRET_KEY, {\n algorithm: 'HS512',\n audience: req.headers['user-agent'],\n expiresIn: '10 days',\n });\n\n res.cookie(`auth_${strategy}`, token, {\n httpOnly: true,\n secure,\n });\n\n res.redirect('/app');\n });\n}\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function home(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{process.env.REVIEWFLOW_NAME}

\n
\n
\n

Choose your account

\n \n
\n
\n
\n
,\n ),\n );\n });\n}\n","import type { 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 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 'merge/skip-ci': {\n name: 'automerge/skip-ci',\n color: '#e1e8ed',\n },\n 'merge/update-branch': {\n name: ':arrows_counterclockwise: update branch',\n color: '#64DD17',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n\n /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n color: '#ef7934',\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 type { Config } from './types';\n\nconst config: Config = {\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 groups: {},\n waitForGroups: {},\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 /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n color: '#ef7934',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n },\n },\n};\n\nexport default config;\n","import type { Config } from './types';\n\nconst config: Config<'dev' | 'design', 'ops' | 'frontends' | 'backends'> = {\n autoAssignToCreator: true,\n trimTitle: true,\n ignoreRepoPattern: '(infra-.*|devenv)',\n requiresReviewRequest: true,\n autoMergeRenovateWithSkipCi: 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 bot: false,\n regExp: /\\s([A-Z][\\dA-Z]+-(\\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 botUsers: ['michael-robot'],\n\n groups: {\n dev: {\n /* ops */\n JulienBreux: `julien.breux${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n TheR3aLp3nGuinJM: `jean-michel${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n\n /* back */\n abarreir: `alexandre${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 machartier: `marie-anne${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n\n /* front */\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n vlbr: `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'budet-b': `benjamin.budet${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n mdcarter: `maxime.dehaye${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n ChibiBlasphem: `christopher${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n PSniezak: `paul.sniezak${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 Lenamari: `lena${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n loicleser: null,\n },\n },\n\n teams: {\n ops: {\n logins: ['JulienBreux', 'Alan-pad', 'CamilSadiki', 'busser'],\n labels: ['teams/ops'],\n },\n\n backends: {\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n 'Radyum',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'vlbr',\n 'budet-b',\n 'mdcarter',\n 'ChibiBlasphem',\n 'PSniezak',\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 'teams/ops': {\n name: 'ops',\n color: '#003b55',\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 'merge/skip-ci': {\n name: 'automerge/skip-ci',\n color: '#e1e8ed',\n },\n 'merge/update-branch': {\n name: ':arrows_counterclockwise: update branch',\n color: '#e1e8ed',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n\n /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n description: 'This issue or pull request will need a new major version',\n color: '#FF6F00',\n },\n duplicate: {\n name: 'duplicate',\n description: 'This issue or pull request already exists',\n color: '#ECEFF1',\n },\n documentation: {\n name: 'documentation',\n description: 'Improvements or additions to documentation',\n color: '#7FCEFF',\n },\n rfc: {\n name: 'RFC',\n description: 'Request For Comments',\n color: '#FFD3B2',\n },\n bug: {\n name: 'bug',\n description: \"Something isn't working\",\n color: '#FF3D00',\n },\n enhancement: {\n name: 'enhancement',\n description: 'New feature or request',\n color: '#7FCEFF',\n },\n 'help-wanted': {\n name: 'help wanted',\n description: 'Extra attention is needed',\n color: '#B1EE8B',\n },\n question: {\n name: 'question',\n description: 'Further information is requested',\n color: '#F860A4',\n },\n wontfix: {\n name: 'wontfix',\n description: 'This will not be worked on',\n color: '#ECEFF1',\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 chrisconfig from './christophehurpeau';\nimport type { Config } from './types';\n\nconst config: Config<'dev', never> = {\n ...chrisconfig,\n requiresReviewRequest: true,\n groups: {\n dev: {\n christophehurpeau: 'christophe@hurpeau.com',\n 'chris-reviewflow': 'christophe.hurpeau+reviewflow@gmail.com',\n },\n },\n};\nexport default config;\n","import christophehurpeau from './christophehurpeau';\nimport defaultConfig from './defaultConfig';\nimport ornikar from './ornikar';\nimport reviewflow from './reviewflow';\nimport type { Config as ConfigType } from './types';\n\nexport type Config<\n GroupNames extends string = any,\n TeamNames extends string = any\n> = ConfigType;\n\nexport const accountConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n reviewflow,\n};\n\nexport { defaultConfig };\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","import type { MessageCategory } from './MessageCategory';\n\nexport const defaultDmSettings: Record = {\n 'pr-review': true,\n 'pr-review-follow': true,\n 'pr-comment': true,\n 'pr-comment-bots': true,\n 'pr-comment-follow': true,\n 'pr-comment-follow-bots': false,\n 'pr-comment-mention': true,\n 'pr-comment-thread': true,\n 'pr-merge-conflicts': true,\n 'issue-comment-mention': true,\n};\n","import { accountConfigs, defaultConfig } from '../accountConfigs';\nimport type { MongoStores } from '../mongo';\nimport type { MessageCategory } from './MessageCategory';\nimport { defaultDmSettings } from './defaultDmSettings';\n\nexport type UserDmSettings = Record;\nconst cache = new Map>();\n\nconst getDefaultDmSettings = (org: string): UserDmSettings => {\n const accountConfig = accountConfigs[org] || defaultConfig;\n return accountConfig.defaultDmSettings\n ? { ...defaultDmSettings, ...accountConfig.defaultDmSettings }\n : defaultDmSettings;\n};\n\nexport const updateCache = (\n org: string,\n userId: number,\n newSettings: Partial,\n): void => {\n let orgCache = cache.get(org);\n if (!orgCache) {\n orgCache = new Map();\n cache.set(org, orgCache);\n }\n orgCache.set(userId, { ...getDefaultDmSettings(org), ...newSettings });\n};\n\nexport const getUserDmSettings = async (\n mongoStores: MongoStores,\n org: string,\n orgId: number,\n userId: number,\n): Promise => {\n const orgDefaultDmSettings = getDefaultDmSettings(org);\n\n const userDmSettingsConfig = await mongoStores.userDmSettings.findOne({\n orgId,\n userId,\n });\n\n const config = userDmSettingsConfig\n ? {\n ...orgDefaultDmSettings,\n ...userDmSettingsConfig.settings,\n }\n : orgDefaultDmSettings;\n\n updateCache(org, userId, config);\n return config;\n};\n","import type { Octokit } from '@octokit/core';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { MongoStores, Org } from '../../../mongo';\n\ninterface OrgInfo {\n login: string;\n id: number;\n}\n\nexport const syncOrg = async (\n mongoStores: MongoStores,\n github: Octokit,\n installationId: number,\n org: OrgInfo,\n): Promise => {\n const orgInStore = await mongoStores.orgs.upsertOne({\n _id: org.id as any, // TODO _id is number\n login: org.login,\n installationId,\n });\n\n const orgEmbed = { id: org.id, login: org.login };\n\n const memberIds: number[] = [];\n\n await Promise.all(\n await github.paginate(\n github.orgs.listMembers.endpoint.merge({\n org: org.login,\n }),\n ({\n data,\n }: RestEndpointMethodTypes['orgs']['listMembers']['response']) => {\n return Promise.all(\n data.map(async (member) => {\n memberIds.push(member.id);\n return Promise.all([\n mongoStores.orgMembers.upsertOne({\n _id: `${org.id}_${member.id}`,\n org: orgEmbed,\n user: {\n id: member.id,\n login: member.login,\n },\n }),\n mongoStores.users.upsertOne({\n _id: member.id as any,\n login: member.login,\n type: member.type,\n }),\n ]);\n }),\n );\n },\n ),\n );\n\n await mongoStores.orgMembers.deleteMany({\n 'org.id': org.id,\n 'user.id': { $not: { $in: memberIds } },\n });\n\n return orgInStore;\n};\n","import type { Octokit } from '@octokit/core';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { MongoStores } from '../../../mongo';\n\nexport const syncTeams = async (\n mongoStores: MongoStores,\n github: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const orgEmbed = { id: org.id, login: org.login };\n\n const teamIds: number[] = [];\n\n await Promise.all(\n await github.paginate(\n github.teams.list.endpoint.merge({\n org: org.login,\n }),\n ({ data }: RestEndpointMethodTypes['teams']['list']['response']) => {\n return Promise.all(\n data.map((team) => {\n teamIds.push(team.id);\n return mongoStores.orgTeams.upsertOne({\n _id: team.id,\n org: orgEmbed,\n name: team.name,\n slug: team.slug,\n description: team.description,\n });\n }),\n );\n },\n ),\n );\n\n await mongoStores.orgTeams.deleteMany({\n 'org.id': org.id,\n _id: { $not: { $in: teamIds } },\n });\n};\n","import bodyParser from 'body-parser';\nimport type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { accountConfigs } from '../accountConfigs';\nimport type { MessageCategory } from '../dm/MessageCategory';\nimport { getUserDmSettings, updateCache } from '../dm/getUserDmSettings';\nimport { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeams } from '../events/account-handlers/actions/syncTeams';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nconst dmMessages: Record = {\n 'pr-review': 'You are assigned to a review, someone reviewed your PR',\n 'pr-review-follow': \"Someone reviewed a PR you're also reviewing\",\n 'pr-comment': 'Someone commented on your PR',\n 'pr-comment-bots': 'A bot commented on your PR',\n 'pr-comment-follow': \"Someone commented on a PR you're reviewing\",\n 'pr-comment-follow-bots': \"A bot commented on a PR you're reviewing\",\n 'pr-comment-mention': 'Someone mentioned you in a PR',\n 'pr-comment-thread': \"Someone replied to a discussion you're in\",\n 'pr-merge-conflicts': 'Your PR has a merge conflict (not implemented)',\n 'issue-comment-mention':\n 'Someone mentioned you in an issue (not implemented)',\n};\n\nexport default function orgSettings(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/org/:org/force-sync', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n const o = await mongoStores.orgs.findByKey(org.id);\n if (!o) return res.redirect('/app');\n\n await syncOrg(mongoStores, user.api, o.installationId as number, org);\n await syncTeams(mongoStores, user.api, org);\n\n res.redirect(`/app/org/${req.params.org}`);\n });\n\n router.get('/org/:org', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n const installation = await octokitApp.apps\n .getOrgInstallation({ org: org.login })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!installation) {\n return res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed for this user. Go to \"}\n \n Github Configuration\n {' '}\n to install it.\n
\n
,\n ),\n );\n }\n\n const accountConfig = accountConfigs[org.login];\n const userDmSettings = await getUserDmSettings(\n mongoStores,\n org.login,\n org.id,\n user.authInfo.id,\n );\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{process.env.REVIEWFLOW_NAME}

\n
\n

{org.login}

\n Switch account\n
\n\n
\n
\n

Information

\n {!accountConfig\n ? 'Default config is used: https://github.com/christophehurpeau/reviewflow/blob/master/src/accountConfigs/defaultConfig.ts'\n : `Custom config: https://github.com/christophehurpeau/reviewflow/blob/master/src/accountConfigs/${org.login}.ts`}\n
\n
\n

My DM Settings

\n {Object.entries(dmMessages).map(([key, name]) => (\n
\n \n
\n ))}\n
\n
\n
\n
,\n ),\n );\n });\n\n router.patch('/org/:org', bodyParser.json(), async (req, res) => {\n if (!req.body) {\n res.status(400).send('not ok');\n return;\n }\n\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n (await mongoStores.userDmSettings.collection).updateOne(\n {\n _id: `${org.id}_${user.authInfo.id}`,\n },\n {\n $set: {\n [`settings.${req.body.key}`]: req.body.value,\n updated: new Date(),\n },\n $setOnInsert: {\n orgId: org.id,\n userId: user.authInfo.id,\n created: new Date(),\n },\n },\n { upsert: true },\n );\n\n const userDmSettingsConfig = await mongoStores.userDmSettings.findOne({\n orgId: org.id,\n userId: user.authInfo.id,\n });\n\n if (userDmSettingsConfig) {\n updateCache(org.login, user.authInfo.id, userDmSettingsConfig.settings);\n }\n\n res.send('ok');\n });\n}\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function repository(\n router: Router,\n octokitApp: InstanceType,\n): void {\n router.get('/repositories', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n const { data } = await user.api.repos.listForAuthenticatedUser({\n per_page: 100,\n });\n\n res.send(\n renderToStaticMarkup(\n \n
\n

Your repositories

\n \n\n {data.length === 100 && (\n
We currently have a limit to 100 repositories
\n )}\n
\n
,\n ),\n );\n });\n\n router.get('/repository/:owner/:repository', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n const { data } = await user.api.repos.get({\n owner: req.params.owner,\n repo: req.params.repository,\n });\n\n if (!data) {\n res.status(404).send(\n renderToStaticMarkup(\n \n
repo not found
\n
,\n ),\n );\n return;\n }\n\n if (!data.permissions || !data.permissions.admin) {\n res.status(401).send(\n renderToStaticMarkup(\n \n
\n not authorized to see this repo, you need to have admin permission\n
\n
,\n ),\n );\n return;\n }\n\n const { data: data2 } = await octokitApp.apps\n .getRepoInstallation({\n owner: req.params.owner,\n repo: req.params.repository,\n })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!data2) {\n res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed on this repo. Go to \"}\n \n Github Configuration\n {' '}\n to add it.\n
\n
,\n ),\n );\n return;\n }\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{req.params.repository}

\n
\n
,\n ),\n );\n });\n}\n","import type { Octokit } from '@octokit/core';\nimport type { MongoStores, User } from '../../../mongo';\n\ninterface UserInfo {\n login: string;\n id: number;\n}\n\nexport const syncUser = async (\n mongoStores: MongoStores,\n github: Octokit,\n installationId: number,\n userInfo: UserInfo,\n): Promise => {\n const user = await mongoStores.users.upsertOne({\n _id: userInfo.id,\n login: userInfo.login,\n type: 'User',\n installationId,\n });\n\n return user;\n};\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function userSettings(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/user/force-sync', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n // const { data: installation } = await api.apps\n // .getUserInstallation({\n // username: user.authInfo.login,\n // })\n // .catch((err) => {\n // return { status: err.status, data: undefined };\n // });\n\n // console.log(installation);\n\n const u = await mongoStores.users.findByKey(user.authInfo.id);\n if (!u || !u.installationId) return res.redirect('/app');\n\n await syncUser(\n mongoStores,\n user.api,\n u.installationId as number,\n user.authInfo,\n );\n\n res.redirect('/app/user');\n });\n\n router.get('/user', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const { data: installation } = await octokitApp.apps\n .getUserInstallation({\n username: user.authInfo.login,\n })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!installation) {\n return res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed for this user. Go to \"}\n \n Github Configuration\n {' '}\n to install it.\n
\n
,\n ),\n );\n }\n\n return res.send(\n renderToStaticMarkup(\n \n
{process.env.REVIEWFLOW_NAME} is installed for this user
\n
,\n ),\n );\n });\n}\n","import cookieParser from 'cookie-parser';\nimport type { Probot, run } from 'probot';\nimport auth from './app/auth';\nimport home from './app/home';\nimport orgSettings from './app/org-settings';\nimport repository from './app/repository';\nimport userSettings from './app/user-settings';\nimport type { AppContext } from './context/AppContext';\n\nexport default async function appRouter(\n app: Probot,\n getRouter: Parameters<\n // eslint-disable-next-line @typescript-eslint/ban-types\n Extract[0], Function>\n >[0]['getRouter'],\n { mongoStores }: AppContext,\n): Promise {\n const router = getRouter('/app');\n const octokitApp = await app.auth();\n\n router.use(cookieParser());\n\n auth(router);\n repository(router, octokitApp);\n home(router, octokitApp, mongoStores);\n orgSettings(router, octokitApp, mongoStores);\n userSettings(router, octokitApp, mongoStores);\n}\n","export const ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const ExcludesNullish = (((res: any) => res !== null) as any) as (\n x: T | null,\n) => x is T;\n","import type { Octokit } from '@octokit/core';\nimport { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeams } from '../events/account-handlers/actions/syncTeams';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { Org, User } from '../mongo';\nimport type { AppContext } from './AppContext';\n\nexport interface AccountInfo {\n id: number;\n login: string;\n type: string;\n}\n\nexport const getOrCreateAccount = async (\n { mongoStores }: AppContext,\n github: Octokit,\n installationId: number,\n accountInfo: AccountInfo,\n): Promise => {\n switch (accountInfo.type) {\n case 'Organization': {\n let org = await mongoStores.orgs.findByKey(accountInfo.id);\n if (org?.installationId) return org;\n\n // TODO diff org vs user...\n org = await syncOrg(mongoStores, github, installationId, accountInfo);\n await syncTeams(mongoStores, github, accountInfo);\n return org;\n }\n\n case 'User': {\n let user = await mongoStores.users.findByKey(accountInfo.id);\n if (user?.installationId) return user;\n\n user = await syncUser(mongoStores, github, installationId, accountInfo);\n return user;\n }\n\n default:\n throw new Error(`Account type not supported ${accountInfo.type}`);\n }\n};\n","import createEmojiRegex from 'emoji-regex';\n\nexport const getKeys = >(\n o: T,\n): (keyof T)[] => Object.keys(o) as (keyof T)[];\n\nconst emojiRegex = createEmojiRegex();\n\nexport const getEmojiFromRepoDescription = (\n description: string | null,\n): string => {\n if (!description) return '';\n if (description.startsWith(':')) {\n const [, emoji] = /^(:\\w+:)/.exec(description) || [];\n return emoji || '';\n }\n const match = emojiRegex.exec(description);\n if (match && description.startsWith(match[0])) return match[0];\n return '';\n};\n","import type { TeamSlack } from './TeamSlack';\n\nexport const voidTeamSlack = (): TeamSlack => ({\n mention: (): string => '',\n postMessage: (): Promise => Promise.resolve(null),\n updateMessage: (): Promise => Promise.resolve(null),\n deleteMessage: (): Promise => Promise.resolve(undefined),\n addReaction: (): Promise => Promise.resolve(undefined),\n updateHome: (): void => undefined,\n});\n","import { WebClient } from '@slack/web-api';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport type { MessageCategory } from '../dm/MessageCategory';\nimport { getUserDmSettings } from '../dm/getUserDmSettings';\nimport type { Org, User } from '../mongo';\nimport type { AppContext } from './AppContext';\nimport type { SlackMessage } from './SlackMessage';\nimport type { TeamSlack, PostSlackMessageResult } from './TeamSlack';\nimport { getKeys } from './utils';\nimport { voidTeamSlack } from './voidTeamSlack';\n\nexport type { TeamSlack };\n\nexport const initTeamSlack = async (\n { mongoStores, slackHome }: AppContext,\n context: Context,\n config: Config,\n account: Org | User,\n): Promise => {\n const owner = context.payload.repository.owner;\n const slackToken = 'slackToken' in account && account.slackToken;\n\n if (!slackToken) {\n return voidTeamSlack();\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 slackEmails = Object.values(githubLoginToSlackEmail);\n const slackClient = new WebClient(slackToken);\n\n const membersInDb = await mongoStores.orgMembers.findAll({\n 'org.id': account._id,\n });\n\n const members: [string, { member: any; im: any }][] = [];\n const foundEmailMembers: string[] = [];\n\n Object.entries(githubLoginToSlackEmail).forEach(([login, email]) => {\n const member = membersInDb.find((m) => m.user.login === login);\n if (member?.slack?.id) {\n foundEmailMembers.push(email);\n members.push([email, { member: { id: member.slack.id }, im: undefined }]);\n }\n });\n\n if (foundEmailMembers.length !== slackEmails.length) {\n const missingEmails = slackEmails.filter(\n (email) => !foundEmailMembers.includes(email),\n );\n\n const memberEmailToMemberId = new Map(\n Object.entries(githubLoginToSlackEmail).map(([login, email]) => [\n email,\n membersInDb.find((m) => m.user.login === login)?._id as any,\n ]),\n );\n\n await slackClient.paginate('users.list', {}, (page: any) => {\n page.members.forEach((member: any) => {\n const email = member.profile?.email;\n if (email && missingEmails.includes(email)) {\n members.push([email, { member, im: undefined }]);\n if (memberEmailToMemberId.has(email)) {\n mongoStores.orgMembers.partialUpdateMany(\n {\n _id: memberEmailToMemberId.get(email),\n },\n { $set: { slack: { id: member.id } } },\n );\n }\n }\n });\n return false;\n });\n }\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.conversations.open({\n users: user.member.id,\n });\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): string => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (\n category: MessageCategory,\n githubId: number,\n githubLogin: string,\n message: SlackMessage,\n ): Promise => {\n context.log.debug('slack: post message', {\n category,\n githubLogin,\n message,\n });\n if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null;\n\n const userDmSettings = await getUserDmSettings(\n mongoStores,\n owner.login,\n owner.id,\n githubId,\n );\n\n if (!userDmSettings[category]) return null;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return null;\n const result = await slackClient.chat.postMessage({\n username: process.env.REVIEWFLOW_NAME,\n channel: user.im.id,\n text: message.text,\n blocks: message.blocks,\n attachments: message.secondaryBlocks\n ? [{ blocks: message.secondaryBlocks }]\n : undefined,\n thread_ts: message.ts,\n });\n if (!result.ok) return null;\n return { ts: result.ts as string, channel: result.channel as string };\n },\n updateMessage: async (\n ts: string,\n channel: string,\n message: SlackMessage,\n ): Promise => {\n context.log.debug('slack: update message', { ts, channel, message });\n if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null;\n\n const result = await slackClient.chat.update({\n ts,\n channel,\n text: message.text,\n blocks: message.blocks,\n attachments: message.secondaryBlocks\n ? [{ blocks: message.secondaryBlocks }]\n : undefined,\n });\n if (!result.ok) return null;\n return { ts: result.ts as string, channel: result.channel as string };\n },\n deleteMessage: async (ts: string, channel: string): Promise => {\n context.log.debug('slack: delete message', { ts, channel });\n await slackClient.chat.delete({\n ts,\n channel,\n });\n },\n addReaction: async (\n ts: string,\n channel: string,\n name: string,\n ): Promise => {\n context.log.debug('slack: add reaction', { ts, channel, name });\n await slackClient.reactions.add({\n timestamp: ts,\n channel,\n name,\n });\n },\n\n updateHome: (githubLogin: string): void => {\n context.log.debug('update slack home', { githubLogin });\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.member) return;\n\n slackHome.scheduleUpdateMember(context.octokit, slackClient, {\n user: { id: null, login: githubLogin },\n org: { id: account._id, login: account.login },\n slack: { id: user.member.id },\n } as any);\n },\n };\n};\n","import { Lock } from 'lock';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport type { Org, User, AccountEmbed, AccountType } from '../mongo';\nimport { ExcludesFalsy } from '../utils/Excludes';\nimport type { AppContext } from './AppContext';\nimport type { AccountInfo } from './getOrCreateAccount';\nimport { getOrCreateAccount } from './getOrCreateAccount';\nimport type { TeamSlack } from './initTeamSlack';\nimport { initTeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface AccountContext<\n GroupNames extends string = any,\n TeamNames extends string = any\n> {\n config: Config;\n accountType: AccountType;\n account: Org | User;\n accountEmbed: AccountEmbed;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => GroupNames | undefined;\n getReviewerGroups: (githubLogins: string[]) => GroupNames[];\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\n approveShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n\n lock: (callback: () => Promise | void) => Promise;\n}\n\nconst initAccountContext = async (\n appContext: AppContext,\n context: Context,\n config: Config,\n accountInfo: AccountInfo,\n): Promise => {\n const account = await getOrCreateAccount(\n appContext,\n context.octokit,\n context.payload.installation.id,\n accountInfo,\n );\n const slackPromise = initTeamSlack(appContext, context, config, account);\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((teamName) => {\n (config.teams as NonNullable)[teamName].logins.forEach(\n (login) => {\n const teams = githubLoginToTeams.get(login);\n if (teams) {\n teams.push(teamName);\n } else {\n githubLoginToTeams.set(login, [teamName]);\n }\n },\n );\n });\n\n const getReviewerGroups = (githubLogins: string[]): string[] => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ];\n\n const lock = Lock();\n\n return {\n config,\n account,\n accountEmbed: {\n id: accountInfo.id,\n login: accountInfo.login,\n type: accountInfo.type as AccountType,\n },\n accountType: accountInfo.type as AccountType,\n lock: (callback: () => Promise | void): Promise => {\n return new Promise((resolve, reject) => {\n const logInfos = { account: accountInfo.login };\n context.log.info('lock: try to lock account', logInfos);\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n lock('_', async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n context.log.info('lock: lock account acquired', logInfos);\n try {\n await callback();\n } catch (err) {\n context.log.info('lock: release account (with error)', logInfos);\n release();\n reject(err);\n return;\n }\n context.log.info('lock: release account', logInfos);\n release();\n resolve();\n });\n });\n },\n getReviewerGroup: (githubLogin): string | undefined =>\n githubLoginToGroup.get(githubLogin),\n getReviewerGroups,\n\n getTeamsForLogin: (githubLogin): string[] =>\n githubLoginToTeams.get(githubLogin) || [],\n\n approveShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ): boolean => {\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 accountContextsPromise = new Map();\nconst accountContexts = new Map();\n\nexport const obtainAccountContext = (\n appContext: AppContext,\n context: Context,\n config: Config,\n accountInfo: AccountInfo,\n): Promise => {\n const existingAccountContext = accountContexts.get(accountInfo.login);\n if (existingAccountContext) return existingAccountContext;\n\n const existingPromise = accountContextsPromise.get(accountInfo.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initAccountContext(appContext, context, config, accountInfo);\n accountContextsPromise.set(accountInfo.login, promise);\n\n return promise.then((accountContext) => {\n accountContextsPromise.delete(accountInfo.login);\n accountContexts.set(accountInfo.login, accountContext);\n return accountContext;\n });\n};\n","import type { Context } from 'probot';\nimport { accountConfigs, defaultConfig } from '../../../accountConfigs';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { AccountContext } from '../../../context/accountContext';\nimport { obtainAccountContext } from '../../../context/accountContext';\n\ntype CallbackContextAndAccountContext = (\n context: Context,\n accountContext: AccountContext,\n) => void | Promise;\n\nexport const handlerOrgChange = async <\n T extends { organization?: { id: number; login: string } }\n>(\n appContext: AppContext,\n context: Context,\n callback: CallbackContextAndAccountContext,\n): Promise => {\n const org = context.payload.organization;\n if (!org) return;\n const config = accountConfigs[org.login] || defaultConfig;\n const accountContext = await obtainAccountContext(\n appContext,\n context,\n config,\n { ...org, type: 'Organization' },\n );\n if (!accountContext) return;\n\n return accountContext.lock(async () => {\n await callback(context, accountContext);\n });\n};\n\nexport const createHandlerOrgChange = <\n T extends { organization?: { id: number; login: string } }\n>(\n appContext: AppContext,\n callback: CallbackContextAndAccountContext,\n) => (context: Context) => {\n return handlerOrgChange(appContext, context, callback);\n};\n","export type OptionsKeys =\n | 'featureBranch'\n | 'autoMergeWithSkipCi'\n | 'autoMerge'\n | 'deleteAfterMerge';\n\nexport type Options = Record;\n\nexport const options: OptionsKeys[] = [\n 'featureBranch',\n 'autoMergeWithSkipCi',\n 'autoMerge',\n 'deleteAfterMerge',\n];\nexport const optionsRegexps: {\n key: OptionsKeys;\n regexp: RegExp;\n}[] = options.map((option) => ({\n key: option,\n regexp: new RegExp(`\\\\[([ xX]?)]\\\\s*`),\n}));\n\nexport const optionsLabels: { key: OptionsKeys; label: string }[] = [\n { key: 'featureBranch', label: 'This PR is a feature branch' },\n {\n key: 'autoMergeWithSkipCi',\n label: 'Add `[skip ci]` on merge commit',\n },\n {\n key: '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 key: 'deleteAfterMerge',\n label: 'Automatic branch delete after this PR is merged',\n },\n];\n","import { optionsRegexps } from './prOptions';\nimport type { Options } from './prOptions';\n\nexport type { Options } from './prOptions';\n\nexport const parseOptions = (\n content: string,\n defaultOptions: Options,\n): Options => {\n return optionsRegexps.reduce((acc, { key, regexp }) => {\n const match = regexp.exec(content);\n acc[key] = !match\n ? defaultOptions[key] || false\n : match[1] === 'x' || match[1] === 'X';\n return acc;\n }, {}) as Options;\n};\n\nexport const parseCommitNotes = (content: string): string => {\n const commitNotes = content.replace(\n /^.*#### Commits Notes:(.*)#### Options:.*$/s,\n '$1',\n );\n\n if (commitNotes === content) {\n return '';\n } else {\n return commitNotes.trim();\n }\n};\n\ninterface ParsedBody {\n options: Options;\n commitNotes: string;\n}\n\nexport const parseBody = (\n content: string,\n defaultOptions: Options,\n): ParsedBody => {\n return {\n options: parseOptions(content, defaultOptions),\n commitNotes: parseCommitNotes(content),\n };\n};\n","import type { PullRequestLabels } from 'events/pr-handlers/utils/PullRequestData';\nimport type { LabelResponse } from '../../../../context/initRepoLabels';\n\nexport default function hasLabelInPR(\n prLabels: PullRequestLabels,\n label: LabelResponse,\n): boolean {\n if (!label) return false;\n return prLabels.some((l): boolean => l.id === label.id);\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { AutomergeLog } from 'mongo';\nimport type {\n PullRequestData,\n PullRequestFromRestEndpoint,\n PullRequestLabels,\n} from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { parseBody } from './utils/body/parseBody';\nimport hasLabelInPR from './utils/hasLabelInPR';\n\nconst hasFailedStatusOrChecks = async (\n pr: PullRequestData,\n context: Context,\n): Promise => {\n const checks = await context.octokit.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.octokit.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 pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n prLabels: PullRequestLabels = pullRequest.labels,\n): Promise => {\n if (reviewflowPrContext === null) return false;\n\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n\n if (!hasLabelInPR(prLabels, autoMergeLabel)) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'no automerge label',\n );\n return false;\n }\n\n const isRenovatePr = pullRequest.head.ref.startsWith('renovate/');\n\n const createMergeLockPrFromPr = () => ({\n id: pullRequest.id,\n number: pullRequest.number,\n branch: pullRequest.head.ref,\n });\n\n if (pullRequest.state !== 'open') {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr is not opened',\n );\n }\n\n const addLog = (\n type: AutomergeLog['type'],\n action: AutomergeLog['action'],\n ): void => {\n const repoFullName = pullRequest.head.repo.full_name;\n context.log.info(`automerge: ${repoFullName}#${pullRequest.id} ${type}`);\n repoContext.appContext.mongoStores.automergeLogs.insertOne({\n account: repoContext.accountEmbed,\n repoFullName,\n pr: {\n id: pullRequest.id,\n number: pullRequest.number,\n isRenovate: isRenovatePr,\n mergeableState: pullRequest.mergeable_state,\n },\n type,\n action,\n });\n };\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'blocking labels',\n );\n return false;\n }\n\n if (pullRequest.requested_reviewers.length > 0) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested reviewers',\n );\n return false;\n }\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (lockedPr && String(lockedPr.number) !== String(pullRequest.number)) {\n context.log.info('automerge not possible: locked pr', {\n prId: pullRequest.id,\n prNumber: pullRequest.number,\n });\n repoContext.pushAutomergeQueue(createMergeLockPrFromPr());\n return false;\n }\n\n repoContext.addMergeLockPr(createMergeLockPrFromPr());\n\n if (pullRequest.mergeable == null) {\n const prResult = await context.octokit.pulls.get(\n context.repo({\n pull_number: pullRequest.number,\n }),\n );\n pullRequest = prResult.data;\n }\n\n if (pullRequest.merged) {\n addLog('already merged', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr already merged',\n );\n return false;\n }\n\n context.log.info(\n `automerge?: ${pullRequest.id}, #${pullRequest.number}, mergeable=${pullRequest.mergeable} state=${pullRequest.mergeable_state}`,\n );\n\n // https://github.com/octokit/octokit.net/issues/1763\n if (\n !(\n pullRequest.mergeable_state === 'clean' ||\n pullRequest.mergeable_state === 'has_hooks' ||\n pullRequest.mergeable_state === 'unstable'\n )\n ) {\n if (\n !pullRequest.mergeable_state ||\n pullRequest.mergeable_state === 'unknown'\n ) {\n addLog('unknown mergeable_state', 'reschedule');\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n\n if (isRenovatePr) {\n if (\n pullRequest.mergeable_state === 'behind' ||\n pullRequest.mergeable_state === 'dirty'\n ) {\n addLog('rebase-renovate', 'wait');\n\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n if (pullRequest.body.includes('')) {\n if (pullRequest.body.includes('[x] ')) {\n return false;\n }\n\n const renovateRebaseBody = pullRequest.body.replace(\n '[ ] ',\n '[x] ',\n );\n await context.octokit.issues.update(\n context.repo({\n issue_number: pullRequest.number,\n body: renovateRebaseBody,\n }),\n );\n } else if (!pullRequest.title.startsWith('rebase!')) {\n await context.octokit.issues.update(\n context.repo({\n issue_number: pullRequest.number,\n title: `rebase!${pullRequest.title}`,\n }),\n );\n }\n return false;\n }\n\n if (await hasFailedStatusOrChecks(pullRequest, context)) {\n addLog('failed status or checks', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'failed status or checks',\n );\n return false;\n } else if (pullRequest.mergeable_state === 'blocked') {\n addLog('blocked mergeable_state', 'wait');\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=${pullRequest.mergeable_state}`,\n );\n return false;\n }\n\n if (pullRequest.mergeable_state === 'blocked') {\n if (await hasFailedStatusOrChecks(pullRequest, context)) {\n addLog('failed status or checks', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'failed status or checks',\n );\n return false;\n } else {\n addLog('blocked mergeable_state', 'wait');\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n }\n\n if (pullRequest.mergeable_state === 'behind') {\n addLog('behind mergeable_state', 'update branch');\n context.log.info('automerge not possible: update branch', {\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n });\n\n await context.octokit.repos.merge({\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n head: pullRequest.base.ref,\n base: pullRequest.head.ref,\n });\n\n return false;\n }\n\n addLog('not mergeable', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n `mergeable_state=${pullRequest.mergeable_state}`,\n );\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${pullRequest.mergeable_state}`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pullRequest.number}`);\n\n const parsedBody = parseBody(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n );\n const options = parsedBody?.options || repoContext.config.prDefaultOptions;\n\n const mergeResult = await context.octokit.pulls.merge({\n merge_method: options.featureBranch ? 'merge' : 'squash',\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n pull_number: pullRequest.number,\n commit_title: options.featureBranch\n ? undefined\n : `${pullRequest.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pullRequest.number})`,\n commit_message: options.featureBranch ? undefined : '', // TODO add BC\n });\n context.log.debug('merge result:', mergeResult.data);\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'merged',\n );\n return Boolean('merged' in mergeResult.data && 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 type { StatusInfo } from 'accountConfigs/types';\nimport type { Options } from './parseBody';\nimport { parseOptions } from './parseBody';\nimport { optionsLabels } from './prOptions';\n\nexport const defaultCommentBody = 'This will be auto filled by reviewflow.';\n\nconst toMarkdownOptions = (options: Options) => {\n return optionsLabels\n .map(\n ({ key, label }) =>\n `- [${options[key] ? 'x' : ' '}] ${label}`,\n )\n .join('\\n');\n};\n\nconst toMarkdownInfos = (infos: StatusInfo[]): string => {\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 commentBody: string;\n options?: Options;\n}\n\nconst getReplacement = (infos?: StatusInfo[]): string => {\n if (!infos) return '$1$2';\n return infos.length > 0\n ? `#### Infos:\\n\\n${toMarkdownInfos(infos)}\\n\\n$2`\n : '$2';\n};\n\nconst updateOptions = (\n options: Options,\n optionsToUpdate?: Partial,\n): Options => {\n if (!optionsToUpdate) return options;\n return { ...options, ...optionsToUpdate };\n};\n\nconst internalUpdateBodyOptionsAndInfos = (\n body: string,\n options: Options,\n infos?: StatusInfo[],\n): string => {\n const infosAndCommitNotesParagraph = body.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*)?(#### Commits Notes:.*)?#### Options:)?.*$/s,\n getReplacement(infos),\n );\n\n return `${infosAndCommitNotesParagraph}#### Options:\\n${toMarkdownOptions(\n options,\n )}`;\n};\n\nexport const createCommentBody = (\n defaultOptions: Options,\n infos?: StatusInfo[],\n): string => {\n return internalUpdateBodyOptionsAndInfos('', defaultOptions, infos);\n};\n\nexport const updateCommentOptions = (\n commentBody: string,\n defaultOptions: Options,\n optionsToUpdate?: Partial,\n): UpdatedBodyWithOptions => {\n const options = parseOptions(commentBody, defaultOptions);\n const updatedOptions = updateOptions(options, optionsToUpdate);\n\n return {\n options: updatedOptions,\n commentBody: internalUpdateBodyOptionsAndInfos(commentBody, updatedOptions),\n };\n};\n\nexport const updateCommentBodyInfos = (\n commentBody: string,\n infos?: StatusInfo[],\n): string => {\n return commentBody.replace(\n // * - zero or more\n // *? - zero or more (non-greedy)\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*?)?(#### Commits Notes:.*?)?(#### Options:.*?)?)?$/s,\n `${getReplacement(infos)}$3`,\n );\n};\n\nexport const updateCommentBodyCommitsNotes = (\n commentBody: string,\n commitNotes?: string,\n): string => {\n return commentBody.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /(?:#### Commits Notes:.*?)?(#### Options:)/s,\n // eslint-disable-next-line no-nested-ternary\n !commitNotes ? '$1' : `#### Commits Notes:\\n\\n${commitNotes}\\n\\n$1`,\n );\n};\n\nexport const removeDeprecatedReviewflowInPrBody = (prBody: string): string => {\n return prBody.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(.*)(.*)(.*)$/is,\n // eslint-disable-next-line no-nested-ternary\n '$1$3',\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\n\nexport const createReviewflowComment = (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n body: string,\n): Promise<\n RestEndpointMethodTypes['issues']['createComment']['response']['data']\n> => {\n return context.octokit.issues\n .createComment(context.repo({ issue_number: pullRequestNumber, body }))\n .then(({ data }) => data);\n};\n\nexport const getReviewflowCommentById = (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n commentId: number,\n): Promise<\n RestEndpointMethodTypes['issues']['getComment']['response']['data'] | null\n> => {\n return context.octokit.issues\n .getComment(\n context.repo({\n issue_number: pullRequestNumber,\n comment_id: commentId,\n }),\n )\n .then(\n ({ data }) => data,\n () => null,\n );\n};\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { ReviewflowPr } from 'mongo';\nimport { defaultCommentBody } from '../actions/utils/body/updateBody';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\nimport {\n createReviewflowComment,\n getReviewflowCommentById,\n} from './reviewflowComment';\n\nexport interface CreatePrContextOptions {\n reviewflowCommentPromise?: ReturnType;\n}\n\nexport interface ReviewflowPrContext {\n reviewflowPr: ReviewflowPr;\n commentBody: string;\n}\n\nexport const getReviewflowPrContext = async (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n repoContext: RepoContext,\n reviewflowCommentPromise?: ReturnType,\n): Promise => {\n const appContext = repoContext.appContext;\n const prEmbed = { number: pullRequestNumber };\n\n if (reviewflowCommentPromise) {\n const comment = await reviewflowCommentPromise;\n const reviewflowPr = await appContext.mongoStores.prs.insertOne({\n account: repoContext.accountEmbed,\n repo: repoContext.repoEmbed,\n pr: prEmbed,\n commentId: comment.id,\n });\n return { reviewflowPr, commentBody: comment.body };\n }\n\n const existing = await appContext.mongoStores.prs.findOne({\n 'account.id': repoContext.accountEmbed.id,\n 'repo.id': repoContext.repoEmbed.id,\n 'pr.number': pullRequestNumber,\n });\n const comment =\n existing &&\n (await getReviewflowCommentById(\n pullRequestNumber,\n context,\n existing.commentId,\n ));\n\n if (!comment || !existing) {\n const comment = await createReviewflowComment(\n pullRequestNumber,\n context,\n defaultCommentBody,\n );\n\n if (!existing) {\n const reviewflowPr = await appContext.mongoStores.prs.insertOne({\n account: repoContext.accountEmbed,\n repo: repoContext.repoEmbed,\n pr: prEmbed,\n commentId: comment.id,\n });\n return { reviewflowPr, commentBody: comment.body };\n } else {\n await appContext.mongoStores.prs.partialUpdateByKey(existing._id, {\n $set: { commentId: comment.id },\n });\n }\n }\n\n return { reviewflowPr: existing, commentBody: comment!.body };\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\n\nexport const fetchPr = async (\n context: Context,\n prNumber: number,\n): Promise => {\n const prResult = await context.octokit.pulls.get(\n context.repo({ pull_number: prNumber }),\n );\n\n return prResult.data;\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\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 LabelsRecord {\n [key: string]: LabelResponse;\n}\n\nexport const getLabelsForRepo = async (\n context: Context,\n): Promise<\n RestEndpointMethodTypes['issues']['listLabelsForRepo']['response']['data']\n> => {\n const { data: labels } = await context.octokit.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n return labels;\n};\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const labels = await getLabelsForRepo(context);\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 = labelConfig.description\n ? `${labelConfig.description} - Synced by reviewflow`\n : `Synced by reviewflow 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 if (labelKey === 'teams/ops') {\n existingLabel = labels.find((label) => label.name === 'archi');\n }\n }\n\n if (!existingLabel) {\n const result = await context.octokit.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 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.octokit.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","import { Lock } from 'lock';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport { accountConfigs, defaultConfig } from '../accountConfigs';\nimport type { GroupLabels } from '../accountConfigs/types';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../events/pr-handlers/actions/autoMergeIfPossible';\nimport type {\n PullRequestData,\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../events/pr-handlers/utils/PullRequestData';\nimport { getReviewflowPrContext } from '../events/pr-handlers/utils/createPullRequestContext';\nimport { fetchPr } from '../events/pr-handlers/utils/fetchPr';\nimport { ExcludesFalsy } from '../utils/Excludes';\nimport type { AppContext } from './AppContext';\nimport type { AccountContext } from './accountContext';\nimport { obtainAccountContext } from './accountContext';\nimport type { LabelResponse, LabelsRecord } from './initRepoLabels';\nimport { initRepoLabels } from './initRepoLabels';\nimport { getEmojiFromRepoDescription } from './utils';\n\nexport interface LockedMergePr {\n id: number;\n number: number;\n branch: string;\n}\n\ninterface RepoContextWithoutTeamContext {\n appContext: AppContext;\n repoFullName: string;\n repoEmbed: { id: number; name: string };\n repoEmoji: string | undefined;\n labels: LabelsRecord;\n protectedLabelIds: readonly LabelResponse['id'][];\n shouldIgnore: boolean;\n\n hasNeedsReview: (labels: PullRequestLabels) => boolean;\n hasRequestedReview: (labels: PullRequestLabels) => boolean;\n hasChangesRequestedReview: (labels: PullRequestLabels) => boolean;\n hasApprovesReview: (labels: PullRequestLabels) => boolean;\n getNeedsReviewGroupNames: (labels: PullRequestLabels) => GroupNames[];\n\n lockPullRequest: (\n pullRequest: PullRequestData,\n callback: () => Promise | void,\n ) => Promise;\n\n /** @deprecated */\n lockPR: (\n prId: string,\n prNumber: number,\n callback: () => Promise | void,\n ) => Promise;\n\n getMergeLockedPr: () => LockedMergePr;\n addMergeLockPr: (pr: LockedMergePr) => void;\n removePrFromAutomergeQueue: (\n context: Context,\n prNumber: number,\n reason: string,\n ) => void;\n reschedule: (context: Context, pr: LockedMergePr) => void;\n pushAutomergeQueue: (pr: LockedMergePr) => void;\n}\n\nexport type RepoContext = AccountContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nexport const shouldIgnoreRepo = (\n repoName: string,\n accountConfig: Config,\n): boolean => {\n const ignoreRepoRegexp =\n accountConfig.ignoreRepoPattern &&\n new RegExp(`^${accountConfig.ignoreRepoPattern}$`);\n\n if (repoName === 'reviewflow-test') {\n return process.env.REVIEWFLOW_NAME !== 'reviewflow-dev';\n }\n\n if (ignoreRepoRegexp) {\n return ignoreRepoRegexp.test(repoName);\n }\n\n return false;\n};\n\nconst createGetReviewLabelIds = (\n shouldIgnore: boolean,\n config: Config,\n reviewGroupNames: GroupNames[],\n labels: LabelsRecord,\n): ((labelKey: GroupLabels) => number[]) => {\n if (shouldIgnore) return (labelKey: GroupLabels): number[] => [];\n return (labelKey: GroupLabels): number[] =>\n reviewGroupNames\n .map((key) => config.labels.review[key][labelKey])\n .filter(Boolean)\n .map((name) => labels[name].id);\n};\n\nasync function initRepoContext(\n appContext: AppContext,\n context: Context,\n config: Config,\n): Promise> {\n const {\n id,\n name,\n full_name: fullName,\n owner: org,\n description,\n } = context.payload.repository;\n const repoEmoji = getEmojiFromRepoDescription(description);\n\n const accountContext = await obtainAccountContext(\n appContext,\n context,\n config,\n org,\n );\n const repoContext = Object.create(accountContext);\n\n const shouldIgnore = shouldIgnoreRepo(name, config);\n\n const labels = shouldIgnore ? {} : await initRepoLabels(context, config);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const getReviewLabelIds = createGetReviewLabelIds(\n shouldIgnore,\n config,\n reviewGroupNames,\n labels,\n );\n\n const needsReviewLabelIds = getReviewLabelIds('needsReview');\n const requestedReviewLabelIds = getReviewLabelIds('requested');\n const changesRequestedLabelIds = getReviewLabelIds('changesRequested');\n const approvedReviewLabelIds = getReviewLabelIds('approved');\n\n const protectedLabelIds = [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ];\n\n const labelIdToGroupName = new Map();\n if (!shouldIgnore) {\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\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: PullRequestLabels): 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 lockPR = (\n prOrPrIssueId: string,\n prNumber: number,\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n const logInfos = {\n repo: fullName,\n prOrPrIssueId,\n prNumber,\n };\n context.log.debug('lock: try to lock pr', logInfos);\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n lock(String(prNumber), async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n context.log.info('lock: lock pr acquired', logInfos);\n try {\n await callback();\n } catch (err) {\n context.log.info('lock: release pr (with error)', logInfos);\n release();\n reject(err);\n return;\n }\n context.log.info('lock: release pr', logInfos);\n release();\n resolve();\n });\n });\n\n const lockPullRequest = (\n pullRequest: PullRequestWithDecentData,\n callback: () => Promise | void,\n ): Promise => {\n return lockPR(String(pullRequest.id), pullRequest.number, callback);\n };\n\n const reschedule = (context: Context, pr: LockedMergePr): void => {\n if (!pr) throw new Error('Cannot reschedule undefined');\n context.log.info('reschedule', pr);\n setTimeout(() => {\n lockPR('reschedule', -1, () => {\n return lockPR(String(pr.id), pr.number, async () => {\n const [pullRequest, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pr.number),\n getReviewflowPrContext(pr.number, context, repoContext),\n ]);\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n });\n });\n }, 10_000);\n };\n\n return Object.assign(repoContext, {\n appContext,\n labels,\n repoFullName: fullName,\n repoEmbed: { id, name },\n repoEmoji,\n protectedLabelIds,\n shouldIgnore,\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', {\n repo: fullName,\n pr,\n });\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: (\n context,\n prNumber: number | string,\n reason: string,\n ): void => {\n if (lockMergePr && String(lockMergePr.number) === String(prNumber)) {\n lockMergePr = automergeQueue.shift();\n context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`);\n context.log(`merge lock: next ${fullName}`, lockMergePr);\n if (lockMergePr) {\n reschedule(context, lockMergePr);\n }\n } else {\n const previousLength = automergeQueue.length;\n automergeQueue = automergeQueue.filter(\n (value) => String(value.number) !== String(prNumber),\n );\n if (automergeQueue.length !== previousLength) {\n context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`);\n }\n }\n },\n pushAutomergeQueue: (pr: LockedMergePr): void => {\n context.log('merge lock: push queue', {\n repo: fullName,\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 lockPR,\n lockPullRequest,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n appContext: AppContext,\n context: Context,\n): Promise | RepoContext | null => {\n const repo = context.payload.repository;\n const owner = repo.owner;\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 let accountConfig = accountConfigs[owner.login];\n\n if (!accountConfig) {\n console.warn(`using default config for ${owner.login}`);\n accountConfig = defaultConfig as Config;\n }\n\n const promise = initRepoContext(appContext, context, accountConfig);\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 type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { OnCallback } from 'probot/lib/application';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { RepoContext } from '../../../context/repoContext';\nimport { obtainRepoContext } from '../../../context/repoContext';\n\nexport const createRepoHandler = <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n appContext: AppContext,\n callback: (\n context: Context,\n repoContext: RepoContext,\n ) => Promise | void,\n): OnCallback => {\n return async (context): Promise => {\n const repoContext = await obtainRepoContext(appContext, context);\n if (!repoContext) return;\n\n return callback(context, repoContext);\n };\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { OnCallback } from 'probot/lib/application';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { RepoContext, LockedMergePr } from '../../../context/repoContext';\nimport { createRepoHandler } from '../../repository-handlers/utils/createRepoHandler';\nimport type {\n PullRequestData,\n PullRequestFromWebhook,\n} from './PullRequestData';\nimport type {\n CreatePrContextOptions,\n ReviewflowPrContext,\n} from './createPullRequestContext';\nimport { getReviewflowPrContext } from './createPullRequestContext';\n\nexport type CallbackWithPRAndRepoContext = (\n pullRequest: T,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createPullRequestHandler = <\n T extends\n | EventPayloads.WebhookPayloadPullRequest\n | EventPayloads.WebhookPayloadPullRequestReview\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n | EventPayloads.WebhookPayloadPullRequestReviewComment,\n U extends PullRequestFromWebhook\n>(\n appContext: AppContext,\n getPullRequestInPayload: (\n payload: Context['payload'],\n context: Context,\n repoContext: RepoContext,\n ) => U | null,\n callbackPr: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext | null,\n ) => void | Promise,\n callbackBeforeLock?: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n ) => CreatePrContextOptions,\n): OnCallback => {\n return createRepoHandler(appContext, async (context, repoContext) => {\n const pullRequest: U | null = getPullRequestInPayload(\n context.payload,\n context,\n repoContext,\n );\n if (pullRequest === null) return;\n const options = callbackBeforeLock\n ? callbackBeforeLock(pullRequest, context, repoContext)\n : {};\n\n await repoContext.lockPullRequest(pullRequest, async () => {\n /*\n * When repo are ignored, only slack notifications are sent.\n * PR is not linted, commented, nor auto merged.\n */\n const reviewflowPrContext = repoContext.shouldIgnore\n ? null\n : await getReviewflowPrContext(\n pullRequest.number,\n context,\n repoContext,\n options.reviewflowCommentPromise,\n );\n\n return callbackPr(pullRequest, context, repoContext, reviewflowPrContext);\n });\n });\n};\n\nexport const createPullRequestsHandler = <\n T extends { repository: EventPayloads.PayloadRepository },\n U extends PullRequestFromWebhook | LockedMergePr\n>(\n appContext: AppContext,\n getPrs: (payload: Context['payload'], repoContext: RepoContext) => U[],\n callbackPr: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n ) => void | Promise,\n): OnCallback => {\n return createRepoHandler(appContext, async (context, repoContext) => {\n const prs = getPrs(context.payload, repoContext);\n if (prs.length === 0) return;\n\n await Promise.all(\n prs.map((pr) =>\n repoContext.lockPR(String(pr.id), pr.number, async () => {\n return callbackPr(pr, context, repoContext);\n }),\n ),\n );\n });\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { getReviewflowPrContext } from './utils/createPullRequestContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function checkrunCompleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'check_run.completed',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext) => {\n if (repoContext.shouldIgnore) return [];\n return payload.check_run.pull_requests;\n },\n async (pullRequest, context, repoContext) => {\n const [updatedPr, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pullRequest.number),\n getReviewflowPrContext(pullRequest.number, context, repoContext),\n ]);\n\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { getReviewflowPrContext } from './utils/createPullRequestContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function checksuiteCompleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'check_suite.completed',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext) => {\n if (repoContext.shouldIgnore) return [];\n return payload.check_suite.pull_requests;\n },\n async (pullRequest, context, repoContext) => {\n const [updatedPr, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pullRequest.number),\n getReviewflowPrContext(pullRequest.number, context, repoContext),\n ]);\n\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\n\nexport default async function createStatus<\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n context: Context,\n name: string,\n sha: string,\n type: 'failure' | 'success',\n description: string,\n url?: string,\n): Promise {\n await context.octokit.repos.createCommitStatus(\n context.repo({\n context:\n name === ''\n ? process.env.REVIEWFLOW_NAME\n : `${process.env.REVIEWFLOW_NAME}/${name}`,\n sha,\n state: type,\n description,\n target_url: url,\n }),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport createStatus from './utils/createStatus';\n\nconst addStatusCheck = async function <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n { state, description }: { state: 'failure' | 'success'; description: string },\n previousSha?: string,\n): Promise {\n const hasPrCheck = (\n await context.octokit.checks.listForRef(\n context.repo({\n ref: pullRequest.head.sha,\n }),\n )\n ).data.check_runs.find((check) => check.name === process.env.REVIEWFLOW_NAME);\n\n context.log.debug('add status check', { hasPrCheck, state, description });\n\n if (hasPrCheck) {\n await context.octokit.checks.create(\n context.repo({\n name: process.env.REVIEWFLOW_NAME as string,\n head_sha: pullRequest.head.sha,\n started_at: pullRequest.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 if (previousSha && state === 'failure') {\n await Promise.all([\n createStatus(\n context,\n '',\n previousSha,\n 'success',\n 'New commits have been pushed',\n ),\n createStatus(context, '', pullRequest.head.sha, state, description),\n ]);\n } else {\n await createStatus(context, '', pullRequest.head.sha, state, description);\n }\n};\n\nexport const updateStatusCheckFromLabels = <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n labels: PullRequestLabels = pullRequest.labels || [],\n previousSha?: string,\n): Promise => {\n context.log.debug('updateStatusCheckFromLabels', {\n labels: labels.map((l) => l?.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n });\n\n const createFailedStatusCheck = (description: string): Promise =>\n addStatusCheck(\n pullRequest,\n context,\n {\n state: 'failure',\n description,\n },\n previousSha,\n );\n\n if (pullRequest.requested_reviewers.length > 0) {\n return createFailedStatusCheck(\n // TODO remove `as`\n // https://github.com/probot/probot/issues/1219\n `Awaiting review from: ${pullRequest.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\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 `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 '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(\n pullRequest,\n context,\n {\n state: 'success',\n description: '✓ PR ready to merge !',\n },\n previousSha,\n );\n // }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { GroupLabels } from '../../../accountConfigs/types';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends { repository: EventPayloads.PayloadRepository },\n GroupNames extends string = any\n>(\n pullRequest: PullRequestWithDecentData,\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.debug('updateReviewStatus', {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n });\n\n let prLabels: PullRequestLabels = pullRequest.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(prLabels.map((label) => label.name));\n\n const toAdd = new Set();\n const toAddNames = new Set();\n const toDelete = new Set();\n const toDeleteNames = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (\n key: GroupLabels,\n ): undefined | PullRequestLabels[number] => {\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 toAddNames.add(label.name);\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 toDeleteNames.add(existing.name);\n }\n });\n }\n\n // TODO move that elsewhere\n\n repoContext.getTeamsForLogin(pullRequest.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 toAddNames.add(label.name);\n }\n });\n }\n });\n\n // if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return;\n\n if (toAdd.size !== 0 || toDelete.size !== 0) {\n if (toDelete.size === 0 || toDelete.size < 4) {\n context.log.debug('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n toAddNames: [...toAddNames],\n toDeleteNames: [...toDeleteNames],\n });\n\n if (toAdd.size !== 0) {\n const result = await context.octokit.issues.addLabels(\n context.issue({\n labels: [...toAddNames],\n }),\n );\n prLabels = result.data;\n }\n\n if (toDelete.size !== 0) {\n for (const toDeleteName of [...toDeleteNames]) {\n try {\n const result = await context.octokit.issues.removeLabel(\n context.issue({\n name: toDeleteName,\n }),\n );\n prLabels = result.data;\n } catch (err) {\n context.log.warn('error removing label', {\n err: err?.message,\n });\n }\n }\n }\n } else {\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.debug('updateReviewStatus', {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l) => l.name),\n newLabelNames: newLabelNamesArray,\n });\n\n const result = await context.octokit.issues.setLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(\n pullRequest,\n context,\n repoContext,\n prLabels,\n );\n // }\n\n return prLabels;\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseOptions } from './actions/utils/body/parseBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function closed(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.closed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n if (!repoContext.shouldIgnore && reviewflowPrContext) {\n const repo = context.payload.repository;\n\n if (pullRequest.merged) {\n const isNotFork = pullRequest.head.repo.id === repo.id;\n const options = parseOptions(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n );\n\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr closed',\n ),\n isNotFork && options.deleteAfterMerge\n ? context.octokit.git\n .deleteRef(\n context.repo({ ref: `heads/${pullRequest.head.ref}` }),\n )\n .catch(() => {})\n : undefined,\n ]);\n } else {\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr closed',\n ),\n updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n },\n ),\n );\n}\n","import type { RepoContext } from '../context/repoContext';\n\nexport const createLink = (url: string, text: string): string => {\n return `<${url}|${text}>`;\n};\n\nexport const createPrLink = (\n pr: { html_url: string; number: number },\n repoContext: RepoContext,\n): string => {\n return createLink(\n pr.html_url,\n `${repoContext.repoEmoji ? `${repoContext.repoEmoji} ` : ''}${\n repoContext.repoFullName\n }#${pr.number}`,\n );\n};\n","import type { KnownBlock } from '@slack/web-api';\nimport type { SlackMessage } from '../../../context/SlackMessage';\n\nexport const createMrkdwnSectionBlock = (text: string): KnownBlock => ({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text,\n },\n});\n\nexport const createSlackMessageWithSecondaryBlock = (\n message: string,\n secondaryBlockText?: string | null,\n): SlackMessage => {\n return {\n text: message,\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: message,\n },\n },\n ],\n secondaryBlocks: !secondaryBlockText\n ? undefined\n : [createMrkdwnSectionBlock(secondaryBlockText)],\n };\n};\n","import type { EventPayloads } from '@octokit/webhooks';\n\ntype WebhookPr =\n | EventPayloads.WebhookPayloadPullRequest['pull_request']\n | EventPayloads.WebhookPayloadPullRequestReviewPullRequest;\n\ntype PullRequestHandlerAllowedPayloads =\n | {\n repository: EventPayloads.PayloadRepository;\n pull_request: WebhookPr;\n }\n | {\n repository: EventPayloads.PayloadRepository;\n issue: EventPayloads.WebhookPayloadIssueCommentIssue;\n };\n\nexport type PullRequestFromPayload<\n T extends PullRequestHandlerAllowedPayloads\n> = T extends { pull_request: WebhookPr }\n ? T['pull_request']\n : T extends { issue: EventPayloads.WebhookPayloadIssueCommentIssue }\n ? T['issue'] /* & T['issue']['pull_request'] */\n : never;\n\n/** deprecated */\nexport const getPullRequestFromPayload = <\n T extends PullRequestHandlerAllowedPayloads\n>(\n payload: T,\n): PullRequestFromPayload => {\n const pullRequest: WebhookPr = (payload as any).pull_request;\n if (pullRequest) {\n return pullRequest as PullRequestFromPayload;\n }\n\n const issue = (payload as any).issue;\n if (issue?.pull_request) {\n return {\n ...issue,\n ...issue.pull_request,\n };\n }\n\n throw new Error('No pull_request in payload');\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { RepoContext } from '../../../context/repoContext';\nimport { getKeys } from '../../../context/utils';\n\ntype ReviewState = 'CHANGES_REQUESTED' | 'APPROVED' | 'DISMISSED';\n\ninterface ReviewStates {\n approved: number;\n changesRequested: number;\n dismissed: number;\n}\ninterface Reviewer {\n id: number;\n login: string;\n}\n\nexport const getReviewersAndReviewStates = async (\n context: Context,\n repoContext: RepoContext,\n): Promise<{\n reviewers: Reviewer[];\n reviewStates: Record;\n}> => {\n const userIds = new Set();\n const reviewers: Reviewer[] = [];\n const reviewStatesByUser = new Map();\n\n await context.octokit.paginate(\n context.octokit.pulls.listReviews,\n context.pullRequest(),\n ({\n data: reviews,\n }: RestEndpointMethodTypes['pulls']['listReviews']['response']) => {\n reviews.forEach((review) => {\n if (!userIds.has(review.user.id)) {\n userIds.add(review.user.id);\n reviewers.push({ id: review.user.id, login: review.user.login });\n }\n const state = review.state.toUpperCase();\n if (state !== 'COMMENTED') {\n reviewStatesByUser.set(review.user.id, state as ReviewState);\n }\n });\n\n return [];\n },\n );\n\n const reviewStates: Record = {} as Record<\n GroupNames,\n ReviewStates\n >;\n\n getKeys(repoContext.config.groups).forEach((groupName) => {\n reviewStates[groupName] = {\n approved: 0,\n changesRequested: 0,\n dismissed: 0,\n };\n });\n\n reviewers.forEach((reviewer) => {\n const group = repoContext.getReviewerGroup(reviewer.login);\n if (group) {\n const state = reviewStatesByUser.get(reviewer.id);\n switch (state) {\n case 'APPROVED':\n reviewStates[group].approved++;\n break;\n case 'CHANGES_REQUESTED':\n reviewStates[group].changesRequested++;\n break;\n case 'DISMISSED':\n reviewStates[group].dismissed++;\n break;\n }\n }\n });\n\n return { reviewers, reviewStates };\n};\n","import type { RepoContext } from '../../../context/repoContext';\n\nexport const checkIfUserIsBot = (\n repoContext: RepoContext,\n user: { login: string; type: string },\n): boolean => {\n if (user.type === 'Bot') return true;\n if (repoContext.config.botUsers) {\n return repoContext.config.botUsers.includes(user.login);\n }\n return false;\n};\n\nexport const checkIfIsThisBot = (user: {\n login: string;\n type: string;\n}): boolean => {\n return (\n user.type === 'Bot' && user.login === `${process.env.REVIEWFLOW_NAME}[bot]`\n );\n};\n","import issueParser from 'issue-parser';\n\nconst parse = issueParser('github', { actions: {}, issuePrefixes: [] });\n\nexport const parseMentions = (body: string): readonly string[] => {\n return parse(body).mentions.map((m) => m.user);\n};\n","import slackifyMarkdown from 'slackify-markdown';\n\nexport const slackifyCommentBody = (\n body: string,\n multipleLines: boolean,\n): string => {\n return slackifyMarkdown(\n body\n .replace('```suggestion', '_Suggested change:_\\n```suggestion')\n .replace(\n '```suggestion\\r\\n```',\n `_Suggestion to remove line${multipleLines ? 's' : ''}._\\n`,\n ),\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport type { SlackMessage } from '../../context/SlackMessage';\nimport type { PostSlackMessageResult } from '../../context/TeamSlack';\nimport type { AccountEmbed } from '../../mongo';\nimport * as slackUtils from '../../slack/utils';\nimport { ExcludesNullish } from '../../utils/Excludes';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createSlackMessageWithSecondaryBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport type { PullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getPullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { checkIfUserIsBot, checkIfIsThisBot } from './utils/isBotUser';\nimport { parseMentions } from './utils/parseMentions';\nimport { slackifyCommentBody } from './utils/slackifyCommentBody';\n\nconst getDiscussion = async (\n context: Context,\n comment: any,\n): Promise<\n RestEndpointMethodTypes['pulls']['listComments']['response']['data']\n> => {\n if (!comment.in_reply_to_id) return [comment];\n return context.octokit.paginate(\n context.octokit.pulls.listComments.endpoint.merge(context.pullRequest()),\n ({\n data,\n }: RestEndpointMethodTypes['pulls']['listComments']['response']) => {\n return data.filter(\n (c) =>\n c.in_reply_to_id === comment.in_reply_to_id ||\n c.id === comment.in_reply_to_id,\n );\n },\n );\n};\n\nconst getMentions = (\n discussion: RestEndpointMethodTypes['pulls']['listComments']['response']['data'],\n): string[] => {\n const mentions = new Set();\n\n discussion.forEach((c) => {\n parseMentions(c.body).forEach((m) => mentions.add(m));\n });\n\n return [...mentions];\n};\n\nconst getUsersInThread = (\n discussion: RestEndpointMethodTypes['pulls']['listComments']['response']['data'],\n): { id: number; login: string }[] => {\n const userIds = new Set();\n const users: { id: number; login: string }[] = [];\n\n discussion.forEach((c) => {\n if (userIds.has(c.user.id)) return;\n userIds.add(c.user.id);\n users.push({ id: c.user.id, login: c.user.login });\n });\n\n return users;\n};\n\nexport default function prCommentCreated(\n app: Probot,\n appContext: AppContext,\n): void {\n const saveInDb = async (\n type: 'review-comment' | 'issue-comment',\n commentId: number,\n accountEmbed: AccountEmbed,\n results: PostSlackMessageResult[],\n message: SlackMessage,\n ): Promise => {\n const filtered = results.filter(ExcludesNullish);\n if (filtered.length === 0) return;\n\n await appContext.mongoStores.slackSentMessages.insertOne({\n type,\n typeId: commentId,\n message,\n account: accountEmbed,\n sentTo: filtered,\n });\n };\n\n app.on(\n [\n 'pull_request_review_comment.created',\n // comments without review and without path are sent with issue_comment.created.\n // createHandlerPullRequestChange checks if pull_request event is present, removing real issues comments.\n 'issue_comment.created',\n ],\n createPullRequestHandler<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment,\n | PullRequestFromPayload<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n >\n | any\n >(\n appContext,\n (payload, context) => {\n if (checkIfIsThisBot(payload.comment.user)) {\n // ignore comments from this bot\n return null;\n }\n return getPullRequestFromPayload(payload);\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const pr = await fetchPr(context, pullRequest.number);\n const { comment } = context.payload;\n const type = (comment as any).pull_request_review_id\n ? 'review-comment'\n : 'issue-comment';\n\n const body = comment.body;\n if (!body) return;\n\n const commentByOwner = pr.user.login === comment.user.login;\n const [discussion, { reviewers }] = await Promise.all([\n getDiscussion(context, comment),\n getReviewersAndReviewStates(context, repoContext),\n ]);\n\n const followers = reviewers.filter(\n (u) => u.id !== pr.user.id && u.id !== comment.user.id,\n );\n\n if (pr.requested_reviewers) {\n followers.push(\n ...pr.requested_reviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== comment.user.id &&\n rr.id !== pr.user.id\n );\n }),\n );\n }\n\n const usersInThread = getUsersInThread(discussion).filter(\n (u) =>\n u.id !== pr.user.id &&\n u.id !== comment.user.id &&\n !followers.find((f) => f.id === u.id),\n );\n const mentions = getMentions(discussion).filter(\n (m) =>\n m !== pr.user.login &&\n m !== comment.user.login &&\n !followers.find((f) => f.login === m) &&\n !usersInThread.find((u) => u.login === m),\n );\n\n const mention = repoContext.slack.mention(comment.user.login);\n const prUrl = slackUtils.createPrLink(pr, repoContext);\n const ownerMention = repoContext.slack.mention(pr.user.login);\n const commentLink = slackUtils.createLink(\n comment.html_url,\n (comment as any).in_reply_to_id ? 'replied' : 'commented',\n );\n\n const createMessage = (toOwner?: boolean): string => {\n const ownerPart = toOwner\n ? 'your PR'\n : `${\n pr.user.id === comment.user.id ? 'his' : `${ownerMention}'s`\n } PR`;\n return `:speech_balloon: ${mention} ${commentLink} on ${ownerPart} ${prUrl}`;\n };\n\n const promisesOwner = [];\n const promisesNotOwner = [];\n const slackifiedBody = slackifyCommentBody(\n comment.body,\n (comment as any).start_line !== null,\n );\n const isBotUser = checkIfUserIsBot(repoContext, comment.user);\n\n if (!commentByOwner) {\n const slackMessage = createSlackMessageWithSecondaryBlock(\n createMessage(true),\n slackifiedBody,\n );\n\n promisesOwner.push(\n repoContext.slack\n .postMessage(\n isBotUser ? 'pr-comment-bots' : 'pr-comment',\n pr.user.id,\n pr.user.login,\n slackMessage,\n )\n .then((res) =>\n saveInDb(\n type,\n comment.id,\n repoContext.accountEmbed,\n [res],\n slackMessage,\n ),\n ),\n );\n }\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n promisesNotOwner.push(\n ...followers.map((follower) =>\n repoContext.slack.postMessage(\n isBotUser ? 'pr-comment-follow-bots' : 'pr-comment-follow',\n follower.id,\n follower.login,\n message,\n ),\n ),\n );\n\n promisesNotOwner.push(\n ...usersInThread.map((user) =>\n repoContext.slack.postMessage(\n 'pr-comment-thread',\n user.id,\n user.login,\n message,\n ),\n ),\n );\n\n if (mentions.length > 0) {\n await appContext.mongoStores.users\n .findAll({ login: { $in: mentions } })\n .then((users) => {\n promisesNotOwner.push(\n ...users.map((u) =>\n repoContext.slack.postMessage(\n 'pr-comment-mention',\n u._id,\n u.login,\n message,\n ),\n ),\n );\n });\n }\n\n await Promise.all([\n Promise.all(promisesOwner),\n Promise.all(promisesNotOwner).then((results) =>\n saveInDb(\n type,\n comment.id,\n repoContext.accountEmbed,\n results,\n message,\n ),\n ),\n ]);\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport type { Options } from './utils/body/prOptions';\nimport { updateCommentOptions } from './utils/body/updateBody';\n\nconst updatePrCommentBody = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n reviewflowPrContext: ReviewflowPrContext,\n newBody: string,\n): Promise => {\n await context.octokit.issues.updateComment(\n context.repo({\n comment_id: reviewflowPrContext.reviewflowPr.commentId,\n body: newBody,\n }),\n );\n reviewflowPrContext.commentBody = newBody;\n};\n\nexport const updatePrCommentBodyIfNeeded = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n reviewflowPrContext: ReviewflowPrContext,\n newBody: string,\n): Promise => {\n if (reviewflowPrContext.commentBody !== newBody) {\n await updatePrCommentBody(context, reviewflowPrContext, newBody);\n }\n};\n\nexport const updatePrCommentBodyOptions = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n updateOptions: Partial,\n): Promise => {\n const { commentBody: newBody } = updateCommentOptions(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n updateOptions,\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newBody);\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from 'events/pr-handlers/utils/PullRequestData';\nimport type { LabelResponse } from '../../../../context/initRepoLabels';\nimport hasLabelInPR from './hasLabelInPR';\n\ninterface SyncLabelOptions {\n onRemove?: () => void | Promise;\n onAdd?: (prLabels: LabelResponse[]) => void | Promise;\n}\n\nexport default async function syncLabel<\n T extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n shouldHaveLabel: boolean,\n label: LabelResponse,\n prHasLabel = hasLabelInPR(pullRequest.labels, label),\n { onRemove, onAdd }: SyncLabelOptions = {},\n): Promise {\n if (prHasLabel && !shouldHaveLabel) {\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n if (onRemove) await onRemove();\n }\n if (shouldHaveLabel && !prHasLabel) {\n const response = await context.octokit.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n if (onAdd) await onAdd(response.data);\n }\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type {\n PullRequestFromRestEndpoint,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport type { Options } from './utils/body/prOptions';\nimport { updateCommentOptions } from './utils/body/updateBody';\nimport hasLabelInPR from './utils/hasLabelInPR';\nimport syncLabel from './utils/syncLabel';\n\nexport const calcDefaultOptions = (\n repoContext: RepoContext,\n pullRequest: PullRequestWithDecentData,\n): Options => {\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasFeatureBranchLabel = hasLabelInPR(\n pullRequest.labels,\n featureBranchLabel,\n );\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n return {\n ...repoContext.config.prDefaultOptions,\n featureBranch: prHasFeatureBranchLabel,\n autoMergeWithSkipCi: prHasSkipCiLabel,\n autoMerge: prHasAutoMergeLabel,\n };\n};\n\nexport const syncLabelsAfterCommentBodyEdited = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n): Promise => {\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasFeatureBranchLabel = hasLabelInPR(\n pullRequest.labels,\n featureBranchLabel,\n );\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n const { commentBody, options } = updateCommentOptions(\n reviewflowPrContext.commentBody,\n calcDefaultOptions(repoContext, pullRequest),\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, commentBody);\n\n if (options && (featureBranchLabel || automergeLabel)) {\n await Promise.all([\n featureBranchLabel &&\n syncLabel(\n pullRequest,\n context,\n options.featureBranch,\n featureBranchLabel,\n prHasFeatureBranchLabel,\n ),\n skipCiLabel &&\n syncLabel(\n pullRequest,\n context,\n options.autoMergeWithSkipCi,\n skipCiLabel,\n prHasSkipCiLabel,\n ),\n automergeLabel &&\n syncLabel(\n pullRequest,\n context,\n options.autoMerge,\n automergeLabel,\n prHasAutoMergeLabel,\n {\n onAdd: async (prLabels) => {\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n prLabels,\n );\n },\n onRemove: () => {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'label removed',\n );\n },\n },\n ),\n ]);\n }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { syncLabelsAfterCommentBodyEdited } from './actions/syncLabelsAfterCommentBodyEdited';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createMrkdwnSectionBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport type { PullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getPullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { checkIfIsThisBot } from './utils/isBotUser';\nimport { slackifyCommentBody } from './utils/slackifyCommentBody';\n\nexport default function prCommentEditedOrDeleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n [\n 'pull_request_review_comment.edited',\n 'pull_request_review_comment.deleted',\n // comments without review and without path are sent with issue_comment.created.\n // createHandlerPullRequestChange checks if pull_request event is present, removing real issues comments.\n 'issue_comment.edited',\n 'issue_comment.deleted',\n ],\n createPullRequestHandler<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment,\n | PullRequestFromPayload<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n >\n | any\n >(\n appContext,\n (payload) => {\n if (checkIfIsThisBot(payload.sender)) {\n // ignore edits made from this bot\n return null;\n }\n return getPullRequestFromPayload(payload);\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const { comment } = context.payload;\n\n if (\n reviewflowPrContext !== null &&\n context.payload.action === 'edited' &&\n checkIfIsThisBot(comment.user)\n ) {\n const updatedPr = await fetchPr(context, pullRequest.number);\n if (!updatedPr.closed_at) {\n await syncLabelsAfterCommentBodyEdited(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n }\n return;\n }\n\n const type = (comment as any).pull_request_review_id\n ? 'review-comment'\n : 'issue-comment';\n\n const criteria = {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type,\n typeId: comment.id,\n };\n\n const sentMessages = await appContext.mongoStores.slackSentMessages.findAll(\n criteria,\n );\n\n if (sentMessages.length === 0) return;\n\n if (context.payload.action === 'deleted') {\n await Promise.all([\n Promise.all(\n sentMessages.map((sentMessage) =>\n Promise.all(\n sentMessage.sentTo.map((sentTo) =>\n repoContext.slack.deleteMessage(sentTo.ts, sentTo.channel),\n ),\n ),\n ),\n ),\n appContext.mongoStores.slackSentMessages.deleteMany(criteria),\n ]);\n } else {\n const secondaryBlocks = [\n createMrkdwnSectionBlock(\n slackifyCommentBody(\n comment.body,\n (comment as any).start_line !== null,\n ),\n ),\n ];\n\n await Promise.all([\n Promise.all(\n sentMessages.map((sentMessage) =>\n Promise.all(\n sentMessage.sentTo.map((sentTo) =>\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...sentMessage.message,\n secondaryBlocks,\n }),\n ),\n ),\n ),\n ),\n appContext.mongoStores.slackSentMessages.partialUpdateMany(\n criteria,\n { $set: { 'message.secondaryBlocks': secondaryBlocks } },\n ),\n ]);\n }\n },\n ),\n );\n}\n","import type { CommitNote } from '@commitlint/parse';\nimport parse from '@commitlint/parse';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport { updateCommentBodyCommitsNotes } from './utils/body/updateBody';\nimport syncLabel from './utils/syncLabel';\n\ninterface BreakingChangesCommits {\n commit: RestEndpointMethodTypes['pulls']['listCommits']['response']['data'][number];\n breakingChangesNotes: CommitNote[];\n}\n\nexport const readCommitsAndUpdateInfos = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n commentBody = reviewflowPrContext.commentBody,\n): Promise => {\n // tmp.data[0].sha\n // tmp.data[0].commit.message\n\n const commits = await context.octokit.paginate(\n context.octokit.pulls.listCommits,\n context.pullRequest({\n // A custom page size up to 100. Default is 30.\n per_page: 100,\n }),\n (res) => res.data,\n );\n\n const conventionalCommits = await Promise.all(\n commits.map((c) => parse(c.commit.message)),\n );\n\n const breakingChangesCommits: BreakingChangesCommits[] = [];\n conventionalCommits.forEach((c, index) => {\n const breakingChangesNotes = c.notes.filter(\n (note) => note.title === 'BREAKING CHANGE',\n );\n if (breakingChangesNotes.length > 0) {\n breakingChangesCommits.push({\n commit: commits[index],\n breakingChangesNotes,\n });\n }\n });\n\n const breakingChangesLabel = repoContext.labels['breaking-changes'];\n const newCommentBody = updateCommentBodyCommitsNotes(\n commentBody,\n breakingChangesCommits.length === 0\n ? ''\n : `Breaking Changes:\\n${breakingChangesCommits\n .map(({ commit, breakingChangesNotes }) =>\n breakingChangesNotes.map(\n (note) => `- ${note.text.replace('\\n', ' ')} (${commit.sha})`,\n ),\n )\n .join('')}`,\n );\n\n await Promise.all([\n syncLabel(\n pullRequest,\n context,\n breakingChangesCommits.length !== 0,\n breakingChangesLabel,\n ),\n updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newCommentBody),\n ]);\n\n // TODO auto update ! in front of : to signal a breaking change when https://github.com/conventional-changelog/commitlint/issues/658 is closed\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\n\ninterface UpdatePr {\n title?: string;\n body?: string;\n}\n\nconst cleanNewLines = (text: string): string => text.replace(/\\r\\n/g, '\\n');\nconst checkIfHasDiff = (text1: string, text2: string): boolean =>\n cleanNewLines(text1) !== cleanNewLines(text2);\n\nexport const updatePrIfNeeded = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n update: UpdatePr,\n): Promise => {\n const hasDiffInTitle = update.title && pullRequest.title !== update.title;\n const hasDiffInBody =\n update.body && checkIfHasDiff(pullRequest.body, update.body);\n\n if (hasDiffInTitle || hasDiffInBody) {\n const diff: Partial> = {};\n if (hasDiffInTitle) {\n diff.title = update.title;\n pullRequest.title = update.title as string;\n }\n if (hasDiffInBody) {\n diff.body = update.body;\n pullRequest.body = update.body as string;\n }\n\n await context.octokit.pulls.update(\n context.repo({\n pull_number: pullRequest.number,\n ...diff,\n }),\n );\n }\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(\n /[\\s-]+\\[?\\s*([A-Za-z][\\dA-Za-z]+)[ -](\\d+)\\s*]?\\s*$/,\n (s, arg1, arg2) => ` ${arg1.toUpperCase()}-${arg2}`,\n )\n .replace(/^([A-Za-z]+)[/:]\\s*/, (s, arg1) => `${arg1.toLowerCase()}: `)\n .replace(/^Revert \"([^\"]+)\"$/, 'revert: $1')\n .replace(/\\s+[[\\]]\\s*no\\s*issue\\s*[[\\]]$/i, ' [no issue]')\n // eslint-disable-next-line unicorn/no-unsafe-regex\n .replace(/^(revert:.*)(\\s+\\(#\\d+\\))$/, '$1');\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { StatusError, StatusInfo } from '../../../accountConfigs/types';\nimport { ExcludesFalsy } from '../../../utils/Excludes';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { readCommitsAndUpdateInfos } from './readCommitsAndUpdateInfos';\nimport { calcDefaultOptions } from './syncLabelsAfterCommentBodyEdited';\nimport { updatePrIfNeeded } from './updatePr';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport {\n updateCommentBodyInfos,\n defaultCommentBody,\n createCommentBody,\n removeDeprecatedReviewflowInPrBody,\n} from './utils/body/updateBody';\nimport { cleanTitle } from './utils/cleanTitle';\nimport createStatus from './utils/createStatus';\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\nexport const editOpenedPR = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext | null,\n shouldUpdateCommentBodyInfos: boolean,\n previousSha?: string,\n): Promise => {\n if (reviewflowPrContext === null) return;\n\n const title = repoContext.config.trimTitle\n ? cleanTitle(pullRequest.title)\n : pullRequest.title;\n\n const isPrFromBot = pullRequest.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(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 = (\n await context.octokit.checks.listForRef(\n context.repo({\n ref: pullRequest.head.sha,\n }),\n )\n ).data.check_runs.find(\n (check): boolean => check.name === `${process.env.REVIEWFLOW_NAME}/lint-pr`,\n );\n\n const promises: Promise[] = [\n ...statuses.map(\n ({ name, error, info }): Promise =>\n createStatus(\n context,\n name,\n pullRequest.head.sha,\n error ? 'failure' : 'success',\n error ? error.title : (info as StatusInfo).title,\n error ? undefined : (info as StatusInfo).url,\n ),\n ),\n ...(previousSha\n ? statuses\n .map(({ name, error, info }): Promise | undefined =>\n error\n ? createStatus(\n context,\n name,\n previousSha,\n 'success',\n 'New commits have been pushed',\n )\n : undefined,\n )\n .filter(ExcludesFalsy)\n : []),\n hasLintPrCheck &&\n context.octokit.checks.create(\n context.repo({\n name: `${process.env.REVIEWFLOW_NAME}/lint-pr`,\n head_sha: pullRequest.head.sha,\n status: 'completed' as const,\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 && previousSha && errorRule\n ? createStatus(\n context,\n 'lint-pr',\n previousSha,\n 'success',\n 'New commits have been pushed',\n )\n : undefined,\n !hasLintPrCheck &&\n createStatus(\n context,\n 'lint-pr',\n pullRequest.head.sha,\n errorRule ? 'failure' : 'success',\n errorRule ? errorRule.error.title : '✓ Your PR is valid',\n ),\n ].filter(ExcludesFalsy);\n\n const body = removeDeprecatedReviewflowInPrBody(pullRequest.body);\n promises.push(updatePrIfNeeded(pullRequest, context, { title, body }));\n\n const commentBodyInfos = statuses\n .filter((status) => status.info?.inBody)\n .map((status) => status.info) as StatusInfo[];\n\n const shouldCreateCommentBody =\n reviewflowPrContext.commentBody === defaultCommentBody;\n\n const newBody = shouldCreateCommentBody\n ? createCommentBody(\n calcDefaultOptions(repoContext, pullRequest),\n commentBodyInfos,\n )\n : updateCommentBodyInfos(reviewflowPrContext.commentBody, commentBodyInfos);\n\n if (shouldCreateCommentBody || shouldUpdateCommentBodyInfos) {\n promises.push(\n readCommitsAndUpdateInfos(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n newBody,\n ),\n );\n } else {\n promises.push(\n updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newBody),\n );\n }\n\n await Promise.all(promises);\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { checkIfIsThisBot } from './utils/isBotUser';\n\nexport default function edited(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.edited',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n if (reviewflowPrContext == null) return;\n\n const sender = context.payload.sender;\n if (checkIfIsThisBot(sender)) {\n return;\n }\n\n const updatedPullRequest = await fetchPr(\n context,\n context.payload.pull_request.number,\n );\n\n await editOpenedPR(\n updatedPullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n false,\n );\n await autoMergeIfPossible(\n updatedPullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\n\nexport const updateBranch = async (\n pullRequest: PullRequestWithDecentData,\n context: Context,\n login: string,\n): Promise => {\n context.log.info('update branch', {\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n });\n\n const result = await context.octokit.repos\n .merge({\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n head: pullRequest.base.ref,\n base: pullRequest.head.ref,\n })\n .catch((err) => ({ error: err } as any));\n\n context.log.info('update branch result', {\n status: result.status,\n sha: result.data?.sha,\n error: result.error,\n });\n\n if (result.status === 204) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch: base already contains the head, nothing to merge.`,\n }),\n );\n } else if (result.status === 409) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch: merge conflict. Please resolve manually.`,\n }),\n );\n } else if (!result || !result.data || !result.data.sha) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch (unknown error)`,\n }),\n );\n } else {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} branch updated: ${result.data.sha}`,\n }),\n );\n }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateBranch } from './actions/updateBranch';\nimport { updatePrCommentBodyOptions } from './actions/updatePrCommentBody';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport hasLabelInPR from './actions/utils/hasLabelInPR';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nconst isFromRenovate = (\n payload: EventPayloads.WebhookPayloadPullRequest,\n): boolean => {\n const sender = payload.sender;\n return (\n sender.type === 'Bot' &&\n sender.login === 'renovate[bot]' &&\n payload.pull_request.head.ref.startsWith('renovate/')\n );\n};\n\nexport default function labelsChanged(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n createPullRequestHandler<\n EventPayloads.WebhookPayloadPullRequest,\n EventPayloads.WebhookPayloadPullRequest['pull_request']\n >(\n appContext,\n (payload, context, repoContext) => {\n if (payload.sender.type === 'Bot' && !isFromRenovate(payload)) {\n return null;\n }\n\n if (repoContext.shouldIgnore) return null;\n\n return payload.pull_request;\n },\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n if (reviewflowPrContext === null) return;\n\n const fromRenovate = isFromRenovate(context.payload);\n const updatedPr = await fetchPr(context, pullRequest.number);\n\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 const autoMergeSkipCiLabel = repoContext.labels['merge/skip-ci'];\n if (context.payload.action === 'labeled') {\n if (codeApprovedLabel && label.id === codeApprovedLabel.id) {\n // const { data: reviews } = await context.octokit.pulls.listReviews(\n // context.pullRequest({ per_page: 1 }),\n // );\n // if (reviews.length !== 0) {\n await context.octokit.pulls.createReview(\n context.pullRequest({ event: 'APPROVE' }),\n );\n\n let labels = updatedPr.labels;\n const autoMergeWithSkipCi =\n autoMergeSkipCiLabel &&\n repoContext.config.autoMergeRenovateWithSkipCi;\n if (autoMergeWithSkipCi) {\n const result = await context.octokit.issues.addLabels(\n context.issue({\n labels: [autoMergeSkipCiLabel.name],\n }),\n );\n labels = result.data;\n }\n await updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n labels,\n );\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n autoMergeWithSkipCi,\n // force label to avoid racing events (when both events are sent in the same time, reviewflow treats them one by one but the second event wont have its body updated)\n autoMerge: hasLabelInPR(labels, autoMergeLabel)\n ? true\n : repoContext.config.prDefaultOptions.autoMerge,\n },\n );\n // }\n } else if (autoMergeLabel && label.id === autoMergeLabel.id) {\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n autoMerge: true,\n // force label to avoid racing events (when both events are sent in the same time, reviewflow treats them one by one but the second event wont have its body updated)\n // Note: si c'est renovate qui ajoute le label autoMerge, le label codeApprovedLabel n'aurait pu etre ajouté que par renovate également (on est a quelques secondes de l'ouverture de la pr par renovate)\n autoMergeWithSkipCi: hasLabelInPR(\n pullRequest.labels,\n codeApprovedLabel,\n )\n ? true\n : repoContext.config.prDefaultOptions.autoMergeWithSkipCi,\n },\n );\n }\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n }\n return;\n }\n\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.octokit.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(updatedPr, context, repoContext);\n\n const updateBranchLabel = repoContext.labels['merge/update-branch'];\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const option = (() => {\n if (featureBranchLabel && label.id === featureBranchLabel.id) {\n return 'featureBranch';\n }\n if (automergeLabel && label.id === automergeLabel.id) {\n return 'autoMerge';\n }\n if (skipCiLabel && label.id === skipCiLabel.id) {\n return 'autoMergeWithSkipCi';\n }\n return null;\n })();\n\n if (option) {\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n [option]: context.payload.action === 'labeled',\n },\n );\n } // not an else if\n if (automergeLabel && label.id === automergeLabel.id) {\n if (context.payload.action === 'labeled') {\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n } else {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'automerge label removed',\n );\n }\n }\n if (updateBranchLabel && label.id === updateBranchLabel.id) {\n if (context.payload.action === 'labeled') {\n await updateBranch(\n updatedPr,\n context,\n context.payload.sender.login,\n );\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n }\n }\n },\n ),\n );\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestFromRestEndpoint } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\nimport hasLabelInPR from './utils/hasLabelInPR';\n\nexport const autoApproveAndAutoMerge = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n): Promise => {\n // const autoMergeLabel = repoContext.labels['merge/automerge'];\n const codeApprovedLabel = repoContext.labels['code/approved'];\n if (hasLabelInPR(pullRequest.labels, codeApprovedLabel)) {\n await context.octokit.pulls.createReview(\n context.pullRequest({ event: 'APPROVE' }),\n );\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n return true;\n }\n\n return false;\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestFromRestEndpoint } from '../utils/PullRequestData';\n\nexport const autoAssignPRToCreator = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: E['pull_request'] | PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n): Promise => {\n if (!repoContext.config.autoAssignToCreator) return;\n if (pullRequest.assignees.length > 0) return;\n if (pullRequest.user.type === 'Bot') return;\n\n await context.octokit.issues.addAssignees(\n context.issue({\n assignees: [pullRequest.user.login],\n }),\n );\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from 'context/AppContext';\nimport { autoApproveAndAutoMerge } from './actions/autoApproveAndAutoMerge';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { defaultCommentBody } from './actions/utils/body/updateBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { createReviewflowComment } from './utils/reviewflowComment';\n\nexport default function opened(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.opened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n const fromRenovate = pullRequest.head.ref.startsWith('renovate/');\n if (reviewflowPrContext === null) return;\n\n await Promise.all([\n autoAssignPRToCreator(pullRequest, context, repoContext),\n editOpenedPR(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n ),\n fromRenovate\n ? fetchPr(context, pullRequest.number).then((updatedPr) =>\n autoApproveAndAutoMerge(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n ).then(\n async (approved: boolean): Promise => {\n if (!approved && repoContext.config.requiresReviewRequest) {\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n 'dev',\n {\n add: ['needsReview'],\n },\n );\n }\n },\n ),\n )\n : updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n add: repoContext.config.requiresReviewRequest\n ? ['needsReview']\n : [],\n remove: ['approved', 'changesRequested'],\n }),\n ]);\n },\n (pullRequest, context, repoContext) => {\n return {\n reviewflowCommentPromise: createReviewflowComment(\n pullRequest.number,\n context,\n defaultCommentBody,\n ),\n };\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function closed(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.reopened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n await Promise.all([\n updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n add: ['needsReview'],\n remove: ['approved'],\n }),\n editOpenedPR(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n ),\n ]);\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nexport default function reviewDismissed(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request_review.dismissed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n const reviewer = (context.payload as any).review.user;\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const updatedPr = await fetchPr(context, pullRequest.number);\n\n const { reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n const hasApprovals = reviewStates[reviewerGroup].approved !== 0;\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n updatedPr.requested_reviewers,\n { includesReviewerGroup: true },\n );\n\n await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n !hasApprovals && 'needsReview',\n hasApprovals &&\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'approved',\n ],\n remove: [\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n !hasChangesRequestedInReviews && 'changesRequested',\n !hasApprovals && 'approved',\n ],\n },\n );\n\n if (updatedPr.assignees) {\n updatedPr.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !updatedPr.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.postMessage(\n 'pr-review',\n assignee.id,\n assignee.login,\n {\n text: `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n } else {\n repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n {\n text: `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n }\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nexport default function reviewRequestRemoved(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request.review_request_removed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n\n const hasApprovedInReviews =\n reviewStates[reviewerGroup].approved !== 0;\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n // if changes requested by the one which requests was removed (should still be in changed requested anyway, but we never know)\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 && 'requested',\n ],\n },\n );\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n\n const sentMessageRequestedReview = await appContext.mongoStores.slackSentMessages.findOne(\n {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n },\n );\n\n if (sentMessageRequestedReview) {\n const sentTo = sentMessageRequestedReview.sentTo[0];\n const message = sentMessageRequestedReview.message;\n await Promise.all([\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...message,\n text: message.text\n .split('\\n')\n .map((l) => `~${l}~`)\n .join('\\n'),\n }),\n repoContext.slack.addReaction(\n sentTo.ts,\n sentTo.channel,\n 'skull_and_crossbones',\n ),\n appContext.mongoStores.slackSentMessages.deleteOne(\n sentMessageRequestedReview,\n ),\n ]);\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function reviewRequested(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request.review_requested',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n const shouldWait = false;\n // repoContext.approveShouldWait(reviewerGroup, pr.requested_reviewers, { includesWaitForGroups: true });\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n reviewerGroup,\n {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved'],\n },\n );\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n const text = `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )} !\\n> ${pullRequest.title}`;\n const message = { text };\n const result = await repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n message,\n );\n if (result) {\n await appContext.mongoStores.slackSentMessages.insertOne({\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n message,\n account: repoContext.accountEmbed,\n sentTo: [result],\n });\n }\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport slackifyMarkdown from 'slackify-markdown';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createSlackMessageWithSecondaryBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nconst getEmojiFromState = (state: string): string => {\n switch (state) {\n case 'changes_requested':\n return 'x';\n case 'approved':\n return 'white_check_mark';\n default:\n return 'speech_balloon';\n }\n};\n\nexport default function reviewSubmitted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request_review.submitted',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const { payload } = context;\n\n const {\n user: reviewer,\n state,\n body,\n html_url: reviewUrl,\n } = payload.review;\n\n const reviewByOwner = pullRequest.user.login === reviewer.login;\n const { reviewers, reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const followers = reviewers.filter(\n (user) => user.id !== reviewer.id && user.id !== pullRequest.user.id,\n );\n\n if (pullRequest.requested_reviewers) {\n followers.push(\n ...pullRequest.requested_reviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== reviewer.id &&\n rr.id !== pullRequest.user.id\n );\n }),\n );\n }\n\n if (!reviewByOwner) {\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged: boolean;\n\n if (\n reviewflowPrContext &&\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest.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\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const updatedPr = await fetchPr(context, pullRequest.number);\n\n const newLabels = await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'needsReview',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup && '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 updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n newLabels,\n );\n }\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n\n const sentMessageRequestedReview = await appContext.mongoStores.slackSentMessages.findOne(\n {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n },\n );\n\n const emoji = getEmojiFromState(state);\n\n if (sentMessageRequestedReview) {\n const sentTo = sentMessageRequestedReview.sentTo[0];\n const message = sentMessageRequestedReview.message;\n await Promise.all([\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...message,\n text: message.text\n .split('\\n')\n .map((l) => `~${l}~`)\n .join('\\n'),\n }),\n repoContext.slack.addReaction(sentTo.ts, sentTo.channel, emoji),\n appContext.mongoStores.slackSentMessages.deleteOne(\n sentMessageRequestedReview,\n ),\n ]);\n }\n\n if (!body && state !== 'changes_requested' && state !== 'approved') {\n return;\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = slackUtils.createPrLink(pullRequest, repoContext);\n const ownerMention = repoContext.slack.mention(\n pullRequest.user.login,\n );\n\n const createMessage = (toOwner?: boolean): string => {\n const ownerPart = toOwner ? 'your PR' : `${ownerMention}'s PR`;\n\n if (state === 'changes_requested') {\n return `:${emoji}: ${mention} requests changes on ${ownerPart} ${prUrl}`;\n }\n if (state === 'approved') {\n return `${\n toOwner ? ':clap: ' : ''\n }:${emoji}: ${mention} approves ${ownerPart} ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n\n const commentLink = slackUtils.createLink(reviewUrl, 'commented');\n return `:${emoji}: ${mention} ${commentLink} on ${ownerPart} ${prUrl}`;\n };\n\n const slackifiedBody = slackifyMarkdown((body as unknown) as string);\n\n repoContext.slack.postMessage(\n 'pr-review',\n pullRequest.user.id,\n pullRequest.user.login,\n createSlackMessageWithSecondaryBlock(\n createMessage(true),\n slackifiedBody,\n ),\n );\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n followers.forEach((follower) => {\n repoContext.slack.postMessage(\n 'pr-review-follow',\n follower.id,\n follower.login,\n message,\n );\n });\n } else if (body) {\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = slackUtils.createPrLink(pullRequest, repoContext);\n const commentLink = slackUtils.createLink(reviewUrl, 'commented');\n\n const message = createSlackMessageWithSecondaryBlock(\n `:speech_balloon: ${mention} ${commentLink} on his PR ${prUrl}`,\n body,\n );\n\n followers.forEach((follower) => {\n repoContext.slack.postMessage(\n 'pr-review-follow',\n follower.id,\n follower.login,\n message,\n );\n });\n }\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport type { LockedMergePr } from '../../context/repoContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\n\nconst isSameBranch = (\n payload: Context['payload'],\n lockedPr: LockedMergePr,\n): boolean => {\n if (!lockedPr) return false;\n return !!payload.branches.find((b) => b.name === lockedPr.branch);\n};\n\nexport default function status(app: Probot, appContext: AppContext): void {\n app.on(\n 'status',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext): LockedMergePr[] => {\n if (repoContext.shouldIgnore) return [];\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (!lockedPr) return [];\n\n if (payload.state !== 'loading' && isSameBranch(payload, lockedPr)) {\n return [lockedPr];\n }\n\n return [];\n },\n (pr, context, repoContext): void => {\n const lockedPr = repoContext.getMergeLockedPr();\n // check if changed\n if (isSameBranch(context.payload, lockedPr)) {\n repoContext.reschedule(context, lockedPr);\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function synchronize(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.synchronize',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n if (!reviewflowPrContext) return;\n\n const updatedPr = await fetchPr(context, pullRequest.number);\n // old and new sha\n // const { before, after } = context.payload;\n const previousSha = (context.payload as any).before as string;\n\n await Promise.all([\n editOpenedPR(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n previousSha,\n ),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n updatedPr.labels,\n previousSha,\n ),\n ]);\n\n // call autoMergeIfPossible to re-add to the queue when push is fixed\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { obtainRepoContext } from '../../context/repoContext';\nimport { getEmojiFromRepoDescription } from '../../context/utils';\nimport { createHandlerOrgChange } from '../account-handlers/utils/handler';\n\nexport default function repoEdited(app: Probot, appContext: AppContext): void {\n app.on(\n 'repository.edited',\n createHandlerOrgChange(\n appContext,\n async (context, orgContext): Promise => {\n const repoContext = await obtainRepoContext(appContext, context);\n if (!repoContext) return;\n const repo = context.payload.repository;\n repoContext.repoFullName = repo.full_name;\n repoContext.repoEmoji = getEmojiFromRepoDescription(repo.description);\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\n// import commands from 'probot-commands';\nimport type { AppContext } from './context/AppContext';\nimport { syncOrg } from './events/account-handlers/actions/syncOrg';\nimport { syncTeams } from './events/account-handlers/actions/syncTeams';\nimport { createHandlerOrgChange } from './events/account-handlers/utils/handler';\nimport checkrunCompleted from './events/pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './events/pr-handlers/checksuiteCompleted';\nimport closedHandler from './events/pr-handlers/closed';\nimport commentCreated from './events/pr-handlers/commentCreated';\nimport commentEditedOrDeleted from './events/pr-handlers/commentEditedOrDeleted';\nimport editedHandler from './events/pr-handlers/edited';\nimport labelsChanged from './events/pr-handlers/labelsChanged';\nimport openedHandler from './events/pr-handlers/opened';\nimport reopenedHandler from './events/pr-handlers/reopened';\nimport reviewDismissedHandler from './events/pr-handlers/reviewDismissed';\nimport reviewRequestRemovedHandler from './events/pr-handlers/reviewRequestRemoved';\nimport reviewRequestedHandler from './events/pr-handlers/reviewRequested';\nimport reviewSubmittedHandler from './events/pr-handlers/reviewSubmitted';\nimport status from './events/pr-handlers/status';\nimport synchronizeHandler from './events/pr-handlers/synchronize';\nimport repoEdited from './events/repository-handlers/repoEdited';\n\nexport default function initApp(app: Probot, appContext: AppContext): void {\n /* https://developer.github.com/webhooks/event-payloads/#organization */\n app.on(\n ['organization.member_added', 'organization.member_removed'],\n createHandlerOrgChange(\n appContext,\n async (context, accountContext) => {\n await syncOrg(\n appContext.mongoStores,\n context.octokit,\n accountContext.account.installationId as number,\n context.payload.organization,\n );\n },\n ),\n );\n\n /* https://developer.github.com/webhooks/event-payloads/#team */\n app.on(\n ['team.created', 'team.deleted', 'team.edited'],\n createHandlerOrgChange(\n appContext,\n async (context, accountContext) => {\n await syncTeams(\n appContext.mongoStores,\n context.octokit,\n context.payload.organization,\n );\n },\n ),\n );\n\n // /* https://developer.github.com/webhooks/event-payloads/#membership */\n // app.on(\n // ['membership.added', 'membership.removed'],\n // createHandlerOrgChange(\n // mongoStores,\n // async (context, accountContext) => {\n // await syncTeamMembers(\n // mongoStores,\n // context.octokit,\n // context.payload.organization,\n // context.payload.team,\n // );\n // },\n // ),\n // );\n\n // Repo\n /* https://developer.github.com/webhooks/event-payloads/#repository */\n repoEdited(app, appContext);\n\n // PR\n /* https://developer.github.com/webhooks/event-payloads/#pull_request */\n openedHandler(app, appContext);\n editedHandler(app, appContext);\n closedHandler(app, appContext);\n reopenedHandler(app, appContext);\n\n reviewRequestedHandler(app, appContext);\n reviewRequestRemovedHandler(app, appContext);\n reviewSubmittedHandler(app, appContext);\n reviewDismissedHandler(app, appContext);\n labelsChanged(app, appContext);\n synchronizeHandler(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#pull_request_review_comment */\n /* https://developer.github.com/webhooks/event-payloads/#issue_comment */\n commentCreated(app, appContext);\n commentEditedOrDeleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#check_run */\n checkrunCompleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#check_suite */\n checksuiteCompleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#status */\n status(app, appContext);\n\n /* commands */\n // commands(app, 'update-branch', () => {});\n}\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { MongoBaseModel } from 'liwi-mongo';\nimport { MongoStore, MongoConnection } from 'liwi-mongo';\nimport type { SlackMessage } from './context/SlackMessage';\nimport type { MessageCategory } from './dm/MessageCategory';\n\n// export interface PrEventsModel extends MongoModel {\n// owner: string;\n// repo: string;\n// prId: string;\n// prNumber: string;\n// event: string;\n// }\n\nexport type AccountType = 'Organization' | 'User';\n\nexport interface AccountEmbed {\n id: number;\n login: string;\n type: AccountType;\n}\n\ninterface RepoEmbed {\n id: number;\n name: string;\n}\n\ninterface PrEmbed {\n number: number;\n}\n\ntype AccountEmbedWithoutType = Omit;\n\nexport interface UserDmSettings extends MongoBaseModel {\n userId: number;\n orgId: number;\n settings: Record;\n}\n\n// TODO _id is number\ninterface BaseAccount extends MongoBaseModel {\n login: string;\n installationId?: number;\n}\n\nexport interface User extends BaseAccount {\n type: string;\n}\n\nexport interface Org extends BaseAccount {\n slackToken?: string;\n}\n\nexport interface OrgMember extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n user: AccountEmbedWithoutType;\n slack?: { id: string };\n}\n\nexport interface OrgTeam extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n name: string;\n slug: string;\n description: string;\n}\n\nexport type SlackMessageType =\n | 'review-comment'\n | 'issue-comment'\n | 'review-submitted'\n | 'review-requested';\n\nexport interface SlackSentMessage extends MongoBaseModel {\n type: SlackMessageType;\n typeId: number | string;\n account: AccountEmbed;\n message: SlackMessage;\n sentTo: {\n channel: string;\n ts: string;\n }[];\n}\n\nexport interface AutomergeLog extends MongoBaseModel {\n account: AccountEmbed;\n repoFullName: string;\n pr: {\n id: number;\n number: number;\n isRenovate: boolean;\n mergeableState: string;\n };\n type:\n | 'rebase-renovate'\n | 'unknown mergeable_state'\n | 'blocked mergeable_state'\n | 'behind mergeable_state'\n | 'not mergeable'\n | 'failed status or checks'\n | 'already merged';\n action: 'remove' | 'reschedule' | 'wait' | 'update branch';\n}\n\nexport interface ReviewflowPr extends MongoBaseModel {\n account: AccountEmbed;\n repo: RepoEmbed;\n pr: PrEmbed;\n commentId: number;\n}\n\nexport interface MongoStores {\n connection: MongoConnection;\n userDmSettings: MongoStore;\n users: MongoStore;\n orgs: MongoStore;\n orgMembers: MongoStore;\n orgTeams: MongoStore;\n slackSentMessages: MongoStore;\n automergeLogs: MongoStore;\n prs: MongoStore;\n // prEvents: MongoStore;\n}\n\nif (!process.env.MONGO_DB) {\n throw new Error('MONGO_DB is missing in process.env');\n}\n\nexport default function init(): MongoStores {\n const config = new Map([\n ['host', process.env.MONGO_HOST || 'localhost'],\n ['port', process.env.MONGO_PORT || '27017'],\n ['database', process.env.MONGO_DB as string],\n ]);\n if (process.env.MONGO_USER) {\n config.set('user', process.env.MONGO_USER);\n config.set('password', process.env.MONGO_PASSWORD as string);\n }\n const connection = new MongoConnection(config);\n\n // const prEvents = new MongoStore(connection, 'prEvents');\n // prEvents.collection.then((coll) => {\n // coll.createIndex({ owner: 1, repo: 1, ???: 1 });\n // });\n\n const userDmSettings = new MongoStore(\n connection,\n 'userDmSettings',\n );\n userDmSettings.collection.then((coll) => {\n coll.createIndex({ userId: 1, orgId: 1 }, { unique: true });\n });\n\n const users = new MongoStore(connection, 'users');\n users.collection.then((coll) => {\n coll.createIndex({ login: 1 }, { unique: true });\n });\n\n const orgs = new MongoStore(connection, 'orgs');\n orgs.collection.then((coll) => {\n coll.createIndex({ login: 1 }, { unique: true });\n });\n\n const orgMembers = new MongoStore(connection, 'orgMembers');\n orgMembers.collection.then((coll) => {\n coll.createIndex({ 'user.id': 1, 'org.id': 1 }, { unique: true });\n });\n\n const orgTeams = new MongoStore(connection, 'orgTeams');\n orgTeams.collection.then((coll) => {\n coll.createIndex({ 'org.id': 1 });\n });\n\n const slackSentMessages = new MongoStore(\n connection,\n 'slackSentMessages',\n );\n slackSentMessages.collection.then((coll) => {\n coll.createIndex({\n 'account.id': 1,\n 'account.type': 1,\n type: 1,\n typeId: 1,\n });\n // remove older than 14 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 14 * 24 * 60 * 60 * 1000) },\n });\n });\n\n const automergeLogs = new MongoStore(\n connection,\n 'automergeLogs',\n );\n automergeLogs.collection.then((coll) => {\n coll.createIndex({\n repoFullName: 1,\n type: 1,\n });\n coll.createIndex({\n repoFullName: 1,\n 'pr.number': 1,\n });\n // remove older than 30 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) },\n });\n });\n\n const prs = new MongoStore(connection, 'prs');\n prs.collection.then((coll) => {\n coll.createIndex(\n {\n 'account.id': 1,\n 'repo.id': 1,\n 'pr.number': 1,\n },\n { unique: true },\n );\n // remove older than 12 * 30 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 12 * 30 * 24 * 60 * 60 * 1000) },\n });\n });\n\n // return { connection, prEvents };\n return {\n connection,\n userDmSettings,\n users,\n orgs,\n orgMembers,\n orgTeams,\n slackSentMessages,\n automergeLogs,\n prs,\n };\n}\n","import type { Octokit } from '@octokit/core';\nimport { WebClient } from '@slack/web-api';\nimport type { MongoStores, Org, OrgMember } from '../mongo';\nimport { createLink } from './utils';\n\ninterface QueueItem {\n github: Octokit;\n slackClient: WebClient;\n member: OrgMember;\n}\n\nexport const createSlackHomeWorker = (mongoStores: MongoStores) => {\n const updateMember = async (\n github: Octokit,\n slackClient: WebClient,\n member: OrgMember,\n ): Promise => {\n if (!member.slack?.id) return;\n // console.log('update member', member.org.login, member.user.login);\n\n /* search limit: 30 requests per minute = 7 update/min max */\n const [\n prsWithRequestedReviews,\n prsToMerge,\n prsWithRequestedChanges,\n prsInDraft,\n ] = await Promise.all([\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open review-requested:${member.user.login} `,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} label:\":ok_hand: code/approved\"`,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} label:\":ok_hand: code/changes-requested\"`,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} draft:true`,\n sort: 'created',\n order: 'desc',\n per_page: 5,\n }),\n ]);\n\n const blocks: any[] = [];\n\n const buildBlocks = (title: string, results: any) => {\n if (!results.total_count) return;\n\n blocks.push(\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*${title}*`,\n },\n },\n {\n type: 'divider',\n },\n ...results.items\n .map((pr: any) => {\n const repoName = pr.repository_url.slice(\n 'https://api.github.com/repos/'.length,\n );\n const prFullName = `${repoName}#${pr.number}`;\n\n return [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*${createLink(pr.html_url, pr.title)}*`,\n // ${pr.labels.map((l) => `{${l.name}}`).join(' · ')}\n },\n },\n {\n type: 'context',\n elements: [\n {\n type: 'mrkdwn',\n text: `${createLink(pr.html_url, prFullName)} ${\n pr.draft ? '· _Draft_' : ''\n }`,\n },\n {\n type: 'image',\n image_url: pr.user.avatar_url,\n alt_text: pr.user.login,\n },\n {\n type: 'mrkdwn',\n text: `${pr.user.login}`,\n },\n ],\n },\n ];\n })\n .flat(),\n {\n type: 'context',\n elements: [\n {\n type: 'image',\n image_url:\n 'https://api.slack.com/img/blocks/bkb_template_images/placeholder.png',\n alt_text: 'placeholder',\n },\n ],\n },\n );\n };\n\n buildBlocks(':eyes: Requested Reviews', prsWithRequestedReviews.data);\n buildBlocks(':white_check_mark: Ready to Merge', prsToMerge.data);\n buildBlocks(':x: Changes Requested', prsWithRequestedChanges.data);\n buildBlocks(':construction: Drafts', prsInDraft.data);\n\n if (blocks.length === 0) {\n blocks.push({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: \":tada: It looks like you don't have any PR to review!\",\n },\n });\n }\n\n slackClient.views.publish({\n user_id: member.slack.id,\n view: {\n type: 'home',\n blocks,\n },\n });\n };\n\n let workerInterval: ReturnType | undefined;\n const queueKeys = new Set();\n const queue: QueueItem[] = [];\n\n const stop = (): void => {\n if (workerInterval !== undefined) {\n clearInterval(workerInterval);\n workerInterval = undefined;\n }\n };\n\n const start = (): void => {\n if (workerInterval !== undefined) return;\n workerInterval = setInterval(() => {\n const item = queue.shift();\n if (!item) {\n stop();\n return;\n }\n\n const { github, slackClient, member } = item;\n const memberId = member.slack?.id;\n\n const key = `${member.org.id}_${memberId}`;\n queueKeys.delete(key);\n\n updateMember(github, slackClient, member);\n }, 9000); // 7/min 60s 1min = 1 ttes les 8.5s max\n };\n\n const scheduleUpdateMember = (\n github: Octokit,\n slackClient: WebClient,\n member: OrgMember,\n ): void => {\n const memberId = member.slack?.id;\n if (!memberId) return;\n\n const key = `${member.org.id}_${memberId}`;\n\n if (!queueKeys.has(key)) {\n queueKeys.add(key);\n queue.push({\n github,\n slackClient,\n member,\n });\n start();\n }\n };\n\n const scheduleUpdateOrg = async (\n github: Octokit,\n org: Org,\n slackClient = new WebClient(org.slackToken),\n ): Promise => {\n const cursor = await mongoStores.orgMembers.cursor();\n cursor.forEach((member) => {\n scheduleUpdateMember(github, slackClient, member);\n });\n };\n\n const scheduleUpdateAllOrgs = async (\n auth: (installationId: number) => Promise,\n ): Promise => {\n const cursor = await mongoStores.orgs.cursor();\n cursor.forEach(async (org) => {\n if (!org.slackToken || !org.installationId) return;\n const github = await auth(org.installationId);\n await scheduleUpdateOrg(github, org);\n });\n };\n\n return {\n scheduleUpdateMember,\n scheduleUpdateOrg,\n scheduleUpdateAllOrgs,\n };\n};\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport 'dotenv/config';\nimport { run } from 'probot';\nimport appRouter from './appRouter';\nimport type { AppContext } from './context/AppContext';\nimport initApp from './initApp';\nimport mongoInit from './mongo';\nimport { createSlackHomeWorker } from './slack/home';\n\nif (!process.env.REVIEWFLOW_NAME) process.env.REVIEWFLOW_NAME = 'reviewflow';\nconsole.log({ name: process.env.REVIEWFLOW_NAME });\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\nrun(({ app, getRouter }) => {\n const mongoStores = mongoInit();\n const slackHome = createSlackHomeWorker(mongoStores);\n const appContext: AppContext = { mongoStores, slackHome };\n appRouter(app, getRouter, appContext);\n initApp(app, appContext);\n slackHome.scheduleUpdateAllOrgs((id: number) => app.auth(id));\n});\n"],"names":["process","env","GITHUB_CLIENT_ID","Error","GITHUB_CLIENT_SECRET","oauth2","create","client","id","secret","auth","tokenHost","tokenPath","authorizePath","Layout","lang","title","REVIEWFLOW_NAME","children","React","padding","AUTH_SECRET_KEY","signPromisified","promisify","sign","verifyPromisified","verify","secure","SECURE_COOKIE","createRedirectUri","req","host","hostname","PORT","readAuthCookie","strategy","cookie","cookies","algorithm","audience","headers","getAuthInfoFromCookie","res","authInfo","clearCookie","undefined","createApi","accessToken","Octokit","getUser","redirect","api","router","get","redirectUri","githubAuth","authorizationCode","authorizeURL","redirect_uri","scope","query","error","send","error_description","code","result","getToken","renderToStaticMarkup","access_token","user","users","getAuthenticated","data","login","time","Date","now","token","expiresIn","httpOnly","home","orgs","listForAuthenticatedUser","display","flexGrow","map","org","config","autoAssignToCreator","trimTitle","requiresReviewRequest","prDefaultOptions","featureBranch","autoMergeWithSkipCi","autoMerge","deleteAfterMerge","parsePR","regExp","summary","groups","dev","christophehurpeau","tilap","waitForGroups","teams","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","ignoreRepoPattern","autoMergeRenovateWithSkipCi","bot","status","statusInfoFromMatch","match","issue","inBody","url","botUsers","JulienBreux","ORNIKAR_EMAIL_DOMAIN","TheR3aLp3nGuinJM","abarreir","damienorny","darame07","Pixy","machartier","HugoGarrido","CorentinAndre","Mxime","vlbr","mdcarter","ChibiBlasphem","PSniezak","design","jperriere","CoralineColasse","Lenamari","loicleser","ops","logins","backends","frontends","description","duplicate","documentation","rfc","bug","enhancement","question","wontfix","chrisconfig","accountConfigs","ornikar","reviewflow","defaultDmSettings","cache","Map","getDefaultDmSettings","accountConfig","defaultConfig","updateCache","userId","newSettings","orgCache","set","getUserDmSettings","mongoStores","orgId","orgDefaultDmSettings","userDmSettingsConfig","userDmSettings","findOne","settings","syncOrg","github","installationId","orgInStore","upsertOne","_id","orgEmbed","memberIds","Promise","all","paginate","listMembers","endpoint","merge","member","push","orgMembers","type","deleteMany","$not","$in","syncTeams","teamIds","team","orgTeams","slug","dmMessages","orgSettings","octokitApp","find","o","params","findByKey","installation","apps","getOrgInstallation","catch","err","width","Object","entries","key","__html","patch","bodyParser","json","body","collection","updateOne","$set","value","updated","$setOnInsert","created","upsert","repository","repos","per_page","repo","owner","length","permissions","admin","data2","getRepoInstallation","syncUser","userInfo","userSettings","u","getUserInstallation","username","appRouter","app","getRouter","use","cookieParser","ExcludesFalsy","Boolean","ExcludesNullish","getOrCreateAccount","accountInfo","getKeys","keys","emojiRegex","createEmojiRegex","getEmojiFromRepoDescription","startsWith","emoji","exec","voidTeamSlack","mention","postMessage","resolve","updateMessage","deleteMessage","addReaction","updateHome","initTeamSlack","slackHome","context","account","payload","slackToken","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackEmails","values","slackClient","WebClient","membersInDb","findAll","members","foundEmailMembers","forEach","email","m","slack","im","missingEmails","filter","includes","memberEmailToMemberId","page","profile","has","partialUpdateMany","conversations","open","channel","console","membersMap","getUserFromGithubLogin","githubLogin","category","githubId","message","log","debug","DRY_RUN","chat","text","blocks","attachments","secondaryBlocks","thread_ts","ts","ok","update","delete","reactions","add","timestamp","scheduleUpdateMember","octokit","initAccountContext","appContext","slackPromise","githubLoginToGroup","githubLoginToTeams","teamName","getReviewerGroups","githubLogins","Set","lock","Lock","accountEmbed","accountType","callback","reject","logInfos","info","createReleaseCallback","release","getReviewerGroup","getTeamsForLogin","approveShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","some","group","accountContextsPromise","accountContexts","obtainAccountContext","existingAccountContext","existingPromise","promise","then","accountContext","handlerOrgChange","organization","createHandlerOrgChange","options","optionsRegexps","option","regexp","RegExp","optionsLabels","label","parseOptions","content","defaultOptions","parseCommitNotes","commitNotes","replace","trim","parseBody","hasLabelInPR","prLabels","l","hasFailedStatusOrChecks","pr","checks","listForRef","ref","head","sha","failedChecks","check_runs","check","conclusion","combinedStatus","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","pullRequest","repoContext","reviewflowPrContext","autoMergeLabel","removePrFromAutomergeQueue","number","isRenovatePr","createMergeLockPrFromPr","branch","addLog","action","repoFullName","full_name","automergeLogs","insertOne","isRenovate","mergeableState","mergeable_state","hasNeedsReview","hasRequestedReview","requested_reviewers","lockedPr","getMergeLockedPr","String","prId","prNumber","pushAutomergeQueue","addMergeLockPr","mergeable","prResult","pulls","pull_number","merged","reschedule","renovateRebaseBody","issues","issue_number","base","parsedBody","commentBody","mergeResult","merge_method","commit_title","commit_message","defaultCommentBody","toMarkdownOptions","join","toMarkdownInfos","infos","getReplacement","updateOptions","optionsToUpdate","internalUpdateBodyOptionsAndInfos","infosAndCommitNotesParagraph","createCommentBody","updateCommentOptions","updatedOptions","updateCommentBodyInfos","updateCommentBodyCommitsNotes","removeDeprecatedReviewflowInPrBody","prBody","createReviewflowComment","pullRequestNumber","createComment","getReviewflowCommentById","commentId","getComment","comment_id","getReviewflowPrContext","reviewflowCommentPromise","prEmbed","comment","reviewflowPr","prs","repoEmbed","existing","partialUpdateByKey","fetchPr","getLabelsForRepo","listLabelsForRepo","initRepoLabels","finalLabels","labelKey","labelConfig","labelColor","slice","existingLabel","createLabel","current_name","updateLabel","shouldIgnoreRepo","repoName","ignoreRepoRegexp","test","createGetReviewLabelIds","shouldIgnore","reviewGroupNames","initRepoContext","fullName","repoEmoji","getReviewLabelIds","needsReviewLabelIds","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","protectedLabelIds","labelIdToGroupName","reviewGroupLabels","lockMergePr","automergeQueue","lockPR","prOrPrIssueId","setTimeout","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","reason","shift","previousLength","p","lockPullRequest","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","warn","createRepoHandler","createPullRequestHandler","getPullRequestInPayload","callbackPr","callbackBeforeLock","createPullRequestsHandler","getPrs","checkrunCompleted","on","check_run","pull_requests","updatedPr","checksuiteCompleted","check_suite","createStatus","createCommitStatus","target_url","addStatusCheck","previousSha","hasPrCheck","head_sha","started_at","created_at","completed_at","toISOString","output","updateStatusCheckFromLabels","createFailedStatusCheck","rr","needsReviewGroupNames","updateReviewStatus","reviewGroup","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toAddNames","toDelete","toDeleteNames","getLabelFromKey","reviewConfig","prLabel","size","addLabels","toDeleteName","removeLabel","newLabelNamesArray","oldLabels","setLabels","closed","pull_request","isNotFork","git","deleteRef","assignees","assignee","createLink","createPrLink","html_url","createMrkdwnSectionBlock","createSlackMessageWithSecondaryBlock","secondaryBlockText","getPullRequestFromPayload","getReviewersAndReviewStates","userIds","reviewers","reviewStatesByUser","listReviews","reviews","toUpperCase","reviewStates","dismissed","reviewer","checkIfUserIsBot","checkIfIsThisBot","parse","issueParser","actions","issuePrefixes","parseMentions","mentions","slackifyCommentBody","multipleLines","slackifyMarkdown","getDiscussion","in_reply_to_id","listComments","c","getMentions","discussion","getUsersInThread","prCommentCreated","saveInDb","results","filtered","slackSentMessages","typeId","sentTo","pull_request_review_id","commentByOwner","followers","f","usersInThread","prUrl","slackUtils","ownerMention","commentLink","createMessage","toOwner","ownerPart","promisesOwner","promisesNotOwner","slackifiedBody","start_line","isBotUser","slackMessage","follower","updatePrCommentBody","newBody","updateComment","updatePrCommentBodyIfNeeded","updatePrCommentBodyOptions","syncLabel","shouldHaveLabel","prHasLabel","onRemove","onAdd","response","calcDefaultOptions","featureBranchLabel","automergeLabel","skipCiLabel","prHasFeatureBranchLabel","prHasSkipCiLabel","prHasAutoMergeLabel","syncLabelsAfterCommentBodyEdited","prCommentEditedOrDeleted","sender","closed_at","criteria","sentMessages","sentMessage","readCommitsAndUpdateInfos","commits","listCommits","conventionalCommits","commit","breakingChangesCommits","index","breakingChangesNotes","notes","note","breakingChangesLabel","newCommentBody","cleanNewLines","checkIfHasDiff","text1","text2","updatePrIfNeeded","hasDiffInTitle","hasDiffInBody","diff","cleanTitle","s","arg1","arg2","toLowerCase","editOpenedPR","shouldUpdateCommentBodyInfos","isPrFromBot","errorRule","rule","date","hasLintPrCheck","promises","commentBodyInfos","shouldCreateCommentBody","edited","updatedPullRequest","updateBranch","isFromRenovate","labelsChanged","fromRenovate","codeApprovedLabel","autoMergeSkipCiLabel","createReview","event","updateBranchLabel","autoApproveAndAutoMerge","autoAssignPRToCreator","addAssignees","opened","reviewDismissed","hasChangesRequestedInReviews","hasApprovals","hasRequestedReviewsForGroup","reviewRequestRemoved","requested_reviewer","hasApprovedInReviews","sentMessageRequestedReview","split","deleteOne","reviewRequested","getEmojiFromState","reviewSubmitted","reviewUrl","reviewByOwner","newLabels","isSameBranch","branches","b","synchronize","before","repoEdited","initApp","openedHandler","editedHandler","closedHandler","reopenedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","synchronizeHandler","commentCreated","commentEditedOrDeleted","MONGO_DB","init","MONGO_HOST","MONGO_PORT","MONGO_USER","MONGO_PASSWORD","connection","MongoConnection","MongoStore","coll","createIndex","unique","$lt","createSlackHomeWorker","updateMember","prsWithRequestedReviews","prsToMerge","prsWithRequestedChanges","prsInDraft","search","issuesAndPullRequests","q","sort","order","buildBlocks","total_count","items","repository_url","prFullName","elements","draft","image_url","avatar_url","alt_text","flat","views","publish","user_id","view","workerInterval","queueKeys","queue","stop","clearInterval","start","setInterval","item","memberId","scheduleUpdateOrg","cursor","scheduleUpdateAllOrgs","run","mongoInit"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index-node10.cjs.js","sources":["../src/auth/github.ts","../src/views/Layout.tsx","../src/app/auth.tsx","../src/app/home.tsx","../src/accountConfigs/christophehurpeau.ts","../src/accountConfigs/defaultConfig.ts","../src/accountConfigs/ornikar.ts","../src/accountConfigs/reviewflow.ts","../src/accountConfigs/index.ts","../src/dm/defaultDmSettings.ts","../src/dm/getUserDmSettings.ts","../src/events/account-handlers/actions/syncOrg.ts","../src/events/account-handlers/actions/syncTeams.ts","../src/app/org-settings.tsx","../src/app/repository.tsx","../src/events/account-handlers/actions/syncUser.ts","../src/app/user-settings.tsx","../src/appRouter.tsx","../src/utils/Excludes.ts","../src/context/getOrCreateAccount.ts","../src/context/utils.ts","../src/context/voidTeamSlack.ts","../src/context/initTeamSlack.ts","../src/context/accountContext.ts","../src/events/account-handlers/utils/handler.ts","../src/events/pr-handlers/actions/utils/body/prOptions.ts","../src/events/pr-handlers/actions/utils/body/parseBody.ts","../src/events/pr-handlers/actions/utils/hasLabelInPR.ts","../src/events/pr-handlers/actions/autoMergeIfPossible.ts","../src/events/pr-handlers/actions/utils/body/updateBody.ts","../src/events/pr-handlers/utils/reviewflowComment.ts","../src/events/pr-handlers/utils/createPullRequestContext.ts","../src/events/pr-handlers/utils/fetchPr.ts","../src/context/initRepoLabels.ts","../src/context/repoContext.ts","../src/events/repository-handlers/utils/createRepoHandler.ts","../src/events/pr-handlers/utils/createPullRequestHandler.ts","../src/events/pr-handlers/checkrunCompleted.ts","../src/events/pr-handlers/checksuiteCompleted.ts","../src/events/pr-handlers/actions/utils/createStatus.ts","../src/events/pr-handlers/actions/updateStatusCheckFromLabels.ts","../src/events/pr-handlers/actions/updateReviewStatus.ts","../src/events/pr-handlers/closed.ts","../src/slack/utils.ts","../src/events/pr-handlers/utils/createSlackMessageWithSecondaryBlock.ts","../src/events/pr-handlers/utils/getPullRequestFromPayload.ts","../src/events/pr-handlers/utils/getReviewersAndReviewStates.ts","../src/events/pr-handlers/utils/isBotUser.ts","../src/events/pr-handlers/utils/parseMentions.ts","../src/events/pr-handlers/utils/slackifyCommentBody.ts","../src/events/pr-handlers/commentCreated.ts","../src/events/pr-handlers/actions/updatePrCommentBody.ts","../src/events/pr-handlers/actions/utils/syncLabel.ts","../src/events/pr-handlers/actions/syncLabelsAfterCommentBodyEdited.ts","../src/events/pr-handlers/commentEditedOrDeleted.ts","../src/events/pr-handlers/actions/readCommitsAndUpdateInfos.ts","../src/events/pr-handlers/actions/updatePr.ts","../src/events/pr-handlers/actions/utils/cleanTitle.ts","../src/events/pr-handlers/actions/editOpenedPR.ts","../src/events/pr-handlers/edited.ts","../src/events/pr-handlers/actions/updateBranch.ts","../src/events/pr-handlers/labelsChanged.ts","../src/events/pr-handlers/actions/autoApproveAndAutoMerge.ts","../src/events/pr-handlers/actions/autoAssignPRToCreator.ts","../src/events/pr-handlers/opened.ts","../src/events/pr-handlers/reopened.ts","../src/events/pr-handlers/reviewDismissed.ts","../src/events/pr-handlers/reviewRequestRemoved.ts","../src/events/pr-handlers/reviewRequested.ts","../src/events/pr-handlers/reviewSubmitted.ts","../src/events/pr-handlers/status.ts","../src/events/pr-handlers/synchronize.ts","../src/events/repository-handlers/repoEdited.ts","../src/initApp.ts","../src/mongo.ts","../src/slack/home.ts","../src/index.ts"],"sourcesContent":["import { create } from 'simple-oauth2';\n\nif (!process.env.GITHUB_CLIENT_ID) {\n throw new Error('Missing env variable: GITHUB_CLIENT_ID');\n}\n\nif (!process.env.GITHUB_CLIENT_SECRET) {\n throw new Error('Missing env variable: GITHUB_CLIENT_SECRET');\n}\n\nexport const oauth2 = create({\n client: {\n id: process.env.GITHUB_CLIENT_ID,\n secret: process.env.GITHUB_CLIENT_SECRET,\n },\n auth: {\n tokenHost: 'https://github.com',\n tokenPath: '/login/oauth/access_token',\n authorizePath: '/login/oauth/authorize',\n },\n});\n","import type { ReactElement, ReactNode } from 'react';\nimport React from 'react';\n\ninterface LayoutProps {\n lang?: string;\n title?: string;\n children: ReactNode;\n}\n\nexport default function Layout({\n lang = 'en',\n title = process.env.REVIEWFLOW_NAME,\n children,\n}: LayoutProps): ReactElement {\n return (\n \n \n \n \n {title}\n \n \n \n \n
{children}
\n \n \n );\n}\n","import { promisify } from 'util';\nimport { Octokit } from '@octokit/rest';\nimport type { Router, Request, Response } from 'express';\nimport { sign, verify } from 'jsonwebtoken';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport * as githubAuth from '../auth/github';\nimport Layout from '../views/Layout';\n\nif (!process.env.AUTH_SECRET_KEY) {\n throw new Error('Missing env variable: AUTH_SECRET_KEY');\n}\n\nconst AUTH_SECRET_KEY: string = process.env.AUTH_SECRET_KEY;\n\nconst signPromisified: any = promisify(sign);\nconst verifyPromisified: any = promisify(verify);\n\nconst secure =\n !!process.env.SECURE_COOKIE && process.env.SECURE_COOKIE !== 'false';\n\nconst createRedirectUri = (req: Request): string => {\n const host = `http${secure ? 's' : ''}://${req.hostname}${\n req.hostname === 'localhost' ? `:${process.env.PORT}` : ''\n }`;\n return `${host}/app/login-response`;\n};\n\ninterface AuthInfo {\n id: number;\n login: string;\n accessToken: string;\n time: number;\n}\n\nconst readAuthCookie = (\n req: Request,\n strategy: string,\n): undefined | Promise => {\n const cookie = req.cookies[`auth_${strategy}`];\n if (!cookie) return;\n\n return verifyPromisified(cookie, AUTH_SECRET_KEY, {\n algorithm: 'HS512',\n audience: req.headers['user-agent'],\n });\n};\n\nconst getAuthInfoFromCookie = async (\n req: Request,\n res: Response,\n): Promise => {\n const strategy = 'gh'; // req.params.strategy\n const authInfo = await readAuthCookie(req, strategy);\n\n if (authInfo?.id) {\n return authInfo;\n }\n\n res.clearCookie(`auth_${strategy}`);\n return undefined;\n};\n\nfunction createApi(accessToken: string): Octokit {\n return new Octokit({ auth: accessToken });\n}\n\nexport const getUser = async (\n req: Request,\n res: Response,\n): Promise<{\n authInfo: AuthInfo;\n api: Octokit;\n} | null> => {\n const authInfo = await getAuthInfoFromCookie(req, res);\n if (!authInfo) {\n res.redirect('/app/login');\n return null;\n }\n\n const api = createApi(authInfo.accessToken);\n\n return {\n authInfo,\n api,\n };\n};\n\nexport default function auth(router: Router): void {\n router.get('/login', async (req: Request, res: Response) => {\n if (await getAuthInfoFromCookie(req, res)) {\n return res.redirect('/app');\n }\n\n // const state = await randomHex(8);\n // res.cookie(`auth_${strategy}_${state}`, strategy, {\n // maxAge: 10 * 60 * 1000,\n // httpOnly: true,\n // secure,\n // });\n\n const redirectUri = githubAuth.oauth2.authorizationCode.authorizeURL({\n redirect_uri: createRedirectUri(req),\n scope: 'read:user,repo',\n // state,\n // grant_type: options.grantType,\n // access_type: options.accessType,\n // login_hint: req.query.loginHint,\n // include_granted_scopes: options.includeGrantedScopes,\n });\n\n // console.log(redirectUri);\n\n res.redirect(redirectUri);\n });\n\n router.get('/login-response', async (req, res) => {\n if (req.query.error) {\n res.send(req.query.error_description);\n return;\n }\n\n const strategy = 'gh';\n const code: string = req.query.code as string;\n // const state = req.query.state;\n // const cookieName = `auth_${strategy}_${state}`;\n // const cookie = req.cookies && req.cookies[cookieName];\n // if (!cookie) {\n // // res.redirect(`/${strategy}/login`);\n // res.send(\n // 'No cookie for this state. Retry ?',\n // );\n // return;\n // }\n // res.clearCookie(cookieName);\n\n const result = await githubAuth.oauth2.authorizationCode.getToken({\n code,\n redirect_uri: createRedirectUri(req),\n });\n\n if (!result) {\n res.send(\n renderToStaticMarkup(\n \n
\n Could not get access token. Retry ?\n
\n
,\n ),\n );\n return;\n }\n\n const accessToken = result.access_token;\n const api = createApi(accessToken);\n const user = await api.users.getAuthenticated({});\n const id = user.data.id;\n const login = user.data.login;\n\n const authInfo: AuthInfo = { id, login, accessToken, time: Date.now() };\n const token = await signPromisified(authInfo, AUTH_SECRET_KEY, {\n algorithm: 'HS512',\n audience: req.headers['user-agent'],\n expiresIn: '10 days',\n });\n\n res.cookie(`auth_${strategy}`, token, {\n httpOnly: true,\n secure,\n });\n\n res.redirect('/app');\n });\n}\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function home(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{process.env.REVIEWFLOW_NAME}

\n
\n
\n

Choose your account

\n \n
\n
\n
\n
,\n ),\n );\n });\n}\n","import type { 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 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 'merge/skip-ci': {\n name: 'automerge/skip-ci',\n color: '#e1e8ed',\n },\n 'merge/update-branch': {\n name: ':arrows_counterclockwise: update branch',\n color: '#64DD17',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n\n /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n color: '#ef7934',\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 type { Config } from './types';\n\nconst config: Config = {\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 groups: {},\n waitForGroups: {},\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 /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n color: '#ef7934',\n },\n },\n\n review: {\n ci: {\n inProgress: 'ci/in-progress',\n succeeded: 'ci/success',\n failed: 'ci/fail',\n },\n },\n },\n};\n\nexport default config;\n","import type { Config } from './types';\n\nconst config: Config<'dev' | 'design', 'ops' | 'frontends' | 'backends'> = {\n autoAssignToCreator: true,\n trimTitle: true,\n ignoreRepoPattern: '(infra-.*|devenv)',\n requiresReviewRequest: true,\n autoMergeRenovateWithSkipCi: 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 bot: false,\n regExp: /\\s([A-Z][\\dA-Z]+-(\\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 botUsers: ['michael-robot'],\n\n groups: {\n dev: {\n /* ops */\n JulienBreux: `julien.breux${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n TheR3aLp3nGuinJM: `jean-michel${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n\n /* back */\n abarreir: `alexandre${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 machartier: `marie-anne${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n\n /* front */\n christophehurpeau: `christophe${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n HugoGarrido: `hugo${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n CorentinAndre: `corentin${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n Mxime: `maxime${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n vlbr: `valerian${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'budet-b': `benjamin.budet${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n mdcarter: `maxime.dehaye${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n ChibiBlasphem: `christopher${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n PSniezak: `paul.sniezak${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 Lenamari: `lena${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n loicleser: null,\n },\n },\n\n teams: {\n ops: {\n logins: ['JulienBreux', 'Alan-pad', 'CamilSadiki', 'busser'],\n labels: ['teams/ops'],\n },\n\n backends: {\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n 'Radyum',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'vlbr',\n 'budet-b',\n 'mdcarter',\n 'ChibiBlasphem',\n 'PSniezak',\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 'teams/ops': {\n name: 'ops',\n color: '#003b55',\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 'merge/skip-ci': {\n name: 'automerge/skip-ci',\n color: '#e1e8ed',\n },\n 'merge/update-branch': {\n name: ':arrows_counterclockwise: update branch',\n color: '#e1e8ed',\n },\n\n /* feature-branch */\n 'feature-branch': {\n name: 'feature-branch',\n color: '#7FCEFF',\n },\n\n /* infos */\n 'breaking-changes': {\n name: ':warning: Breaking Changes',\n description: 'This issue or pull request will need a new major version',\n color: '#FF6F00',\n },\n duplicate: {\n name: 'duplicate',\n description: 'This issue or pull request already exists',\n color: '#ECEFF1',\n },\n documentation: {\n name: 'documentation',\n description: 'Improvements or additions to documentation',\n color: '#7FCEFF',\n },\n rfc: {\n name: 'RFC',\n description: 'Request For Comments',\n color: '#FFD3B2',\n },\n bug: {\n name: 'bug',\n description: \"Something isn't working\",\n color: '#FF3D00',\n },\n enhancement: {\n name: 'enhancement',\n description: 'New feature or request',\n color: '#7FCEFF',\n },\n 'help-wanted': {\n name: 'help wanted',\n description: 'Extra attention is needed',\n color: '#B1EE8B',\n },\n question: {\n name: 'question',\n description: 'Further information is requested',\n color: '#F860A4',\n },\n wontfix: {\n name: 'wontfix',\n description: 'This will not be worked on',\n color: '#ECEFF1',\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 chrisconfig from './christophehurpeau';\nimport type { Config } from './types';\n\nconst config: Config<'dev', never> = {\n ...chrisconfig,\n requiresReviewRequest: true,\n groups: {\n dev: {\n christophehurpeau: 'christophe@hurpeau.com',\n 'chris-reviewflow': 'christophe.hurpeau+reviewflow@gmail.com',\n },\n },\n};\nexport default config;\n","import christophehurpeau from './christophehurpeau';\nimport defaultConfig from './defaultConfig';\nimport ornikar from './ornikar';\nimport reviewflow from './reviewflow';\nimport type { Config as ConfigType } from './types';\n\nexport type Config<\n GroupNames extends string = any,\n TeamNames extends string = any\n> = ConfigType;\n\nexport const accountConfigs: { [owner: string]: Config } = {\n ornikar,\n christophehurpeau,\n reviewflow,\n};\n\nexport { defaultConfig };\n\n// flat requires node 11\n// export const getMembers = (\n// groups: Record,\n// ): string[] => {\n// return Object.values(groups).flat(1);\n// };\n","import type { MessageCategory } from './MessageCategory';\n\nexport const defaultDmSettings: Record = {\n 'pr-review': true,\n 'pr-review-follow': true,\n 'pr-comment': true,\n 'pr-comment-bots': true,\n 'pr-comment-follow': true,\n 'pr-comment-follow-bots': false,\n 'pr-comment-mention': true,\n 'pr-comment-thread': true,\n 'pr-merge-conflicts': true,\n 'issue-comment-mention': true,\n};\n","import { accountConfigs, defaultConfig } from '../accountConfigs';\nimport type { MongoStores } from '../mongo';\nimport type { MessageCategory } from './MessageCategory';\nimport { defaultDmSettings } from './defaultDmSettings';\n\nexport type UserDmSettings = Record;\nconst cache = new Map>();\n\nconst getDefaultDmSettings = (org: string): UserDmSettings => {\n const accountConfig = accountConfigs[org] || defaultConfig;\n return accountConfig.defaultDmSettings\n ? { ...defaultDmSettings, ...accountConfig.defaultDmSettings }\n : defaultDmSettings;\n};\n\nexport const updateCache = (\n org: string,\n userId: number,\n newSettings: Partial,\n): void => {\n let orgCache = cache.get(org);\n if (!orgCache) {\n orgCache = new Map();\n cache.set(org, orgCache);\n }\n orgCache.set(userId, { ...getDefaultDmSettings(org), ...newSettings });\n};\n\nexport const getUserDmSettings = async (\n mongoStores: MongoStores,\n org: string,\n orgId: number,\n userId: number,\n): Promise => {\n const orgDefaultDmSettings = getDefaultDmSettings(org);\n\n const userDmSettingsConfig = await mongoStores.userDmSettings.findOne({\n orgId,\n userId,\n });\n\n const config = userDmSettingsConfig\n ? {\n ...orgDefaultDmSettings,\n ...userDmSettingsConfig.settings,\n }\n : orgDefaultDmSettings;\n\n updateCache(org, userId, config);\n return config;\n};\n","import type { Octokit } from '@octokit/core';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { MongoStores, Org } from '../../../mongo';\n\ninterface OrgInfo {\n login: string;\n id: number;\n}\n\nexport const syncOrg = async (\n mongoStores: MongoStores,\n github: Octokit,\n installationId: number,\n org: OrgInfo,\n): Promise => {\n const orgInStore = await mongoStores.orgs.upsertOne({\n _id: org.id as any, // TODO _id is number\n login: org.login,\n installationId,\n });\n\n const orgEmbed = { id: org.id, login: org.login };\n\n const memberIds: number[] = [];\n\n await Promise.all(\n await github.paginate(\n github.orgs.listMembers.endpoint.merge({\n org: org.login,\n }),\n ({\n data,\n }: RestEndpointMethodTypes['orgs']['listMembers']['response']) => {\n return Promise.all(\n data.map(async (member) => {\n memberIds.push(member.id);\n return Promise.all([\n mongoStores.orgMembers.upsertOne({\n _id: `${org.id}_${member.id}`,\n org: orgEmbed,\n user: {\n id: member.id,\n login: member.login,\n },\n }),\n mongoStores.users.upsertOne({\n _id: member.id as any,\n login: member.login,\n type: member.type,\n }),\n ]);\n }),\n );\n },\n ),\n );\n\n await mongoStores.orgMembers.deleteMany({\n 'org.id': org.id,\n 'user.id': { $not: { $in: memberIds } },\n });\n\n return orgInStore;\n};\n","import type { Octokit } from '@octokit/core';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { MongoStores } from '../../../mongo';\n\nexport const syncTeams = async (\n mongoStores: MongoStores,\n github: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const orgEmbed = { id: org.id, login: org.login };\n\n const teamIds: number[] = [];\n\n await Promise.all(\n await github.paginate(\n github.teams.list.endpoint.merge({\n org: org.login,\n }),\n ({ data }: RestEndpointMethodTypes['teams']['list']['response']) => {\n return Promise.all(\n data.map((team) => {\n teamIds.push(team.id);\n return mongoStores.orgTeams.upsertOne({\n _id: team.id,\n org: orgEmbed,\n name: team.name,\n slug: team.slug,\n description: team.description,\n });\n }),\n );\n },\n ),\n );\n\n await mongoStores.orgTeams.deleteMany({\n 'org.id': org.id,\n _id: { $not: { $in: teamIds } },\n });\n};\n","import bodyParser from 'body-parser';\nimport type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { accountConfigs } from '../accountConfigs';\nimport type { MessageCategory } from '../dm/MessageCategory';\nimport { getUserDmSettings, updateCache } from '../dm/getUserDmSettings';\nimport { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeams } from '../events/account-handlers/actions/syncTeams';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nconst dmMessages: Record = {\n 'pr-review': 'You are assigned to a review, someone reviewed your PR',\n 'pr-review-follow': \"Someone reviewed a PR you're also reviewing\",\n 'pr-comment': 'Someone commented on your PR',\n 'pr-comment-bots': 'A bot commented on your PR',\n 'pr-comment-follow': \"Someone commented on a PR you're reviewing\",\n 'pr-comment-follow-bots': \"A bot commented on a PR you're reviewing\",\n 'pr-comment-mention': 'Someone mentioned you in a PR',\n 'pr-comment-thread': \"Someone replied to a discussion you're in\",\n 'pr-merge-conflicts': 'Your PR has a merge conflict (not implemented)',\n 'issue-comment-mention':\n 'Someone mentioned you in an issue (not implemented)',\n};\n\nexport default function orgSettings(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/org/:org/force-sync', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n const o = await mongoStores.orgs.findByKey(org.id);\n if (!o) return res.redirect('/app');\n\n await syncOrg(mongoStores, user.api, o.installationId as number, org);\n await syncTeams(mongoStores, user.api, org);\n\n res.redirect(`/app/org/${req.params.org}`);\n });\n\n router.get('/org/:org', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n const installation = await octokitApp.apps\n .getOrgInstallation({ org: org.login })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!installation) {\n return res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed for this user. Go to \"}\n \n Github Configuration\n {' '}\n to install it.\n
\n
,\n ),\n );\n }\n\n const accountConfig = accountConfigs[org.login];\n const userDmSettings = await getUserDmSettings(\n mongoStores,\n org.login,\n org.id,\n user.authInfo.id,\n );\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{process.env.REVIEWFLOW_NAME}

\n
\n

{org.login}

\n Switch account\n
\n\n
\n
\n

Information

\n {!accountConfig\n ? 'Default config is used: https://github.com/christophehurpeau/reviewflow/blob/master/src/accountConfigs/defaultConfig.ts'\n : `Custom config: https://github.com/christophehurpeau/reviewflow/blob/master/src/accountConfigs/${org.login}.ts`}\n
\n
\n

My DM Settings

\n {Object.entries(dmMessages).map(([key, name]) => (\n
\n \n
\n ))}\n
\n
\n
\n
,\n ),\n );\n });\n\n router.patch('/org/:org', bodyParser.json(), async (req, res) => {\n if (!req.body) {\n res.status(400).send('not ok');\n return;\n }\n\n const user = await getUser(req, res);\n if (!user) return;\n\n const orgs = await user.api.orgs.listForAuthenticatedUser();\n const org = orgs.data.find((o) => o.login === req.params.org);\n if (!org) return res.redirect('/app');\n\n (await mongoStores.userDmSettings.collection).updateOne(\n {\n _id: `${org.id}_${user.authInfo.id}`,\n },\n {\n $set: {\n [`settings.${req.body.key}`]: req.body.value,\n updated: new Date(),\n },\n $setOnInsert: {\n orgId: org.id,\n userId: user.authInfo.id,\n created: new Date(),\n },\n },\n { upsert: true },\n );\n\n const userDmSettingsConfig = await mongoStores.userDmSettings.findOne({\n orgId: org.id,\n userId: user.authInfo.id,\n });\n\n if (userDmSettingsConfig) {\n updateCache(org.login, user.authInfo.id, userDmSettingsConfig.settings);\n }\n\n res.send('ok');\n });\n}\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function repository(\n router: Router,\n octokitApp: InstanceType,\n): void {\n router.get('/repositories', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n const { data } = await user.api.repos.listForAuthenticatedUser({\n per_page: 100,\n });\n\n res.send(\n renderToStaticMarkup(\n \n
\n

Your repositories

\n \n\n {data.length === 100 && (\n
We currently have a limit to 100 repositories
\n )}\n
\n
,\n ),\n );\n });\n\n router.get('/repository/:owner/:repository', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n const { data } = await user.api.repos.get({\n owner: req.params.owner,\n repo: req.params.repository,\n });\n\n if (!data) {\n res.status(404).send(\n renderToStaticMarkup(\n \n
repo not found
\n
,\n ),\n );\n return;\n }\n\n if (!data.permissions || !data.permissions.admin) {\n res.status(401).send(\n renderToStaticMarkup(\n \n
\n not authorized to see this repo, you need to have admin permission\n
\n
,\n ),\n );\n return;\n }\n\n const { data: data2 } = await octokitApp.apps\n .getRepoInstallation({\n owner: req.params.owner,\n repo: req.params.repository,\n })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!data2) {\n res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed on this repo. Go to \"}\n \n Github Configuration\n {' '}\n to add it.\n
\n
,\n ),\n );\n return;\n }\n\n res.send(\n renderToStaticMarkup(\n \n
\n

{req.params.repository}

\n
\n
,\n ),\n );\n });\n}\n","import type { Octokit } from '@octokit/core';\nimport type { MongoStores, User } from '../../../mongo';\n\ninterface UserInfo {\n login: string;\n id: number;\n}\n\nexport const syncUser = async (\n mongoStores: MongoStores,\n github: Octokit,\n installationId: number,\n userInfo: UserInfo,\n): Promise => {\n const user = await mongoStores.users.upsertOne({\n _id: userInfo.id,\n login: userInfo.login,\n type: 'User',\n installationId,\n });\n\n return user;\n};\n","import type { Router } from 'express';\nimport type { ProbotOctokit } from 'probot';\nimport React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { MongoStores } from '../mongo';\nimport Layout from '../views/Layout';\nimport { getUser } from './auth';\n\nexport default function userSettings(\n router: Router,\n octokitApp: InstanceType,\n mongoStores: MongoStores,\n): void {\n router.get('/user/force-sync', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n // const { data: installation } = await api.apps\n // .getUserInstallation({\n // username: user.authInfo.login,\n // })\n // .catch((err) => {\n // return { status: err.status, data: undefined };\n // });\n\n // console.log(installation);\n\n const u = await mongoStores.users.findByKey(user.authInfo.id);\n if (!u || !u.installationId) return res.redirect('/app');\n\n await syncUser(\n mongoStores,\n user.api,\n u.installationId as number,\n user.authInfo,\n );\n\n res.redirect('/app/user');\n });\n\n router.get('/user', async (req, res) => {\n const user = await getUser(req, res);\n if (!user) return;\n\n const { data: installation } = await octokitApp.apps\n .getUserInstallation({\n username: user.authInfo.login,\n })\n .catch((err) => {\n return { status: err.status, data: undefined };\n });\n\n if (!installation) {\n return res.send(\n renderToStaticMarkup(\n \n
\n {process.env.REVIEWFLOW_NAME}{' '}\n {\"isn't installed for this user. Go to \"}\n \n Github Configuration\n {' '}\n to install it.\n
\n
,\n ),\n );\n }\n\n return res.send(\n renderToStaticMarkup(\n \n
{process.env.REVIEWFLOW_NAME} is installed for this user
\n
,\n ),\n );\n });\n}\n","import cookieParser from 'cookie-parser';\nimport type { Probot, run } from 'probot';\nimport auth from './app/auth';\nimport home from './app/home';\nimport orgSettings from './app/org-settings';\nimport repository from './app/repository';\nimport userSettings from './app/user-settings';\nimport type { AppContext } from './context/AppContext';\n\nexport default async function appRouter(\n app: Probot,\n getRouter: Parameters<\n // eslint-disable-next-line @typescript-eslint/ban-types\n Extract[0], Function>\n >[0]['getRouter'],\n { mongoStores }: AppContext,\n): Promise {\n const router = getRouter('/app');\n const octokitApp = await app.auth();\n\n router.use(cookieParser());\n\n auth(router);\n repository(router, octokitApp);\n home(router, octokitApp, mongoStores);\n orgSettings(router, octokitApp, mongoStores);\n userSettings(router, octokitApp, mongoStores);\n}\n","export const ExcludesFalsy = (Boolean as any) as (\n x: T | false | null | undefined,\n) => x is T;\n\nexport const ExcludesNullish = (((res: any) => res !== null) as any) as (\n x: T | null,\n) => x is T;\n","import type { Octokit } from '@octokit/core';\nimport { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeams } from '../events/account-handlers/actions/syncTeams';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { Org, User } from '../mongo';\nimport type { AppContext } from './AppContext';\n\nexport interface AccountInfo {\n id: number;\n login: string;\n type: string;\n}\n\nexport const getOrCreateAccount = async (\n { mongoStores }: AppContext,\n github: Octokit,\n installationId: number,\n accountInfo: AccountInfo,\n): Promise => {\n switch (accountInfo.type) {\n case 'Organization': {\n let org = await mongoStores.orgs.findByKey(accountInfo.id);\n if (org?.installationId) return org;\n\n // TODO diff org vs user...\n org = await syncOrg(mongoStores, github, installationId, accountInfo);\n await syncTeams(mongoStores, github, accountInfo);\n return org;\n }\n\n case 'User': {\n let user = await mongoStores.users.findByKey(accountInfo.id);\n if (user?.installationId) return user;\n\n user = await syncUser(mongoStores, github, installationId, accountInfo);\n return user;\n }\n\n default:\n throw new Error(`Account type not supported ${accountInfo.type}`);\n }\n};\n","import createEmojiRegex from 'emoji-regex';\n\nexport const getKeys = >(\n o: T,\n): (keyof T)[] => Object.keys(o) as (keyof T)[];\n\nconst emojiRegex = createEmojiRegex();\n\nexport const getEmojiFromRepoDescription = (\n description: string | null,\n): string => {\n if (!description) return '';\n if (description.startsWith(':')) {\n const [, emoji] = /^(:\\w+:)/.exec(description) || [];\n return emoji || '';\n }\n const match = emojiRegex.exec(description);\n if (match && description.startsWith(match[0])) return match[0];\n return '';\n};\n","import type { TeamSlack } from './TeamSlack';\n\nexport const voidTeamSlack = (): TeamSlack => ({\n mention: (): string => '',\n postMessage: (): Promise => Promise.resolve(null),\n updateMessage: (): Promise => Promise.resolve(null),\n deleteMessage: (): Promise => Promise.resolve(undefined),\n addReaction: (): Promise => Promise.resolve(undefined),\n updateHome: (): void => undefined,\n});\n","import { WebClient } from '@slack/web-api';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport type { MessageCategory } from '../dm/MessageCategory';\nimport { getUserDmSettings } from '../dm/getUserDmSettings';\nimport type { Org, User } from '../mongo';\nimport type { AppContext } from './AppContext';\nimport type { SlackMessage } from './SlackMessage';\nimport type { TeamSlack, PostSlackMessageResult } from './TeamSlack';\nimport { getKeys } from './utils';\nimport { voidTeamSlack } from './voidTeamSlack';\n\nexport type { TeamSlack };\n\nexport const initTeamSlack = async (\n { mongoStores, slackHome }: AppContext,\n context: Context,\n config: Config,\n account: Org | User,\n): Promise => {\n const owner = context.payload.repository.owner;\n const slackToken = 'slackToken' in account && account.slackToken;\n\n if (!slackToken) {\n return voidTeamSlack();\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 slackEmails = Object.values(githubLoginToSlackEmail);\n const slackClient = new WebClient(slackToken);\n\n const membersInDb = await mongoStores.orgMembers.findAll({\n 'org.id': account._id,\n });\n\n const members: [string, { member: any; im: any }][] = [];\n const foundEmailMembers: string[] = [];\n\n Object.entries(githubLoginToSlackEmail).forEach(([login, email]) => {\n const member = membersInDb.find((m) => m.user.login === login);\n if (member?.slack?.id) {\n foundEmailMembers.push(email);\n members.push([email, { member: { id: member.slack.id }, im: undefined }]);\n }\n });\n\n if (foundEmailMembers.length !== slackEmails.length) {\n const missingEmails = slackEmails.filter(\n (email) => !foundEmailMembers.includes(email),\n );\n\n const memberEmailToMemberId = new Map(\n Object.entries(githubLoginToSlackEmail).map(([login, email]) => [\n email,\n membersInDb.find((m) => m.user.login === login)?._id as any,\n ]),\n );\n\n await slackClient.paginate('users.list', {}, (page: any) => {\n page.members.forEach((member: any) => {\n const email = member.profile?.email;\n if (email && missingEmails.includes(email)) {\n members.push([email, { member, im: undefined }]);\n if (memberEmailToMemberId.has(email)) {\n mongoStores.orgMembers.partialUpdateMany(\n {\n _id: memberEmailToMemberId.get(email),\n },\n { $set: { slack: { id: member.id } } },\n );\n }\n }\n });\n return false;\n });\n }\n\n for (const [, user] of members) {\n try {\n const im: any = await slackClient.conversations.open({\n users: user.member.id,\n });\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): string => {\n const user = getUserFromGithubLogin(githubLogin);\n if (!user) return githubLogin;\n return `<@${user.member.id}>`;\n },\n postMessage: async (\n category: MessageCategory,\n githubId: number,\n githubLogin: string,\n message: SlackMessage,\n ): Promise => {\n context.log.debug(\n {\n category,\n githubLogin,\n message,\n },\n 'slack: post message',\n );\n if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null;\n\n const userDmSettings = await getUserDmSettings(\n mongoStores,\n owner.login,\n owner.id,\n githubId,\n );\n\n if (!userDmSettings[category]) return null;\n\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.im) return null;\n const result = await slackClient.chat.postMessage({\n username: process.env.REVIEWFLOW_NAME,\n channel: user.im.id,\n text: message.text,\n blocks: message.blocks,\n attachments: message.secondaryBlocks\n ? [{ blocks: message.secondaryBlocks }]\n : undefined,\n thread_ts: message.ts,\n });\n if (!result.ok) return null;\n return { ts: result.ts as string, channel: result.channel as string };\n },\n updateMessage: async (\n ts: string,\n channel: string,\n message: SlackMessage,\n ): Promise => {\n context.log.debug({ ts, channel, message }, 'slack: update message');\n if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null;\n\n const result = await slackClient.chat.update({\n ts,\n channel,\n text: message.text,\n blocks: message.blocks,\n attachments: message.secondaryBlocks\n ? [{ blocks: message.secondaryBlocks }]\n : undefined,\n });\n if (!result.ok) return null;\n return { ts: result.ts as string, channel: result.channel as string };\n },\n deleteMessage: async (ts: string, channel: string): Promise => {\n context.log.debug({ ts, channel }, 'slack: delete message');\n await slackClient.chat.delete({\n ts,\n channel,\n });\n },\n addReaction: async (\n ts: string,\n channel: string,\n name: string,\n ): Promise => {\n context.log.debug({ ts, channel, name }, 'slack: add reaction');\n await slackClient.reactions.add({\n timestamp: ts,\n channel,\n name,\n });\n },\n\n updateHome: (githubLogin: string): void => {\n context.log.debug({ githubLogin }, 'update slack home');\n const user = getUserFromGithubLogin(githubLogin);\n if (!user || !user.member) return;\n\n slackHome.scheduleUpdateMember(context.octokit, slackClient, {\n user: { id: null, login: githubLogin },\n org: { id: account._id, login: account.login },\n slack: { id: user.member.id },\n } as any);\n },\n };\n};\n","import { Lock } from 'lock';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport type { Org, User, AccountEmbed, AccountType } from '../mongo';\nimport { ExcludesFalsy } from '../utils/Excludes';\nimport type { AppContext } from './AppContext';\nimport type { AccountInfo } from './getOrCreateAccount';\nimport { getOrCreateAccount } from './getOrCreateAccount';\nimport type { TeamSlack } from './initTeamSlack';\nimport { initTeamSlack } from './initTeamSlack';\nimport { getKeys } from './utils';\n\nexport interface AccountContext<\n GroupNames extends string = any,\n TeamNames extends string = any\n> {\n config: Config;\n accountType: AccountType;\n account: Org | User;\n accountEmbed: AccountEmbed;\n slack: TeamSlack;\n getReviewerGroup: (githubLogin: string) => GroupNames | undefined;\n getReviewerGroups: (githubLogins: string[]) => GroupNames[];\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\n approveShouldWait: (\n reviewerGroup: GroupNames | undefined,\n requestedReviewers: any[],\n {\n includesReviewerGroup,\n includesWaitForGroups,\n }: { includesReviewerGroup?: boolean; includesWaitForGroups?: boolean },\n ) => boolean;\n\n lock: (callback: () => Promise | void) => Promise;\n}\n\nconst initAccountContext = async (\n appContext: AppContext,\n context: Context,\n config: Config,\n accountInfo: AccountInfo,\n): Promise => {\n const account = await getOrCreateAccount(\n appContext,\n context.octokit,\n context.payload.installation.id,\n accountInfo,\n );\n const slackPromise = initTeamSlack(appContext, context, config, account);\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((teamName) => {\n (config.teams as NonNullable)[teamName].logins.forEach(\n (login) => {\n const teams = githubLoginToTeams.get(login);\n if (teams) {\n teams.push(teamName);\n } else {\n githubLoginToTeams.set(login, [teamName]);\n }\n },\n );\n });\n\n const getReviewerGroups = (githubLogins: string[]): string[] => [\n ...new Set(\n githubLogins\n .map((githubLogin) => githubLoginToGroup.get(githubLogin))\n .filter(ExcludesFalsy),\n ),\n ];\n\n const lock = Lock();\n\n return {\n config,\n account,\n accountEmbed: {\n id: accountInfo.id,\n login: accountInfo.login,\n type: accountInfo.type as AccountType,\n },\n accountType: accountInfo.type as AccountType,\n lock: (callback: () => Promise | void): Promise => {\n return new Promise((resolve, reject) => {\n const logInfos = { account: accountInfo.login };\n context.log.info(logInfos, 'lock: try to lock account');\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n lock('_', async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n context.log.info(logInfos, 'lock: lock account acquired');\n try {\n await callback();\n } catch (err) {\n context.log.info(logInfos, 'lock: release account (with error)');\n release();\n reject(err);\n return;\n }\n context.log.info(logInfos, 'lock: release account');\n release();\n resolve();\n });\n });\n },\n getReviewerGroup: (githubLogin): string | undefined =>\n githubLoginToGroup.get(githubLogin),\n getReviewerGroups,\n\n getTeamsForLogin: (githubLogin): string[] =>\n githubLoginToTeams.get(githubLogin) || [],\n\n approveShouldWait: (\n reviewerGroup,\n requestedReviewers,\n { includesReviewerGroup, includesWaitForGroups },\n ): boolean => {\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 accountContextsPromise = new Map();\nconst accountContexts = new Map();\n\nexport const obtainAccountContext = (\n appContext: AppContext,\n context: Context,\n config: Config,\n accountInfo: AccountInfo,\n): Promise => {\n const existingAccountContext = accountContexts.get(accountInfo.login);\n if (existingAccountContext) return existingAccountContext;\n\n const existingPromise = accountContextsPromise.get(accountInfo.login);\n if (existingPromise) return Promise.resolve(existingPromise);\n\n const promise = initAccountContext(appContext, context, config, accountInfo);\n accountContextsPromise.set(accountInfo.login, promise);\n\n return promise.then((accountContext) => {\n accountContextsPromise.delete(accountInfo.login);\n accountContexts.set(accountInfo.login, accountContext);\n return accountContext;\n });\n};\n","import type { Context } from 'probot';\nimport { accountConfigs, defaultConfig } from '../../../accountConfigs';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { AccountContext } from '../../../context/accountContext';\nimport { obtainAccountContext } from '../../../context/accountContext';\n\ntype CallbackContextAndAccountContext = (\n context: Context,\n accountContext: AccountContext,\n) => void | Promise;\n\nexport const handlerOrgChange = async <\n T extends { organization?: { id: number; login: string } }\n>(\n appContext: AppContext,\n context: Context,\n callback: CallbackContextAndAccountContext,\n): Promise => {\n const org = context.payload.organization;\n if (!org) return;\n const config = accountConfigs[org.login] || defaultConfig;\n const accountContext = await obtainAccountContext(\n appContext,\n context,\n config,\n { ...org, type: 'Organization' },\n );\n if (!accountContext) return;\n\n return accountContext.lock(async () => {\n await callback(context, accountContext);\n });\n};\n\nexport const createHandlerOrgChange = <\n T extends { organization?: { id: number; login: string } }\n>(\n appContext: AppContext,\n callback: CallbackContextAndAccountContext,\n) => (context: Context) => {\n return handlerOrgChange(appContext, context, callback);\n};\n","export type OptionsKeys =\n | 'featureBranch'\n | 'autoMergeWithSkipCi'\n | 'autoMerge'\n | 'deleteAfterMerge';\n\nexport type Options = Record;\n\nexport const options: OptionsKeys[] = [\n 'featureBranch',\n 'autoMergeWithSkipCi',\n 'autoMerge',\n 'deleteAfterMerge',\n];\nexport const optionsRegexps: {\n key: OptionsKeys;\n regexp: RegExp;\n}[] = options.map((option) => ({\n key: option,\n regexp: new RegExp(`\\\\[([ xX]?)]\\\\s*`),\n}));\n\nexport const optionsLabels: { key: OptionsKeys; label: string }[] = [\n { key: 'featureBranch', label: 'This PR is a feature branch' },\n {\n key: 'autoMergeWithSkipCi',\n label: 'Add `[skip ci]` on merge commit',\n },\n {\n key: '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 key: 'deleteAfterMerge',\n label: 'Automatic branch delete after this PR is merged',\n },\n];\n","import { optionsRegexps } from './prOptions';\nimport type { Options } from './prOptions';\n\nexport type { Options } from './prOptions';\n\nexport const parseOptions = (\n content: string,\n defaultOptions: Options,\n): Options => {\n return optionsRegexps.reduce((acc, { key, regexp }) => {\n const match = regexp.exec(content);\n acc[key] = !match\n ? defaultOptions[key] || false\n : match[1] === 'x' || match[1] === 'X';\n return acc;\n }, {}) as Options;\n};\n\nexport const parseCommitNotes = (content: string): string => {\n const commitNotes = content.replace(\n /^.*#### Commits Notes:(.*)#### Options:.*$/s,\n '$1',\n );\n\n if (commitNotes === content) {\n return '';\n } else {\n return commitNotes.trim();\n }\n};\n\ninterface ParsedBody {\n options: Options;\n commitNotes: string;\n}\n\nexport const parseBody = (\n content: string,\n defaultOptions: Options,\n): ParsedBody => {\n return {\n options: parseOptions(content, defaultOptions),\n commitNotes: parseCommitNotes(content),\n };\n};\n","import type { PullRequestLabels } from 'events/pr-handlers/utils/PullRequestData';\nimport type { LabelResponse } from '../../../../context/initRepoLabels';\n\nexport default function hasLabelInPR(\n prLabels: PullRequestLabels,\n label: LabelResponse,\n): boolean {\n if (!label) return false;\n return prLabels.some((l): boolean => l.id === label.id);\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { AutomergeLog } from 'mongo';\nimport type {\n PullRequestData,\n PullRequestFromRestEndpoint,\n PullRequestLabels,\n} from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { parseBody } from './utils/body/parseBody';\nimport hasLabelInPR from './utils/hasLabelInPR';\n\nconst hasFailedStatusOrChecks = async (\n pr: PullRequestData,\n context: Context,\n): Promise => {\n const checks = await context.octokit.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(\n {\n checks: failedChecks.map((check) => check.name),\n },\n `automerge not possible: failed check pr ${pr.id}`,\n );\n return true;\n }\n\n const combinedStatus = await context.octokit.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(\n {\n statuses: failedStatuses.map((status) => status.context),\n },\n `automerge not possible: failed status pr ${pr.id}`,\n );\n\n return true;\n }\n\n return false;\n};\n\nexport const autoMergeIfPossible = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n prLabels: PullRequestLabels = pullRequest.labels,\n): Promise => {\n if (reviewflowPrContext === null) return false;\n\n const autoMergeLabel = repoContext.labels['merge/automerge'];\n\n if (!hasLabelInPR(prLabels, autoMergeLabel)) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'no automerge label',\n );\n return false;\n }\n\n const isRenovatePr = pullRequest.head.ref.startsWith('renovate/');\n\n const createMergeLockPrFromPr = () => ({\n id: pullRequest.id,\n number: pullRequest.number,\n branch: pullRequest.head.ref,\n });\n\n if (pullRequest.state !== 'open') {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr is not opened',\n );\n }\n\n const addLog = (\n type: AutomergeLog['type'],\n action: AutomergeLog['action'],\n ): void => {\n const repoFullName = pullRequest.head.repo.full_name;\n context.log.info(`automerge: ${repoFullName}#${pullRequest.id} ${type}`);\n repoContext.appContext.mongoStores.automergeLogs.insertOne({\n account: repoContext.accountEmbed,\n repoFullName,\n pr: {\n id: pullRequest.id,\n number: pullRequest.number,\n isRenovate: isRenovatePr,\n mergeableState: pullRequest.mergeable_state,\n },\n type,\n action,\n });\n };\n\n if (\n repoContext.hasNeedsReview(prLabels) ||\n repoContext.hasRequestedReview(prLabels)\n ) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'blocking labels',\n );\n return false;\n }\n\n if (pullRequest.requested_reviewers.length > 0) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested reviewers',\n );\n return false;\n }\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (lockedPr && String(lockedPr.number) !== String(pullRequest.number)) {\n context.log.info(\n {\n prId: pullRequest.id,\n prNumber: pullRequest.number,\n },\n 'automerge not possible: locked pr',\n );\n repoContext.pushAutomergeQueue(createMergeLockPrFromPr());\n return false;\n }\n\n repoContext.addMergeLockPr(createMergeLockPrFromPr());\n\n if (pullRequest.mergeable == null) {\n const prResult = await context.octokit.pulls.get(\n context.repo({\n pull_number: pullRequest.number,\n }),\n );\n pullRequest = prResult.data;\n }\n\n if (pullRequest.merged) {\n addLog('already merged', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr already merged',\n );\n return false;\n }\n\n context.log.info(\n `automerge?: ${pullRequest.id}, #${pullRequest.number}, mergeable=${pullRequest.mergeable} state=${pullRequest.mergeable_state}`,\n );\n\n // https://github.com/octokit/octokit.net/issues/1763\n if (\n !(\n pullRequest.mergeable_state === 'clean' ||\n pullRequest.mergeable_state === 'has_hooks' ||\n pullRequest.mergeable_state === 'unstable'\n )\n ) {\n if (\n !pullRequest.mergeable_state ||\n pullRequest.mergeable_state === 'unknown'\n ) {\n addLog('unknown mergeable_state', 'reschedule');\n // GitHub is determining whether the pull request is mergeable\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n\n if (isRenovatePr) {\n if (\n pullRequest.mergeable_state === 'behind' ||\n pullRequest.mergeable_state === 'dirty'\n ) {\n addLog('rebase-renovate', 'wait');\n\n // TODO check if has commits not made by renovate https://github.com/ornikar/shared-configs/pull/47#issuecomment-445767120\n if (pullRequest.body.includes('')) {\n if (pullRequest.body.includes('[x] ')) {\n return false;\n }\n\n const renovateRebaseBody = pullRequest.body.replace(\n '[ ] ',\n '[x] ',\n );\n await context.octokit.issues.update(\n context.repo({\n issue_number: pullRequest.number,\n body: renovateRebaseBody,\n }),\n );\n } else if (!pullRequest.title.startsWith('rebase!')) {\n await context.octokit.issues.update(\n context.repo({\n issue_number: pullRequest.number,\n title: `rebase!${pullRequest.title}`,\n }),\n );\n }\n return false;\n }\n\n if (await hasFailedStatusOrChecks(pullRequest, context)) {\n addLog('failed status or checks', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'failed status or checks',\n );\n return false;\n } else if (pullRequest.mergeable_state === 'blocked') {\n addLog('blocked mergeable_state', 'wait');\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=${pullRequest.mergeable_state}`,\n );\n return false;\n }\n\n if (pullRequest.mergeable_state === 'blocked') {\n if (await hasFailedStatusOrChecks(pullRequest, context)) {\n addLog('failed status or checks', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'failed status or checks',\n );\n return false;\n } else {\n addLog('blocked mergeable_state', 'wait');\n // waiting for reschedule in status (pr-handler/status.ts)\n return false;\n }\n }\n\n if (pullRequest.mergeable_state === 'behind') {\n addLog('behind mergeable_state', 'update branch');\n context.log.info(\n {\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n },\n 'automerge not possible: update branch',\n );\n\n await context.octokit.repos.merge({\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n head: pullRequest.base.ref,\n base: pullRequest.head.ref,\n });\n\n return false;\n }\n\n addLog('not mergeable', 'remove');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n `mergeable_state=${pullRequest.mergeable_state}`,\n );\n context.log.info(\n `automerge not possible: not mergeable mergeable_state=${pullRequest.mergeable_state}`,\n );\n return false;\n }\n\n try {\n context.log.info(`automerge pr #${pullRequest.number}`);\n\n const parsedBody = parseBody(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n );\n const options = parsedBody?.options || repoContext.config.prDefaultOptions;\n\n const mergeResult = await context.octokit.pulls.merge({\n merge_method: options.featureBranch ? 'merge' : 'squash',\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n pull_number: pullRequest.number,\n commit_title: options.featureBranch\n ? undefined\n : `${pullRequest.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pullRequest.number})`,\n commit_message: options.featureBranch ? undefined : '', // TODO add BC\n });\n context.log.debug(mergeResult.data, 'merge result:');\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'merged',\n );\n return Boolean('merged' in mergeResult.data && mergeResult.data.merged);\n } catch (err) {\n context.log.info({ errorMessage: err.message }, 'could not merge:');\n repoContext.reschedule(context, createMergeLockPrFromPr());\n return false;\n }\n};\n","import type { StatusInfo } from 'accountConfigs/types';\nimport type { Options } from './parseBody';\nimport { parseOptions } from './parseBody';\nimport { optionsLabels } from './prOptions';\n\nexport const defaultCommentBody = 'This will be auto filled by reviewflow.';\n\nconst toMarkdownOptions = (options: Options) => {\n return optionsLabels\n .map(\n ({ key, label }) =>\n `- [${options[key] ? 'x' : ' '}] ${label}`,\n )\n .join('\\n');\n};\n\nconst toMarkdownInfos = (infos: StatusInfo[]): string => {\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 commentBody: string;\n options?: Options;\n}\n\nconst getReplacement = (infos?: StatusInfo[]): string => {\n if (!infos) return '$1$2';\n return infos.length > 0\n ? `#### Infos:\\n\\n${toMarkdownInfos(infos)}\\n\\n$2`\n : '$2';\n};\n\nconst updateOptions = (\n options: Options,\n optionsToUpdate?: Partial,\n): Options => {\n if (!optionsToUpdate) return options;\n return { ...options, ...optionsToUpdate };\n};\n\nconst internalUpdateBodyOptionsAndInfos = (\n body: string,\n options: Options,\n infos?: StatusInfo[],\n): string => {\n const infosAndCommitNotesParagraph = body.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*)?(#### Commits Notes:.*)?#### Options:)?.*$/s,\n getReplacement(infos),\n );\n\n return `${infosAndCommitNotesParagraph}#### Options:\\n${toMarkdownOptions(\n options,\n )}`;\n};\n\nexport const createCommentBody = (\n defaultOptions: Options,\n infos?: StatusInfo[],\n): string => {\n return internalUpdateBodyOptionsAndInfos('', defaultOptions, infos);\n};\n\nexport const updateCommentOptions = (\n commentBody: string,\n defaultOptions: Options,\n optionsToUpdate?: Partial,\n): UpdatedBodyWithOptions => {\n const options = parseOptions(commentBody, defaultOptions);\n const updatedOptions = updateOptions(options, optionsToUpdate);\n\n return {\n options: updatedOptions,\n commentBody: internalUpdateBodyOptionsAndInfos(commentBody, updatedOptions),\n };\n};\n\nexport const updateCommentBodyInfos = (\n commentBody: string,\n infos?: StatusInfo[],\n): string => {\n return commentBody.replace(\n // * - zero or more\n // *? - zero or more (non-greedy)\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^\\s*(?:(#### Infos:.*?)?(#### Commits Notes:.*?)?(#### Options:.*?)?)?$/s,\n `${getReplacement(infos)}$3`,\n );\n};\n\nexport const updateCommentBodyCommitsNotes = (\n commentBody: string,\n commitNotes?: string,\n): string => {\n return commentBody.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /(?:#### Commits Notes:.*?)?(#### Options:)/s,\n // eslint-disable-next-line no-nested-ternary\n !commitNotes ? '$1' : `#### Commits Notes:\\n\\n${commitNotes}\\n\\n$1`,\n );\n};\n\nexport const removeDeprecatedReviewflowInPrBody = (prBody: string): string => {\n return prBody.replace(\n // eslint-disable-next-line unicorn/no-unsafe-regex\n /^(.*)(.*)(.*)$/is,\n // eslint-disable-next-line no-nested-ternary\n '$1$3',\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\n\nexport const createReviewflowComment = (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n body: string,\n): Promise<\n RestEndpointMethodTypes['issues']['createComment']['response']['data']\n> => {\n return context.octokit.issues\n .createComment(context.repo({ issue_number: pullRequestNumber, body }))\n .then(({ data }) => data);\n};\n\nexport const getReviewflowCommentById = (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n commentId: number,\n): Promise<\n RestEndpointMethodTypes['issues']['getComment']['response']['data'] | null\n> => {\n return context.octokit.issues\n .getComment(\n context.repo({\n issue_number: pullRequestNumber,\n comment_id: commentId,\n }),\n )\n .then(\n ({ data }) => data,\n () => null,\n );\n};\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { ReviewflowPr } from 'mongo';\nimport { defaultCommentBody } from '../actions/utils/body/updateBody';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\nimport {\n createReviewflowComment,\n getReviewflowCommentById,\n} from './reviewflowComment';\n\nexport interface CreatePrContextOptions {\n reviewflowCommentPromise?: ReturnType;\n}\n\nexport interface ReviewflowPrContext {\n reviewflowPr: ReviewflowPr;\n commentBody: string;\n}\n\nexport const getReviewflowPrContext = async (\n pullRequestNumber: PullRequestWithDecentDataFromWebhook['number'],\n context: Context,\n repoContext: RepoContext,\n reviewflowCommentPromise?: ReturnType,\n): Promise => {\n const appContext = repoContext.appContext;\n const prEmbed = { number: pullRequestNumber };\n\n if (reviewflowCommentPromise) {\n const comment = await reviewflowCommentPromise;\n const reviewflowPr = await appContext.mongoStores.prs.insertOne({\n account: repoContext.accountEmbed,\n repo: repoContext.repoEmbed,\n pr: prEmbed,\n commentId: comment.id,\n });\n return { reviewflowPr, commentBody: comment.body };\n }\n\n const existing = await appContext.mongoStores.prs.findOne({\n 'account.id': repoContext.accountEmbed.id,\n 'repo.id': repoContext.repoEmbed.id,\n 'pr.number': pullRequestNumber,\n });\n const comment =\n existing &&\n (await getReviewflowCommentById(\n pullRequestNumber,\n context,\n existing.commentId,\n ));\n\n if (!comment || !existing) {\n const comment = await createReviewflowComment(\n pullRequestNumber,\n context,\n defaultCommentBody,\n );\n\n if (!existing) {\n const reviewflowPr = await appContext.mongoStores.prs.insertOne({\n account: repoContext.accountEmbed,\n repo: repoContext.repoEmbed,\n pr: prEmbed,\n commentId: comment.id,\n });\n return { reviewflowPr, commentBody: comment.body };\n } else {\n await appContext.mongoStores.prs.partialUpdateByKey(existing._id, {\n $set: { commentId: comment.id },\n });\n }\n }\n\n return { reviewflowPr: existing, commentBody: comment!.body };\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\n\nexport const fetchPr = async (\n context: Context,\n prNumber: number,\n): Promise => {\n const prResult = await context.octokit.pulls.get(\n context.repo({ pull_number: prNumber }),\n );\n\n return prResult.data;\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\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 LabelsRecord {\n [key: string]: LabelResponse;\n}\n\nexport const getLabelsForRepo = async (\n context: Context,\n): Promise<\n RestEndpointMethodTypes['issues']['listLabelsForRepo']['response']['data']\n> => {\n const { data: labels } = await context.octokit.issues.listLabelsForRepo(\n context.repo({ per_page: 100 }),\n );\n return labels;\n};\n\nexport const initRepoLabels = async (\n context: Context,\n config: Config,\n): Promise => {\n const labels = await getLabelsForRepo(context);\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 = labelConfig.description\n ? `${labelConfig.description} - Synced by reviewflow`\n : `Synced by reviewflow 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 if (labelKey === 'teams/ops') {\n existingLabel = labels.find((label) => label.name === 'archi');\n }\n }\n\n if (!existingLabel) {\n const result = await context.octokit.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 existingLabel.description !== description\n ) {\n context.log.info(\n {\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 'Needs to update label',\n );\n\n const result = await context.octokit.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","import { Lock } from 'lock';\nimport type { Context } from 'probot';\nimport type { Config } from '../accountConfigs';\nimport { accountConfigs, defaultConfig } from '../accountConfigs';\nimport type { GroupLabels } from '../accountConfigs/types';\n// eslint-disable-next-line import/no-cycle\nimport { autoMergeIfPossible } from '../events/pr-handlers/actions/autoMergeIfPossible';\nimport type {\n PullRequestData,\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../events/pr-handlers/utils/PullRequestData';\nimport { getReviewflowPrContext } from '../events/pr-handlers/utils/createPullRequestContext';\nimport { fetchPr } from '../events/pr-handlers/utils/fetchPr';\nimport { ExcludesFalsy } from '../utils/Excludes';\nimport type { AppContext } from './AppContext';\nimport type { AccountContext } from './accountContext';\nimport { obtainAccountContext } from './accountContext';\nimport type { LabelResponse, LabelsRecord } from './initRepoLabels';\nimport { initRepoLabels } from './initRepoLabels';\nimport { getEmojiFromRepoDescription } from './utils';\n\nexport interface LockedMergePr {\n id: number;\n number: number;\n branch: string;\n}\n\ninterface RepoContextWithoutTeamContext {\n appContext: AppContext;\n repoFullName: string;\n repoEmbed: { id: number; name: string };\n repoEmoji: string | undefined;\n labels: LabelsRecord;\n protectedLabelIds: readonly LabelResponse['id'][];\n shouldIgnore: boolean;\n\n hasNeedsReview: (labels: PullRequestLabels) => boolean;\n hasRequestedReview: (labels: PullRequestLabels) => boolean;\n hasChangesRequestedReview: (labels: PullRequestLabels) => boolean;\n hasApprovesReview: (labels: PullRequestLabels) => boolean;\n getNeedsReviewGroupNames: (labels: PullRequestLabels) => GroupNames[];\n\n lockPullRequest: (\n pullRequest: PullRequestData,\n callback: () => Promise | void,\n ) => Promise;\n\n /** @deprecated */\n lockPR: (\n prId: string,\n prNumber: number,\n callback: () => Promise | void,\n ) => Promise;\n\n getMergeLockedPr: () => LockedMergePr;\n addMergeLockPr: (pr: LockedMergePr) => void;\n removePrFromAutomergeQueue: (\n context: Context,\n prNumber: number,\n reason: string,\n ) => void;\n reschedule: (context: Context, pr: LockedMergePr) => void;\n pushAutomergeQueue: (pr: LockedMergePr) => void;\n}\n\nexport type RepoContext = AccountContext<\n GroupNames\n> &\n RepoContextWithoutTeamContext;\n\nexport const shouldIgnoreRepo = (\n repoName: string,\n accountConfig: Config,\n): boolean => {\n const ignoreRepoRegexp =\n accountConfig.ignoreRepoPattern &&\n new RegExp(`^${accountConfig.ignoreRepoPattern}$`);\n\n if (repoName === 'reviewflow-test') {\n return process.env.REVIEWFLOW_NAME !== 'reviewflow-dev';\n }\n\n if (ignoreRepoRegexp) {\n return ignoreRepoRegexp.test(repoName);\n }\n\n return false;\n};\n\nconst createGetReviewLabelIds = (\n shouldIgnore: boolean,\n config: Config,\n reviewGroupNames: GroupNames[],\n labels: LabelsRecord,\n): ((labelKey: GroupLabels) => number[]) => {\n if (shouldIgnore) return (labelKey: GroupLabels): number[] => [];\n return (labelKey: GroupLabels): number[] =>\n reviewGroupNames\n .map((key) => config.labels.review[key][labelKey])\n .filter(Boolean)\n .map((name) => labels[name].id);\n};\n\nasync function initRepoContext(\n appContext: AppContext,\n context: Context,\n config: Config,\n): Promise> {\n const {\n id,\n name,\n full_name: fullName,\n owner: org,\n description,\n } = context.payload.repository;\n const repoEmoji = getEmojiFromRepoDescription(description);\n\n const accountContext = await obtainAccountContext(\n appContext,\n context,\n config,\n org,\n );\n const repoContext = Object.create(accountContext);\n\n const shouldIgnore = shouldIgnoreRepo(name, config);\n\n const labels = shouldIgnore ? {} : await initRepoLabels(context, config);\n\n const reviewGroupNames = Object.keys(config.groups) as GroupNames[];\n\n const getReviewLabelIds = createGetReviewLabelIds(\n shouldIgnore,\n config,\n reviewGroupNames,\n labels,\n );\n\n const needsReviewLabelIds = getReviewLabelIds('needsReview');\n const requestedReviewLabelIds = getReviewLabelIds('requested');\n const changesRequestedLabelIds = getReviewLabelIds('changesRequested');\n const approvedReviewLabelIds = getReviewLabelIds('approved');\n\n const protectedLabelIds = [\n ...requestedReviewLabelIds,\n ...changesRequestedLabelIds,\n ...approvedReviewLabelIds,\n ];\n\n const labelIdToGroupName = new Map();\n if (!shouldIgnore) {\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\n // const updateStatusCheck = (context, reviewGroup, statusInfo) => {};\n\n const hasNeedsReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => requestedReviewLabelIds.includes(label.id));\n const hasChangesRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => changesRequestedLabelIds.includes(label.id));\n const hasApprovesReview = (labels: PullRequestLabels): boolean =>\n labels.some((label) => approvedReviewLabelIds.includes(label.id));\n\n const getNeedsReviewGroupNames = (labels: PullRequestLabels): 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 lockPR = (\n prOrPrIssueId: string,\n prNumber: number,\n callback: () => Promise | void,\n ): Promise =>\n new Promise((resolve, reject) => {\n const logInfos = {\n repo: fullName,\n prOrPrIssueId,\n prNumber,\n };\n context.log.debug(logInfos, 'lock: try to lock pr');\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n lock(String(prNumber), async (createReleaseCallback) => {\n const release = createReleaseCallback(() => {});\n context.log.info(logInfos, 'lock: lock pr acquired');\n try {\n await callback();\n } catch (err) {\n context.log.info(logInfos, 'lock: release pr (with error)');\n release();\n reject(err);\n return;\n }\n context.log.info(logInfos, 'lock: release pr');\n release();\n resolve();\n });\n });\n\n const lockPullRequest = (\n pullRequest: PullRequestWithDecentData,\n callback: () => Promise | void,\n ): Promise => {\n return lockPR(String(pullRequest.id), pullRequest.number, callback);\n };\n\n const reschedule = (context: Context, pr: LockedMergePr): void => {\n if (!pr) throw new Error('Cannot reschedule undefined');\n context.log.info(pr, 'reschedule');\n setTimeout(() => {\n lockPR('reschedule', -1, () => {\n return lockPR(String(pr.id), pr.number, async () => {\n const [pullRequest, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pr.number),\n getReviewflowPrContext(pr.number, context, repoContext),\n ]);\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n });\n });\n }, 10_000);\n };\n\n return Object.assign(repoContext, {\n appContext,\n labels,\n repoFullName: fullName,\n repoEmbed: { id, name },\n repoEmoji,\n protectedLabelIds,\n shouldIgnore,\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', {\n repo: fullName,\n pr,\n });\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: (\n context,\n prNumber: number | string,\n reason: string,\n ): void => {\n if (lockMergePr && String(lockMergePr.number) === String(prNumber)) {\n lockMergePr = automergeQueue.shift();\n context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`);\n if (lockMergePr) {\n context.log(lockMergePr, `merge lock: next ${fullName}`);\n } else {\n context.log(`merge lock: nothing next ${fullName}`);\n }\n if (lockMergePr) {\n reschedule(context, lockMergePr);\n }\n } else {\n const previousLength = automergeQueue.length;\n automergeQueue = automergeQueue.filter(\n (value) => String(value.number) !== String(prNumber),\n );\n if (automergeQueue.length !== previousLength) {\n context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`);\n }\n }\n },\n pushAutomergeQueue: (pr: LockedMergePr): void => {\n context.log(\n {\n repo: fullName,\n pr,\n lockMergePr,\n automergeQueue,\n },\n 'merge lock: push queue',\n );\n if (!automergeQueue.some((p) => p.number === pr.number)) {\n automergeQueue.push(pr);\n }\n },\n reschedule,\n\n lockPR,\n lockPullRequest,\n } as RepoContextWithoutTeamContext);\n}\n\nconst repoContextsPromise = new Map>();\nconst repoContexts = new Map();\n\nexport const obtainRepoContext = (\n appContext: AppContext,\n context: Context,\n): Promise | RepoContext | null => {\n const repo = context.payload.repository;\n const owner = repo.owner;\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 let accountConfig = accountConfigs[owner.login];\n\n if (!accountConfig) {\n console.warn(`using default config for ${owner.login}`);\n accountConfig = defaultConfig as Config;\n }\n\n const promise = initRepoContext(appContext, context, accountConfig);\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 type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { OnCallback } from 'probot/lib/application';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { RepoContext } from '../../../context/repoContext';\nimport { obtainRepoContext } from '../../../context/repoContext';\n\nexport const createRepoHandler = <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n appContext: AppContext,\n callback: (\n context: Context,\n repoContext: RepoContext,\n ) => Promise | void,\n): OnCallback => {\n return async (context): Promise => {\n const repoContext = await obtainRepoContext(appContext, context);\n if (!repoContext) return;\n\n return callback(context, repoContext);\n };\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { OnCallback } from 'probot/lib/application';\nimport type { AppContext } from '../../../context/AppContext';\nimport type { RepoContext, LockedMergePr } from '../../../context/repoContext';\nimport { createRepoHandler } from '../../repository-handlers/utils/createRepoHandler';\nimport type {\n PullRequestData,\n PullRequestFromWebhook,\n} from './PullRequestData';\nimport type {\n CreatePrContextOptions,\n ReviewflowPrContext,\n} from './createPullRequestContext';\nimport { getReviewflowPrContext } from './createPullRequestContext';\n\nexport type CallbackWithPRAndRepoContext = (\n pullRequest: T,\n repoContext: RepoContext,\n) => void | Promise;\n\nexport const createPullRequestHandler = <\n T extends\n | EventPayloads.WebhookPayloadPullRequest\n | EventPayloads.WebhookPayloadPullRequestReview\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n | EventPayloads.WebhookPayloadPullRequestReviewComment,\n U extends PullRequestFromWebhook\n>(\n appContext: AppContext,\n getPullRequestInPayload: (\n payload: Context['payload'],\n context: Context,\n repoContext: RepoContext,\n ) => U | null,\n callbackPr: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext | null,\n ) => void | Promise,\n callbackBeforeLock?: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n ) => CreatePrContextOptions,\n): OnCallback => {\n return createRepoHandler(appContext, async (context, repoContext) => {\n const pullRequest: U | null = getPullRequestInPayload(\n context.payload,\n context,\n repoContext,\n );\n if (pullRequest === null) return;\n const options = callbackBeforeLock\n ? callbackBeforeLock(pullRequest, context, repoContext)\n : {};\n\n await repoContext.lockPullRequest(pullRequest, async () => {\n /*\n * When repo are ignored, only slack notifications are sent.\n * PR is not linted, commented, nor auto merged.\n */\n const reviewflowPrContext = repoContext.shouldIgnore\n ? null\n : await getReviewflowPrContext(\n pullRequest.number,\n context,\n repoContext,\n options.reviewflowCommentPromise,\n );\n\n return callbackPr(pullRequest, context, repoContext, reviewflowPrContext);\n });\n });\n};\n\nexport const createPullRequestsHandler = <\n T extends { repository: EventPayloads.PayloadRepository },\n U extends PullRequestFromWebhook | LockedMergePr\n>(\n appContext: AppContext,\n getPrs: (payload: Context['payload'], repoContext: RepoContext) => U[],\n callbackPr: (\n pullRequest: U,\n context: Context,\n repoContext: RepoContext,\n ) => void | Promise,\n): OnCallback => {\n return createRepoHandler(appContext, async (context, repoContext) => {\n const prs = getPrs(context.payload, repoContext);\n if (prs.length === 0) return;\n\n await Promise.all(\n prs.map((pr) =>\n repoContext.lockPR(String(pr.id), pr.number, async () => {\n return callbackPr(pr, context, repoContext);\n }),\n ),\n );\n });\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { getReviewflowPrContext } from './utils/createPullRequestContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function checkrunCompleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'check_run.completed',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext) => {\n if (repoContext.shouldIgnore) return [];\n return payload.check_run.pull_requests;\n },\n async (pullRequest, context, repoContext) => {\n const [updatedPr, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pullRequest.number),\n getReviewflowPrContext(pullRequest.number, context, repoContext),\n ]);\n\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { getReviewflowPrContext } from './utils/createPullRequestContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function checksuiteCompleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'check_suite.completed',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext) => {\n if (repoContext.shouldIgnore) return [];\n return payload.check_suite.pull_requests;\n },\n async (pullRequest, context, repoContext) => {\n const [updatedPr, reviewflowPrContext] = await Promise.all([\n fetchPr(context, pullRequest.number),\n getReviewflowPrContext(pullRequest.number, context, repoContext),\n ]);\n\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\n\nexport default async function createStatus<\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n context: Context,\n name: string,\n sha: string,\n type: 'failure' | 'success',\n description: string,\n url?: string,\n): Promise {\n await context.octokit.repos.createCommitStatus(\n context.repo({\n context:\n name === ''\n ? process.env.REVIEWFLOW_NAME\n : `${process.env.REVIEWFLOW_NAME}/${name}`,\n sha,\n state: type,\n description,\n target_url: url,\n }),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport createStatus from './utils/createStatus';\n\nconst addStatusCheck = async function <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n { state, description }: { state: 'failure' | 'success'; description: string },\n previousSha?: string,\n): Promise {\n const hasPrCheck = (\n await context.octokit.checks.listForRef(\n context.repo({\n ref: pullRequest.head.sha,\n }),\n )\n ).data.check_runs.find((check) => check.name === process.env.REVIEWFLOW_NAME);\n\n context.log.debug({ hasPrCheck, state, description }, 'add status check');\n\n if (hasPrCheck) {\n await context.octokit.checks.create(\n context.repo({\n name: process.env.REVIEWFLOW_NAME as string,\n head_sha: pullRequest.head.sha,\n started_at: pullRequest.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 if (previousSha && state === 'failure') {\n await Promise.all([\n createStatus(\n context,\n '',\n previousSha,\n 'success',\n 'New commits have been pushed',\n ),\n createStatus(context, '', pullRequest.head.sha, state, description),\n ]);\n } else {\n await createStatus(context, '', pullRequest.head.sha, state, description);\n }\n};\n\nexport const updateStatusCheckFromLabels = <\n T extends { repository: EventPayloads.PayloadRepository }\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n labels: PullRequestLabels = pullRequest.labels || [],\n previousSha?: string,\n): Promise => {\n context.log.debug(\n {\n labels: labels.map((l) => l?.name),\n hasNeedsReview: repoContext.hasNeedsReview(labels),\n hasApprovesReview: repoContext.hasApprovesReview(labels),\n },\n 'updateStatusCheckFromLabels',\n );\n\n const createFailedStatusCheck = (description: string): Promise =>\n addStatusCheck(\n pullRequest,\n context,\n {\n state: 'failure',\n description,\n },\n previousSha,\n );\n\n if (pullRequest.requested_reviewers.length > 0) {\n return createFailedStatusCheck(\n // TODO remove `as`\n // https://github.com/probot/probot/issues/1219\n `Awaiting review from: ${pullRequest.requested_reviewers\n .map((rr: any) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (repoContext.hasChangesRequestedReview(labels)) {\n return createFailedStatusCheck(\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 `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 '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(\n pullRequest,\n context,\n {\n state: 'success',\n description: '✓ PR ready to merge !',\n },\n previousSha,\n );\n // }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { GroupLabels } from '../../../accountConfigs/types';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport { updateStatusCheckFromLabels } from './updateStatusCheckFromLabels';\n\nexport const updateReviewStatus = async <\n E extends { repository: EventPayloads.PayloadRepository },\n GroupNames extends string = any\n>(\n pullRequest: PullRequestWithDecentData,\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.debug(\n {\n reviewGroup,\n labelsToAdd,\n labelsToRemove,\n },\n 'updateReviewStatus',\n );\n\n let prLabels: PullRequestLabels = pullRequest.labels || [];\n if (!reviewGroup) return prLabels;\n\n const newLabelNames = new Set(prLabels.map((label) => label.name));\n\n const toAdd = new Set();\n const toAddNames = new Set();\n const toDelete = new Set();\n const toDeleteNames = new Set();\n const labels = repoContext.labels;\n\n const getLabelFromKey = (\n key: GroupLabels,\n ): undefined | PullRequestLabels[number] => {\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 toAddNames.add(label.name);\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 toDeleteNames.add(existing.name);\n }\n });\n }\n\n // TODO move that elsewhere\n\n repoContext.getTeamsForLogin(pullRequest.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 toAddNames.add(label.name);\n }\n });\n }\n });\n\n // if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return;\n\n if (toAdd.size !== 0 || toDelete.size !== 0) {\n if (toDelete.size === 0 || toDelete.size < 4) {\n context.log.debug(\n {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n toAddNames: [...toAddNames],\n toDeleteNames: [...toDeleteNames],\n },\n 'updateReviewStatus',\n );\n\n if (toAdd.size !== 0) {\n const result = await context.octokit.issues.addLabels(\n context.issue({\n labels: [...toAddNames],\n }),\n );\n prLabels = result.data;\n }\n\n if (toDelete.size !== 0) {\n for (const toDeleteName of [...toDeleteNames]) {\n try {\n const result = await context.octokit.issues.removeLabel(\n context.issue({\n name: toDeleteName,\n }),\n );\n prLabels = result.data;\n } catch (err) {\n context.log.warn(\n {\n err: err?.message,\n },\n 'error removing label',\n );\n }\n }\n }\n } else {\n const newLabelNamesArray = [...newLabelNames];\n\n context.log.debug(\n {\n reviewGroup,\n toAdd: [...toAdd],\n toDelete: [...toDelete],\n oldLabels: prLabels.map((l) => l.name),\n newLabelNames: newLabelNamesArray,\n },\n 'updateReviewStatus',\n );\n\n const result = await context.octokit.issues.setLabels(\n context.issue({\n labels: newLabelNamesArray,\n }),\n );\n prLabels = result.data;\n }\n }\n\n // if (toAdd.has('needsReview')) {\n // createInProgressStatusCheck(context);\n // } else if (\n // toDelete.has('needsReview') ||\n // (prLabels.length === 0 && toAdd.size === 1 && toAdd.has('approved'))\n // ) {\n await updateStatusCheckFromLabels(\n pullRequest,\n context,\n repoContext,\n prLabels,\n );\n // }\n\n return prLabels;\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseOptions } from './actions/utils/body/parseBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function closed(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.closed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n if (!repoContext.shouldIgnore && reviewflowPrContext) {\n const repo = context.payload.repository;\n\n if (pullRequest.merged) {\n const isNotFork = pullRequest.head.repo.id === repo.id;\n const options = parseOptions(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n );\n\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr closed',\n ),\n isNotFork && options.deleteAfterMerge\n ? context.octokit.git\n .deleteRef(\n context.repo({ ref: `heads/${pullRequest.head.ref}` }),\n )\n .catch(() => {})\n : undefined,\n ]);\n } else {\n await Promise.all([\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'pr closed',\n ),\n updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n remove: ['needsReview'],\n }),\n ]);\n }\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n },\n ),\n );\n}\n","import type { RepoContext } from '../context/repoContext';\n\nexport const createLink = (url: string, text: string): string => {\n return `<${url}|${text}>`;\n};\n\nexport const createPrLink = (\n pr: { html_url: string; number: number },\n repoContext: RepoContext,\n): string => {\n return createLink(\n pr.html_url,\n `${repoContext.repoEmoji ? `${repoContext.repoEmoji} ` : ''}${\n repoContext.repoFullName\n }#${pr.number}`,\n );\n};\n","import type { KnownBlock } from '@slack/web-api';\nimport type { SlackMessage } from '../../../context/SlackMessage';\n\nexport const createMrkdwnSectionBlock = (text: string): KnownBlock => ({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text,\n },\n});\n\nexport const createSlackMessageWithSecondaryBlock = (\n message: string,\n secondaryBlockText?: string | null,\n): SlackMessage => {\n return {\n text: message,\n blocks: [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: message,\n },\n },\n ],\n secondaryBlocks: !secondaryBlockText\n ? undefined\n : [createMrkdwnSectionBlock(secondaryBlockText)],\n };\n};\n","import type { EventPayloads } from '@octokit/webhooks';\n\ntype WebhookPr =\n | EventPayloads.WebhookPayloadPullRequest['pull_request']\n | EventPayloads.WebhookPayloadPullRequestReviewPullRequest;\n\ntype PullRequestHandlerAllowedPayloads =\n | {\n repository: EventPayloads.PayloadRepository;\n pull_request: WebhookPr;\n }\n | {\n repository: EventPayloads.PayloadRepository;\n issue: EventPayloads.WebhookPayloadIssueCommentIssue;\n };\n\nexport type PullRequestFromPayload<\n T extends PullRequestHandlerAllowedPayloads\n> = T extends { pull_request: WebhookPr }\n ? T['pull_request']\n : T extends { issue: EventPayloads.WebhookPayloadIssueCommentIssue }\n ? T['issue'] /* & T['issue']['pull_request'] */\n : never;\n\n/** deprecated */\nexport const getPullRequestFromPayload = <\n T extends PullRequestHandlerAllowedPayloads\n>(\n payload: T,\n): PullRequestFromPayload => {\n const pullRequest: WebhookPr = (payload as any).pull_request;\n if (pullRequest) {\n return pullRequest as PullRequestFromPayload;\n }\n\n const issue = (payload as any).issue;\n if (issue?.pull_request) {\n return {\n ...issue,\n ...issue.pull_request,\n };\n }\n\n throw new Error('No pull_request in payload');\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { Context } from 'probot';\nimport type { RepoContext } from '../../../context/repoContext';\nimport { getKeys } from '../../../context/utils';\n\ntype ReviewState = 'CHANGES_REQUESTED' | 'APPROVED' | 'DISMISSED';\n\ninterface ReviewStates {\n approved: number;\n changesRequested: number;\n dismissed: number;\n}\ninterface Reviewer {\n id: number;\n login: string;\n}\n\nexport const getReviewersAndReviewStates = async (\n context: Context,\n repoContext: RepoContext,\n): Promise<{\n reviewers: Reviewer[];\n reviewStates: Record;\n}> => {\n const userIds = new Set();\n const reviewers: Reviewer[] = [];\n const reviewStatesByUser = new Map();\n\n await context.octokit.paginate(\n context.octokit.pulls.listReviews,\n context.pullRequest(),\n ({\n data: reviews,\n }: RestEndpointMethodTypes['pulls']['listReviews']['response']) => {\n reviews.forEach((review) => {\n if (!userIds.has(review.user.id)) {\n userIds.add(review.user.id);\n reviewers.push({ id: review.user.id, login: review.user.login });\n }\n const state = review.state.toUpperCase();\n if (state !== 'COMMENTED') {\n reviewStatesByUser.set(review.user.id, state as ReviewState);\n }\n });\n\n return [];\n },\n );\n\n const reviewStates: Record = {} as Record<\n GroupNames,\n ReviewStates\n >;\n\n getKeys(repoContext.config.groups).forEach((groupName) => {\n reviewStates[groupName] = {\n approved: 0,\n changesRequested: 0,\n dismissed: 0,\n };\n });\n\n reviewers.forEach((reviewer) => {\n const group = repoContext.getReviewerGroup(reviewer.login);\n if (group) {\n const state = reviewStatesByUser.get(reviewer.id);\n switch (state) {\n case 'APPROVED':\n reviewStates[group].approved++;\n break;\n case 'CHANGES_REQUESTED':\n reviewStates[group].changesRequested++;\n break;\n case 'DISMISSED':\n reviewStates[group].dismissed++;\n break;\n }\n }\n });\n\n return { reviewers, reviewStates };\n};\n","import type { RepoContext } from '../../../context/repoContext';\n\nexport const checkIfUserIsBot = (\n repoContext: RepoContext,\n user: { login: string; type: string },\n): boolean => {\n if (user.type === 'Bot') return true;\n if (repoContext.config.botUsers) {\n return repoContext.config.botUsers.includes(user.login);\n }\n return false;\n};\n\nexport const checkIfIsThisBot = (user: {\n login: string;\n type: string;\n}): boolean => {\n return (\n user.type === 'Bot' && user.login === `${process.env.REVIEWFLOW_NAME}[bot]`\n );\n};\n","import issueParser from 'issue-parser';\n\nconst parse = issueParser('github', { actions: {}, issuePrefixes: [] });\n\nexport const parseMentions = (body: string): readonly string[] => {\n return parse(body).mentions.map((m) => m.user);\n};\n","import slackifyMarkdown from 'slackify-markdown';\n\nexport const slackifyCommentBody = (\n body: string,\n multipleLines: boolean,\n): string => {\n return slackifyMarkdown(\n body\n .replace('```suggestion', '_Suggested change:_\\n```suggestion')\n .replace(\n '```suggestion\\r\\n```',\n `_Suggestion to remove line${multipleLines ? 's' : ''}._\\n`,\n ),\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport type { SlackMessage } from '../../context/SlackMessage';\nimport type { PostSlackMessageResult } from '../../context/TeamSlack';\nimport type { AccountEmbed } from '../../mongo';\nimport * as slackUtils from '../../slack/utils';\nimport { ExcludesNullish } from '../../utils/Excludes';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createSlackMessageWithSecondaryBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport type { PullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getPullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { checkIfUserIsBot, checkIfIsThisBot } from './utils/isBotUser';\nimport { parseMentions } from './utils/parseMentions';\nimport { slackifyCommentBody } from './utils/slackifyCommentBody';\n\nconst getDiscussion = async (\n context: Context,\n comment: any,\n): Promise<\n RestEndpointMethodTypes['pulls']['listComments']['response']['data']\n> => {\n if (!comment.in_reply_to_id) return [comment];\n return context.octokit.paginate(\n context.octokit.pulls.listComments.endpoint.merge(context.pullRequest()),\n ({\n data,\n }: RestEndpointMethodTypes['pulls']['listComments']['response']) => {\n return data.filter(\n (c) =>\n c.in_reply_to_id === comment.in_reply_to_id ||\n c.id === comment.in_reply_to_id,\n );\n },\n );\n};\n\nconst getMentions = (\n discussion: RestEndpointMethodTypes['pulls']['listComments']['response']['data'],\n): string[] => {\n const mentions = new Set();\n\n discussion.forEach((c) => {\n parseMentions(c.body).forEach((m) => mentions.add(m));\n });\n\n return [...mentions];\n};\n\nconst getUsersInThread = (\n discussion: RestEndpointMethodTypes['pulls']['listComments']['response']['data'],\n): { id: number; login: string }[] => {\n const userIds = new Set();\n const users: { id: number; login: string }[] = [];\n\n discussion.forEach((c) => {\n if (userIds.has(c.user.id)) return;\n userIds.add(c.user.id);\n users.push({ id: c.user.id, login: c.user.login });\n });\n\n return users;\n};\n\nexport default function prCommentCreated(\n app: Probot,\n appContext: AppContext,\n): void {\n const saveInDb = async (\n type: 'review-comment' | 'issue-comment',\n commentId: number,\n accountEmbed: AccountEmbed,\n results: PostSlackMessageResult[],\n message: SlackMessage,\n ): Promise => {\n const filtered = results.filter(ExcludesNullish);\n if (filtered.length === 0) return;\n\n await appContext.mongoStores.slackSentMessages.insertOne({\n type,\n typeId: commentId,\n message,\n account: accountEmbed,\n sentTo: filtered,\n });\n };\n\n app.on(\n [\n 'pull_request_review_comment.created',\n // comments without review and without path are sent with issue_comment.created.\n // createHandlerPullRequestChange checks if pull_request event is present, removing real issues comments.\n 'issue_comment.created',\n ],\n createPullRequestHandler<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment,\n | PullRequestFromPayload<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n >\n | any\n >(\n appContext,\n (payload, context) => {\n if (checkIfIsThisBot(payload.comment.user)) {\n // ignore comments from this bot\n return null;\n }\n return getPullRequestFromPayload(payload);\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const pr = await fetchPr(context, pullRequest.number);\n const { comment } = context.payload;\n const type = (comment as any).pull_request_review_id\n ? 'review-comment'\n : 'issue-comment';\n\n const body = comment.body;\n if (!body) return;\n\n const commentByOwner = pr.user.login === comment.user.login;\n const [discussion, { reviewers }] = await Promise.all([\n getDiscussion(context, comment),\n getReviewersAndReviewStates(context, repoContext),\n ]);\n\n const followers = reviewers.filter(\n (u) => u.id !== pr.user.id && u.id !== comment.user.id,\n );\n\n if (pr.requested_reviewers) {\n followers.push(\n ...pr.requested_reviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== comment.user.id &&\n rr.id !== pr.user.id\n );\n }),\n );\n }\n\n const usersInThread = getUsersInThread(discussion).filter(\n (u) =>\n u.id !== pr.user.id &&\n u.id !== comment.user.id &&\n !followers.find((f) => f.id === u.id),\n );\n const mentions = getMentions(discussion).filter(\n (m) =>\n m !== pr.user.login &&\n m !== comment.user.login &&\n !followers.find((f) => f.login === m) &&\n !usersInThread.find((u) => u.login === m),\n );\n\n const mention = repoContext.slack.mention(comment.user.login);\n const prUrl = slackUtils.createPrLink(pr, repoContext);\n const ownerMention = repoContext.slack.mention(pr.user.login);\n const commentLink = slackUtils.createLink(\n comment.html_url,\n (comment as any).in_reply_to_id ? 'replied' : 'commented',\n );\n\n const createMessage = (toOwner?: boolean): string => {\n const ownerPart = toOwner\n ? 'your PR'\n : `${\n pr.user.id === comment.user.id ? 'his' : `${ownerMention}'s`\n } PR`;\n return `:speech_balloon: ${mention} ${commentLink} on ${ownerPart} ${prUrl}`;\n };\n\n const promisesOwner = [];\n const promisesNotOwner = [];\n const slackifiedBody = slackifyCommentBody(\n comment.body,\n (comment as any).start_line !== null,\n );\n const isBotUser = checkIfUserIsBot(repoContext, comment.user);\n\n if (!commentByOwner) {\n const slackMessage = createSlackMessageWithSecondaryBlock(\n createMessage(true),\n slackifiedBody,\n );\n\n promisesOwner.push(\n repoContext.slack\n .postMessage(\n isBotUser ? 'pr-comment-bots' : 'pr-comment',\n pr.user.id,\n pr.user.login,\n slackMessage,\n )\n .then((res) =>\n saveInDb(\n type,\n comment.id,\n repoContext.accountEmbed,\n [res],\n slackMessage,\n ),\n ),\n );\n }\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n promisesNotOwner.push(\n ...followers.map((follower) =>\n repoContext.slack.postMessage(\n isBotUser ? 'pr-comment-follow-bots' : 'pr-comment-follow',\n follower.id,\n follower.login,\n message,\n ),\n ),\n );\n\n promisesNotOwner.push(\n ...usersInThread.map((user) =>\n repoContext.slack.postMessage(\n 'pr-comment-thread',\n user.id,\n user.login,\n message,\n ),\n ),\n );\n\n if (mentions.length > 0) {\n await appContext.mongoStores.users\n .findAll({ login: { $in: mentions } })\n .then((users) => {\n promisesNotOwner.push(\n ...users.map((u) =>\n repoContext.slack.postMessage(\n 'pr-comment-mention',\n u._id,\n u.login,\n message,\n ),\n ),\n );\n });\n }\n\n await Promise.all([\n Promise.all(promisesOwner),\n Promise.all(promisesNotOwner).then((results) =>\n saveInDb(\n type,\n comment.id,\n repoContext.accountEmbed,\n results,\n message,\n ),\n ),\n ]);\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport type { Options } from './utils/body/prOptions';\nimport { updateCommentOptions } from './utils/body/updateBody';\n\nconst updatePrCommentBody = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n reviewflowPrContext: ReviewflowPrContext,\n newBody: string,\n): Promise => {\n await context.octokit.issues.updateComment(\n context.repo({\n comment_id: reviewflowPrContext.reviewflowPr.commentId,\n body: newBody,\n }),\n );\n reviewflowPrContext.commentBody = newBody;\n};\n\nexport const updatePrCommentBodyIfNeeded = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n reviewflowPrContext: ReviewflowPrContext,\n newBody: string,\n): Promise => {\n if (reviewflowPrContext.commentBody !== newBody) {\n await updatePrCommentBody(context, reviewflowPrContext, newBody);\n }\n};\n\nexport const updatePrCommentBodyOptions = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n updateOptions: Partial,\n): Promise => {\n const { commentBody: newBody } = updateCommentOptions(\n reviewflowPrContext.commentBody,\n repoContext.config.prDefaultOptions,\n updateOptions,\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newBody);\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from 'events/pr-handlers/utils/PullRequestData';\nimport type { LabelResponse } from '../../../../context/initRepoLabels';\nimport hasLabelInPR from './hasLabelInPR';\n\ninterface SyncLabelOptions {\n onRemove?: () => void | Promise;\n onAdd?: (prLabels: LabelResponse[]) => void | Promise;\n}\n\nexport default async function syncLabel<\n T extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n shouldHaveLabel: boolean,\n label: LabelResponse,\n prHasLabel = hasLabelInPR(pullRequest.labels, label),\n { onRemove, onAdd }: SyncLabelOptions = {},\n): Promise {\n if (prHasLabel && !shouldHaveLabel) {\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n if (onRemove) await onRemove();\n }\n if (shouldHaveLabel && !prHasLabel) {\n const response = await context.octokit.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n if (onAdd) await onAdd(response.data);\n }\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type {\n PullRequestFromRestEndpoint,\n PullRequestWithDecentData,\n} from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport type { Options } from './utils/body/prOptions';\nimport { updateCommentOptions } from './utils/body/updateBody';\nimport hasLabelInPR from './utils/hasLabelInPR';\nimport syncLabel from './utils/syncLabel';\n\nexport const calcDefaultOptions = (\n repoContext: RepoContext,\n pullRequest: PullRequestWithDecentData,\n): Options => {\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasFeatureBranchLabel = hasLabelInPR(\n pullRequest.labels,\n featureBranchLabel,\n );\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n return {\n ...repoContext.config.prDefaultOptions,\n featureBranch: prHasFeatureBranchLabel,\n autoMergeWithSkipCi: prHasSkipCiLabel,\n autoMerge: prHasAutoMergeLabel,\n };\n};\n\nexport const syncLabelsAfterCommentBodyEdited = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n): Promise => {\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasFeatureBranchLabel = hasLabelInPR(\n pullRequest.labels,\n featureBranchLabel,\n );\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n const { commentBody, options } = updateCommentOptions(\n reviewflowPrContext.commentBody,\n calcDefaultOptions(repoContext, pullRequest),\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, commentBody);\n\n if (options && (featureBranchLabel || automergeLabel)) {\n await Promise.all([\n featureBranchLabel &&\n syncLabel(\n pullRequest,\n context,\n options.featureBranch,\n featureBranchLabel,\n prHasFeatureBranchLabel,\n ),\n skipCiLabel &&\n syncLabel(\n pullRequest,\n context,\n options.autoMergeWithSkipCi,\n skipCiLabel,\n prHasSkipCiLabel,\n ),\n automergeLabel &&\n syncLabel(\n pullRequest,\n context,\n options.autoMerge,\n automergeLabel,\n prHasAutoMergeLabel,\n {\n onAdd: async (prLabels) => {\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n prLabels,\n );\n },\n onRemove: () => {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'label removed',\n );\n },\n },\n ),\n ]);\n }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { syncLabelsAfterCommentBodyEdited } from './actions/syncLabelsAfterCommentBodyEdited';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createMrkdwnSectionBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport type { PullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { getPullRequestFromPayload } from './utils/getPullRequestFromPayload';\nimport { checkIfIsThisBot } from './utils/isBotUser';\nimport { slackifyCommentBody } from './utils/slackifyCommentBody';\n\nexport default function prCommentEditedOrDeleted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n [\n 'pull_request_review_comment.edited',\n 'pull_request_review_comment.deleted',\n // comments without review and without path are sent with issue_comment.created.\n // createHandlerPullRequestChange checks if pull_request event is present, removing real issues comments.\n 'issue_comment.edited',\n 'issue_comment.deleted',\n ],\n createPullRequestHandler<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment,\n | PullRequestFromPayload<\n | EventPayloads.WebhookPayloadPullRequestReviewComment\n | EventPayloads.WebhookPayloadIssueComment\n >\n | any\n >(\n appContext,\n (payload) => {\n if (checkIfIsThisBot(payload.sender)) {\n // ignore edits made from this bot\n return null;\n }\n return getPullRequestFromPayload(payload);\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const { comment } = context.payload;\n\n if (\n reviewflowPrContext !== null &&\n context.payload.action === 'edited' &&\n checkIfIsThisBot(comment.user)\n ) {\n const updatedPr = await fetchPr(context, pullRequest.number);\n if (!updatedPr.closed_at) {\n await syncLabelsAfterCommentBodyEdited(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n }\n return;\n }\n\n const type = (comment as any).pull_request_review_id\n ? 'review-comment'\n : 'issue-comment';\n\n const criteria = {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type,\n typeId: comment.id,\n };\n\n const sentMessages = await appContext.mongoStores.slackSentMessages.findAll(\n criteria,\n );\n\n if (sentMessages.length === 0) return;\n\n if (context.payload.action === 'deleted') {\n await Promise.all([\n Promise.all(\n sentMessages.map((sentMessage) =>\n Promise.all(\n sentMessage.sentTo.map((sentTo) =>\n repoContext.slack.deleteMessage(sentTo.ts, sentTo.channel),\n ),\n ),\n ),\n ),\n appContext.mongoStores.slackSentMessages.deleteMany(criteria),\n ]);\n } else {\n const secondaryBlocks = [\n createMrkdwnSectionBlock(\n slackifyCommentBody(\n comment.body,\n (comment as any).start_line !== null,\n ),\n ),\n ];\n\n await Promise.all([\n Promise.all(\n sentMessages.map((sentMessage) =>\n Promise.all(\n sentMessage.sentTo.map((sentTo) =>\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...sentMessage.message,\n secondaryBlocks,\n }),\n ),\n ),\n ),\n ),\n appContext.mongoStores.slackSentMessages.partialUpdateMany(\n criteria,\n { $set: { 'message.secondaryBlocks': secondaryBlocks } },\n ),\n ]);\n }\n },\n ),\n );\n}\n","import type { CommitNote } from '@commitlint/parse';\nimport parse from '@commitlint/parse';\nimport type { RestEndpointMethodTypes } from '@octokit/plugin-rest-endpoint-methods';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport { updateCommentBodyCommitsNotes } from './utils/body/updateBody';\nimport syncLabel from './utils/syncLabel';\n\ninterface BreakingChangesCommits {\n commit: RestEndpointMethodTypes['pulls']['listCommits']['response']['data'][number];\n breakingChangesNotes: CommitNote[];\n}\n\nexport const readCommitsAndUpdateInfos = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n commentBody = reviewflowPrContext.commentBody,\n): Promise => {\n // tmp.data[0].sha\n // tmp.data[0].commit.message\n\n const commits = await context.octokit.paginate(\n context.octokit.pulls.listCommits,\n context.pullRequest({\n // A custom page size up to 100. Default is 30.\n per_page: 100,\n }),\n (res) => res.data,\n );\n\n const conventionalCommits = await Promise.all(\n commits.map((c) => parse(c.commit.message)),\n );\n\n const breakingChangesCommits: BreakingChangesCommits[] = [];\n conventionalCommits.forEach((c, index) => {\n const breakingChangesNotes = c.notes.filter(\n (note) => note.title === 'BREAKING CHANGE',\n );\n if (breakingChangesNotes.length > 0) {\n breakingChangesCommits.push({\n commit: commits[index],\n breakingChangesNotes,\n });\n }\n });\n\n const breakingChangesLabel = repoContext.labels['breaking-changes'];\n const newCommentBody = updateCommentBodyCommitsNotes(\n commentBody,\n breakingChangesCommits.length === 0\n ? ''\n : `Breaking Changes:\\n${breakingChangesCommits\n .map(({ commit, breakingChangesNotes }) =>\n breakingChangesNotes.map(\n (note) => `- ${note.text.replace('\\n', ' ')} (${commit.sha})`,\n ),\n )\n .join('')}`,\n );\n\n await Promise.all([\n syncLabel(\n pullRequest,\n context,\n breakingChangesCommits.length !== 0,\n breakingChangesLabel,\n ),\n updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newCommentBody),\n ]);\n\n // TODO auto update ! in front of : to signal a breaking change when https://github.com/conventional-changelog/commitlint/issues/658 is closed\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\n\ninterface UpdatePr {\n title?: string;\n body?: string;\n}\n\nconst cleanNewLines = (text: string): string => text.replace(/\\r\\n/g, '\\n');\nconst checkIfHasDiff = (text1: string, text2: string): boolean =>\n cleanNewLines(text1) !== cleanNewLines(text2);\n\nexport const updatePrIfNeeded = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n update: UpdatePr,\n): Promise => {\n const hasDiffInTitle = update.title && pullRequest.title !== update.title;\n const hasDiffInBody =\n update.body && checkIfHasDiff(pullRequest.body, update.body);\n\n if (hasDiffInTitle || hasDiffInBody) {\n const diff: Partial> = {};\n if (hasDiffInTitle) {\n diff.title = update.title;\n pullRequest.title = update.title as string;\n }\n if (hasDiffInBody) {\n diff.body = update.body;\n pullRequest.body = update.body as string;\n }\n\n await context.octokit.pulls.update(\n context.repo({\n pull_number: pullRequest.number,\n ...diff,\n }),\n );\n }\n};\n","export const cleanTitle = (title: string): string =>\n title\n .trim()\n .replace(\n /[\\s-]+\\[?\\s*([A-Za-z][\\dA-Za-z]+)[ -](\\d+)\\s*]?\\s*$/,\n (s, arg1, arg2) => ` ${arg1.toUpperCase()}-${arg2}`,\n )\n .replace(/^([A-Za-z]+)[/:]\\s*/, (s, arg1) => `${arg1.toLowerCase()}: `)\n .replace(/^Revert \"([^\"]+)\"$/, 'revert: $1')\n .replace(/\\s+[[\\]]\\s*no\\s*issue\\s*[[\\]]$/i, ' [no issue]')\n // eslint-disable-next-line unicorn/no-unsafe-regex\n .replace(/^(revert:.*)(\\s+\\(#\\d+\\))$/, '$1');\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { StatusError, StatusInfo } from '../../../accountConfigs/types';\nimport { ExcludesFalsy } from '../../../utils/Excludes';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { readCommitsAndUpdateInfos } from './readCommitsAndUpdateInfos';\nimport { calcDefaultOptions } from './syncLabelsAfterCommentBodyEdited';\nimport { updatePrIfNeeded } from './updatePr';\nimport { updatePrCommentBodyIfNeeded } from './updatePrCommentBody';\nimport {\n updateCommentBodyInfos,\n defaultCommentBody,\n createCommentBody,\n removeDeprecatedReviewflowInPrBody,\n} from './utils/body/updateBody';\nimport { cleanTitle } from './utils/cleanTitle';\nimport createStatus from './utils/createStatus';\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\nexport const editOpenedPR = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: PullRequestWithDecentData,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext | null,\n shouldUpdateCommentBodyInfos: boolean,\n previousSha?: string,\n): Promise => {\n if (reviewflowPrContext === null) return;\n\n const title = repoContext.config.trimTitle\n ? cleanTitle(pullRequest.title)\n : pullRequest.title;\n\n const isPrFromBot = pullRequest.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(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 = (\n await context.octokit.checks.listForRef(\n context.repo({\n ref: pullRequest.head.sha,\n }),\n )\n ).data.check_runs.find(\n (check): boolean => check.name === `${process.env.REVIEWFLOW_NAME}/lint-pr`,\n );\n\n const promises: Promise[] = [\n ...statuses.map(\n ({ name, error, info }): Promise =>\n createStatus(\n context,\n name,\n pullRequest.head.sha,\n error ? 'failure' : 'success',\n error ? error.title : (info as StatusInfo).title,\n error ? undefined : (info as StatusInfo).url,\n ),\n ),\n ...(previousSha\n ? statuses\n .map(({ name, error, info }): Promise | undefined =>\n error\n ? createStatus(\n context,\n name,\n previousSha,\n 'success',\n 'New commits have been pushed',\n )\n : undefined,\n )\n .filter(ExcludesFalsy)\n : []),\n hasLintPrCheck &&\n context.octokit.checks.create(\n context.repo({\n name: `${process.env.REVIEWFLOW_NAME}/lint-pr`,\n head_sha: pullRequest.head.sha,\n status: 'completed' as const,\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 && previousSha && errorRule\n ? createStatus(\n context,\n 'lint-pr',\n previousSha,\n 'success',\n 'New commits have been pushed',\n )\n : undefined,\n !hasLintPrCheck &&\n createStatus(\n context,\n 'lint-pr',\n pullRequest.head.sha,\n errorRule ? 'failure' : 'success',\n errorRule ? errorRule.error.title : '✓ Your PR is valid',\n ),\n ].filter(ExcludesFalsy);\n\n const body = removeDeprecatedReviewflowInPrBody(pullRequest.body);\n promises.push(updatePrIfNeeded(pullRequest, context, { title, body }));\n\n const commentBodyInfos = statuses\n .filter((status) => status.info?.inBody)\n .map((status) => status.info) as StatusInfo[];\n\n const shouldCreateCommentBody =\n reviewflowPrContext.commentBody === defaultCommentBody;\n\n const newBody = shouldCreateCommentBody\n ? createCommentBody(\n calcDefaultOptions(repoContext, pullRequest),\n commentBodyInfos,\n )\n : updateCommentBodyInfos(reviewflowPrContext.commentBody, commentBodyInfos);\n\n if (shouldCreateCommentBody || shouldUpdateCommentBodyInfos) {\n promises.push(\n readCommitsAndUpdateInfos(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n newBody,\n ),\n );\n } else {\n promises.push(\n updatePrCommentBodyIfNeeded(context, reviewflowPrContext, newBody),\n );\n }\n\n await Promise.all(promises);\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { checkIfIsThisBot } from './utils/isBotUser';\n\nexport default function edited(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.edited',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n if (reviewflowPrContext == null) return;\n\n const sender = context.payload.sender;\n if (checkIfIsThisBot(sender)) {\n return;\n }\n\n const updatedPullRequest = await fetchPr(\n context,\n context.payload.pull_request.number,\n );\n\n await editOpenedPR(\n updatedPullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n false,\n );\n await autoMergeIfPossible(\n updatedPullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Context } from 'probot';\nimport type { PullRequestWithDecentData } from '../utils/PullRequestData';\n\nexport const updateBranch = async (\n pullRequest: PullRequestWithDecentData,\n context: Context,\n login: string,\n): Promise => {\n context.log.info('update branch', {\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n });\n\n const result = await context.octokit.repos\n .merge({\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n head: pullRequest.base.ref,\n base: pullRequest.head.ref,\n })\n .catch((err) => ({ error: err } as any));\n\n context.log.info(\n {\n status: result.status,\n sha: result.data?.sha,\n error: result.error,\n },\n 'update branch result',\n );\n\n if (result.status === 204) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch: base already contains the head, nothing to merge.`,\n }),\n );\n } else if (result.status === 409) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch: merge conflict. Please resolve manually.`,\n }),\n );\n } else if (!result || !result.data || !result.data.sha) {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} could not update branch (unknown error)`,\n }),\n );\n } else {\n context.octokit.issues.createComment(\n context.repo({\n issue_number: pullRequest.number,\n body: `@${login} branch updated: ${result.data.sha}`,\n }),\n );\n }\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateBranch } from './actions/updateBranch';\nimport { updatePrCommentBodyOptions } from './actions/updatePrCommentBody';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport hasLabelInPR from './actions/utils/hasLabelInPR';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nconst isFromRenovate = (\n payload: EventPayloads.WebhookPayloadPullRequest,\n): boolean => {\n const sender = payload.sender;\n return (\n sender.type === 'Bot' &&\n sender.login === 'renovate[bot]' &&\n payload.pull_request.head.ref.startsWith('renovate/')\n );\n};\n\nexport default function labelsChanged(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n ['pull_request.labeled', 'pull_request.unlabeled'],\n createPullRequestHandler<\n EventPayloads.WebhookPayloadPullRequest,\n EventPayloads.WebhookPayloadPullRequest['pull_request']\n >(\n appContext,\n (payload, context, repoContext) => {\n if (payload.sender.type === 'Bot' && !isFromRenovate(payload)) {\n return null;\n }\n\n if (repoContext.shouldIgnore) return null;\n\n return payload.pull_request;\n },\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n if (reviewflowPrContext === null) return;\n\n const fromRenovate = isFromRenovate(context.payload);\n const updatedPr = await fetchPr(context, pullRequest.number);\n\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 const autoMergeSkipCiLabel = repoContext.labels['merge/skip-ci'];\n if (context.payload.action === 'labeled') {\n if (codeApprovedLabel && label.id === codeApprovedLabel.id) {\n // const { data: reviews } = await context.octokit.pulls.listReviews(\n // context.pullRequest({ per_page: 1 }),\n // );\n // if (reviews.length !== 0) {\n await context.octokit.pulls.createReview(\n context.pullRequest({ event: 'APPROVE' }),\n );\n\n let labels = updatedPr.labels;\n const autoMergeWithSkipCi =\n autoMergeSkipCiLabel &&\n repoContext.config.autoMergeRenovateWithSkipCi;\n if (autoMergeWithSkipCi) {\n const result = await context.octokit.issues.addLabels(\n context.issue({\n labels: [autoMergeSkipCiLabel.name],\n }),\n );\n labels = result.data;\n }\n await updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n labels,\n );\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n autoMergeWithSkipCi,\n // force label to avoid racing events (when both events are sent in the same time, reviewflow treats them one by one but the second event wont have its body updated)\n autoMerge: hasLabelInPR(labels, autoMergeLabel)\n ? true\n : repoContext.config.prDefaultOptions.autoMerge,\n },\n );\n // }\n } else if (autoMergeLabel && label.id === autoMergeLabel.id) {\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n autoMerge: true,\n // force label to avoid racing events (when both events are sent in the same time, reviewflow treats them one by one but the second event wont have its body updated)\n // Note: si c'est renovate qui ajoute le label autoMerge, le label codeApprovedLabel n'aurait pu etre ajouté que par renovate également (on est a quelques secondes de l'ouverture de la pr par renovate)\n autoMergeWithSkipCi: hasLabelInPR(\n pullRequest.labels,\n codeApprovedLabel,\n )\n ? true\n : repoContext.config.prDefaultOptions.autoMergeWithSkipCi,\n },\n );\n }\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n }\n return;\n }\n\n if (repoContext.protectedLabelIds.includes(label.id)) {\n if (context.payload.action === 'labeled') {\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n } else {\n await context.octokit.issues.addLabels(\n context.issue({ labels: [label.name] }),\n );\n }\n return;\n }\n\n await updateStatusCheckFromLabels(updatedPr, context, repoContext);\n\n const updateBranchLabel = repoContext.labels['merge/update-branch'];\n const featureBranchLabel = repoContext.labels['feature-branch'];\n const automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const option = (() => {\n if (featureBranchLabel && label.id === featureBranchLabel.id) {\n return 'featureBranch';\n }\n if (automergeLabel && label.id === automergeLabel.id) {\n return 'autoMerge';\n }\n if (skipCiLabel && label.id === skipCiLabel.id) {\n return 'autoMergeWithSkipCi';\n }\n return null;\n })();\n\n if (option) {\n await updatePrCommentBodyOptions(\n context,\n repoContext,\n reviewflowPrContext,\n {\n [option]: context.payload.action === 'labeled',\n },\n );\n } // not an else if\n if (automergeLabel && label.id === automergeLabel.id) {\n if (context.payload.action === 'labeled') {\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n } else {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'automerge label removed',\n );\n }\n }\n if (updateBranchLabel && label.id === updateBranchLabel.id) {\n if (context.payload.action === 'labeled') {\n await updateBranch(\n updatedPr,\n context,\n context.payload.sender.login,\n );\n await context.octokit.issues.removeLabel(\n context.issue({ name: label.name }),\n );\n }\n }\n },\n ),\n );\n}\n","import type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestFromRestEndpoint } from '../utils/PullRequestData';\nimport type { ReviewflowPrContext } from '../utils/createPullRequestContext';\nimport { autoMergeIfPossible } from './autoMergeIfPossible';\nimport hasLabelInPR from './utils/hasLabelInPR';\n\nexport const autoApproveAndAutoMerge = async (\n pullRequest: PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n reviewflowPrContext: ReviewflowPrContext,\n): Promise => {\n // const autoMergeLabel = repoContext.labels['merge/automerge'];\n const codeApprovedLabel = repoContext.labels['code/approved'];\n if (hasLabelInPR(pullRequest.labels, codeApprovedLabel)) {\n await context.octokit.pulls.createReview(\n context.pullRequest({ event: 'APPROVE' }),\n );\n await autoMergeIfPossible(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n );\n return true;\n }\n\n return false;\n};\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Context } from 'probot';\nimport type { RepoContext } from 'context/repoContext';\nimport type { PullRequestFromRestEndpoint } from '../utils/PullRequestData';\n\nexport const autoAssignPRToCreator = async <\n E extends EventPayloads.WebhookPayloadPullRequest\n>(\n pullRequest: E['pull_request'] | PullRequestFromRestEndpoint,\n context: Context,\n repoContext: RepoContext,\n): Promise => {\n if (!repoContext.config.autoAssignToCreator) return;\n if (pullRequest.assignees.length > 0) return;\n if (pullRequest.user.type === 'Bot') return;\n\n await context.octokit.issues.addAssignees(\n context.issue({\n assignees: [pullRequest.user.login],\n }),\n );\n};\n","import type { Probot } from 'probot';\nimport type { AppContext } from 'context/AppContext';\nimport { autoApproveAndAutoMerge } from './actions/autoApproveAndAutoMerge';\nimport { autoAssignPRToCreator } from './actions/autoAssignPRToCreator';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { defaultCommentBody } from './actions/utils/body/updateBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { createReviewflowComment } from './utils/reviewflowComment';\n\nexport default function opened(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.opened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (pullRequest, context, repoContext, reviewflowPrContext) => {\n const fromRenovate = pullRequest.head.ref.startsWith('renovate/');\n if (reviewflowPrContext === null) return;\n\n await Promise.all([\n autoAssignPRToCreator(pullRequest, context, repoContext),\n editOpenedPR(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n ),\n fromRenovate\n ? fetchPr(context, pullRequest.number).then((updatedPr) =>\n autoApproveAndAutoMerge(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n ).then(\n async (approved: boolean): Promise => {\n if (!approved && repoContext.config.requiresReviewRequest) {\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n 'dev',\n {\n add: ['needsReview'],\n },\n );\n }\n },\n ),\n )\n : updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n add: repoContext.config.requiresReviewRequest\n ? ['needsReview']\n : [],\n remove: ['approved', 'changesRequested'],\n }),\n ]);\n },\n (pullRequest, context, repoContext) => {\n return {\n reviewflowCommentPromise: createReviewflowComment(\n pullRequest.number,\n context,\n defaultCommentBody,\n ),\n };\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function closed(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.reopened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n await Promise.all([\n updateReviewStatus(pullRequest, context, repoContext, 'dev', {\n add: ['needsReview'],\n remove: ['approved'],\n }),\n editOpenedPR(\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n ),\n ]);\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nexport default function reviewDismissed(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request_review.dismissed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n const reviewer = (context.payload as any).review.user;\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const updatedPr = await fetchPr(context, pullRequest.number);\n\n const { reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n const hasApprovals = reviewStates[reviewerGroup].approved !== 0;\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n updatedPr.requested_reviewers,\n { includesReviewerGroup: true },\n );\n\n await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n !hasApprovals && 'needsReview',\n hasApprovals &&\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'approved',\n ],\n remove: [\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n 'requested',\n !hasChangesRequestedInReviews && 'changesRequested',\n !hasApprovals && 'approved',\n ],\n },\n );\n\n if (updatedPr.assignees) {\n updatedPr.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !updatedPr.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (repoContext.slack) {\n if (sender.login === reviewer.login) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.postMessage(\n 'pr-review',\n assignee.id,\n assignee.login,\n {\n text: `:skull: ${repoContext.slack.mention(\n reviewer.login,\n )} dismissed his review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n } else {\n repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n {\n text: `:skull: ${repoContext.slack.mention(\n sender.login,\n )} dismissed your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n }\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nexport default function reviewRequestRemoved(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request.review_request_removed',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest.requested_reviewers,\n {\n includesReviewerGroup: true,\n },\n );\n\n const { reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n\n const hasApprovedInReviews =\n reviewStates[reviewerGroup].approved !== 0;\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n hasApprovedInReviews;\n\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n // if changes requested by the one which requests was removed (should still be in changed requested anyway, but we never know)\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 && 'requested',\n ],\n },\n );\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n\n const sentMessageRequestedReview = await appContext.mongoStores.slackSentMessages.findOne(\n {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n },\n );\n\n if (sentMessageRequestedReview) {\n const sentTo = sentMessageRequestedReview.sentTo[0];\n const message = sentMessageRequestedReview.message;\n await Promise.all([\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...message,\n text: message.text\n .split('\\n')\n .map((l) => `~${l}~`)\n .join('\\n'),\n }),\n repoContext.slack.addReaction(\n sentTo.ts,\n sentTo.channel,\n 'skull_and_crossbones',\n ),\n appContext.mongoStores.slackSentMessages.deleteOne(\n sentMessageRequestedReview,\n ),\n ]);\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\n\nexport default function reviewRequested(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request.review_requested',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const sender = context.payload.sender;\n\n const reviewer = (context.payload as any).requested_reviewer;\n\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n const shouldWait = false;\n // repoContext.approveShouldWait(reviewerGroup, pr.requested_reviewers, { includesWaitForGroups: true });\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n await updateReviewStatus(\n pullRequest,\n context,\n repoContext,\n reviewerGroup,\n {\n add: ['needsReview', !shouldWait && 'requested'],\n remove: ['approved'],\n },\n );\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n }\n\n if (sender.login === reviewer.login) return;\n\n if (!shouldWait && repoContext.slack) {\n const text = `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests your review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )} !\\n> ${pullRequest.title}`;\n const message = { text };\n const result = await repoContext.slack.postMessage(\n 'pr-review',\n reviewer.id,\n reviewer.login,\n message,\n );\n if (result) {\n await appContext.mongoStores.slackSentMessages.insertOne({\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n message,\n account: repoContext.accountEmbed,\n sentTo: [result],\n });\n }\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport slackifyMarkdown from 'slackify-markdown';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { createSlackMessageWithSecondaryBlock } from './utils/createSlackMessageWithSecondaryBlock';\nimport { fetchPr } from './utils/fetchPr';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\n\nconst getEmojiFromState = (state: string): string => {\n switch (state) {\n case 'changes_requested':\n return 'x';\n case 'approved':\n return 'white_check_mark';\n default:\n return 'speech_balloon';\n }\n};\n\nexport default function reviewSubmitted(\n app: Probot,\n appContext: AppContext,\n): void {\n app.on(\n 'pull_request_review.submitted',\n createPullRequestHandler(\n appContext,\n (payload) => payload.pull_request,\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n const { payload } = context;\n\n const {\n user: reviewer,\n state,\n body,\n html_url: reviewUrl,\n } = payload.review;\n\n const reviewByOwner = pullRequest.user.login === reviewer.login;\n const { reviewers, reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const followers = reviewers.filter(\n (user) => user.id !== reviewer.id && user.id !== pullRequest.user.id,\n );\n\n if (pullRequest.requested_reviewers) {\n followers.push(\n ...pullRequest.requested_reviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== reviewer.id &&\n rr.id !== pullRequest.user.id\n );\n }),\n );\n }\n\n if (!reviewByOwner) {\n const reviewerGroup = repoContext.getReviewerGroup(reviewer.login);\n let merged: boolean;\n\n if (\n reviewflowPrContext &&\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest.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\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n\n const approved =\n !hasRequestedReviewsForGroup &&\n !hasChangesRequestedInReviews &&\n state === 'approved';\n\n const updatedPr = await fetchPr(context, pullRequest.number);\n\n const newLabels = await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n reviewerGroup,\n {\n add: [\n approved && 'approved',\n state === 'changes_requested' && 'needsReview',\n state === 'changes_requested' && 'changesRequested',\n ],\n remove: [\n approved && 'needsReview',\n !hasRequestedReviewsForGroup && '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 updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n newLabels,\n );\n }\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !pullRequest.assignees.find(\n (assignee) => assignee.login === reviewer.login,\n )\n ) {\n repoContext.slack.updateHome(reviewer.login);\n }\n\n const sentMessageRequestedReview = await appContext.mongoStores.slackSentMessages.findOne(\n {\n 'account.id': repoContext.account._id,\n 'account.type': repoContext.accountType,\n type: 'review-requested',\n typeId: `${pullRequest.id}_${reviewer.id}`,\n },\n );\n\n const emoji = getEmojiFromState(state);\n\n if (sentMessageRequestedReview) {\n const sentTo = sentMessageRequestedReview.sentTo[0];\n const message = sentMessageRequestedReview.message;\n await Promise.all([\n repoContext.slack.updateMessage(sentTo.ts, sentTo.channel, {\n ...message,\n text: message.text\n .split('\\n')\n .map((l) => `~${l}~`)\n .join('\\n'),\n }),\n repoContext.slack.addReaction(sentTo.ts, sentTo.channel, emoji),\n appContext.mongoStores.slackSentMessages.deleteOne(\n sentMessageRequestedReview,\n ),\n ]);\n }\n\n if (!body && state !== 'changes_requested' && state !== 'approved') {\n return;\n }\n\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = slackUtils.createPrLink(pullRequest, repoContext);\n const ownerMention = repoContext.slack.mention(\n pullRequest.user.login,\n );\n\n const createMessage = (toOwner?: boolean): string => {\n const ownerPart = toOwner ? 'your PR' : `${ownerMention}'s PR`;\n\n if (state === 'changes_requested') {\n return `:${emoji}: ${mention} requests changes on ${ownerPart} ${prUrl}`;\n }\n if (state === 'approved') {\n return `${\n toOwner ? ':clap: ' : ''\n }:${emoji}: ${mention} approves ${ownerPart} ${prUrl}${\n merged ? ' and PR is merged :tada:' : ''\n }`;\n }\n\n const commentLink = slackUtils.createLink(reviewUrl, 'commented');\n return `:${emoji}: ${mention} ${commentLink} on ${ownerPart} ${prUrl}`;\n };\n\n const slackifiedBody = slackifyMarkdown((body as unknown) as string);\n\n repoContext.slack.postMessage(\n 'pr-review',\n pullRequest.user.id,\n pullRequest.user.login,\n createSlackMessageWithSecondaryBlock(\n createMessage(true),\n slackifiedBody,\n ),\n );\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n followers.forEach((follower) => {\n repoContext.slack.postMessage(\n 'pr-review-follow',\n follower.id,\n follower.login,\n message,\n );\n });\n } else if (body) {\n const mention = repoContext.slack.mention(reviewer.login);\n const prUrl = slackUtils.createPrLink(pullRequest, repoContext);\n const commentLink = slackUtils.createLink(reviewUrl, 'commented');\n\n const message = createSlackMessageWithSecondaryBlock(\n `:speech_balloon: ${mention} ${commentLink} on his PR ${prUrl}`,\n body,\n );\n\n followers.forEach((follower) => {\n repoContext.slack.postMessage(\n 'pr-review-follow',\n follower.id,\n follower.login,\n message,\n );\n });\n }\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport type { LockedMergePr } from '../../context/repoContext';\nimport { createPullRequestsHandler } from './utils/createPullRequestHandler';\n\nconst isSameBranch = (\n payload: Context['payload'],\n lockedPr: LockedMergePr,\n): boolean => {\n if (!lockedPr) return false;\n return !!payload.branches.find((b) => b.name === lockedPr.branch);\n};\n\nexport default function status(app: Probot, appContext: AppContext): void {\n app.on(\n 'status',\n createPullRequestsHandler(\n appContext,\n (payload, repoContext): LockedMergePr[] => {\n if (repoContext.shouldIgnore) return [];\n\n const lockedPr = repoContext.getMergeLockedPr();\n if (!lockedPr) return [];\n\n if (payload.state !== 'loading' && isSameBranch(payload, lockedPr)) {\n return [lockedPr];\n }\n\n return [];\n },\n (pr, context, repoContext): void => {\n const lockedPr = repoContext.getMergeLockedPr();\n // check if changed\n if (isSameBranch(context.payload, lockedPr)) {\n repoContext.reschedule(context, lockedPr);\n }\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { autoMergeIfPossible } from './actions/autoMergeIfPossible';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateStatusCheckFromLabels } from './actions/updateStatusCheckFromLabels';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\n\nexport default function synchronize(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.synchronize',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n if (repoContext.shouldIgnore) return null;\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n if (!reviewflowPrContext) return;\n\n const updatedPr = await fetchPr(context, pullRequest.number);\n // old and new sha\n // const { before, after } = context.payload;\n const previousSha = (context.payload as any).before as string;\n\n await Promise.all([\n editOpenedPR(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n true,\n previousSha,\n ),\n // addStatusCheckToLatestCommit\n updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n updatedPr.labels,\n previousSha,\n ),\n ]);\n\n // call autoMergeIfPossible to re-add to the queue when push is fixed\n await autoMergeIfPossible(\n updatedPr,\n context,\n repoContext,\n reviewflowPrContext,\n );\n },\n ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AppContext } from '../../context/AppContext';\nimport { obtainRepoContext } from '../../context/repoContext';\nimport { getEmojiFromRepoDescription } from '../../context/utils';\nimport { createHandlerOrgChange } from '../account-handlers/utils/handler';\n\nexport default function repoEdited(app: Probot, appContext: AppContext): void {\n app.on(\n 'repository.edited',\n createHandlerOrgChange(\n appContext,\n async (context, orgContext): Promise => {\n const repoContext = await obtainRepoContext(appContext, context);\n if (!repoContext) return;\n const repo = context.payload.repository;\n repoContext.repoFullName = repo.full_name;\n repoContext.repoEmoji = getEmojiFromRepoDescription(repo.description);\n },\n ),\n );\n}\n","import type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot } from 'probot';\n// import commands from 'probot-commands';\nimport type { AppContext } from './context/AppContext';\nimport { syncOrg } from './events/account-handlers/actions/syncOrg';\nimport { syncTeams } from './events/account-handlers/actions/syncTeams';\nimport { createHandlerOrgChange } from './events/account-handlers/utils/handler';\nimport checkrunCompleted from './events/pr-handlers/checkrunCompleted';\nimport checksuiteCompleted from './events/pr-handlers/checksuiteCompleted';\nimport closedHandler from './events/pr-handlers/closed';\nimport commentCreated from './events/pr-handlers/commentCreated';\nimport commentEditedOrDeleted from './events/pr-handlers/commentEditedOrDeleted';\nimport editedHandler from './events/pr-handlers/edited';\nimport labelsChanged from './events/pr-handlers/labelsChanged';\nimport openedHandler from './events/pr-handlers/opened';\nimport reopenedHandler from './events/pr-handlers/reopened';\nimport reviewDismissedHandler from './events/pr-handlers/reviewDismissed';\nimport reviewRequestRemovedHandler from './events/pr-handlers/reviewRequestRemoved';\nimport reviewRequestedHandler from './events/pr-handlers/reviewRequested';\nimport reviewSubmittedHandler from './events/pr-handlers/reviewSubmitted';\nimport status from './events/pr-handlers/status';\nimport synchronizeHandler from './events/pr-handlers/synchronize';\nimport repoEdited from './events/repository-handlers/repoEdited';\n\nexport default function initApp(app: Probot, appContext: AppContext): void {\n /* https://developer.github.com/webhooks/event-payloads/#organization */\n app.on(\n ['organization.member_added', 'organization.member_removed'],\n createHandlerOrgChange(\n appContext,\n async (context, accountContext) => {\n await syncOrg(\n appContext.mongoStores,\n context.octokit,\n accountContext.account.installationId as number,\n context.payload.organization,\n );\n },\n ),\n );\n\n /* https://developer.github.com/webhooks/event-payloads/#team */\n app.on(\n ['team.created', 'team.deleted', 'team.edited'],\n createHandlerOrgChange(\n appContext,\n async (context, accountContext) => {\n await syncTeams(\n appContext.mongoStores,\n context.octokit,\n context.payload.organization,\n );\n },\n ),\n );\n\n // /* https://developer.github.com/webhooks/event-payloads/#membership */\n // app.on(\n // ['membership.added', 'membership.removed'],\n // createHandlerOrgChange(\n // mongoStores,\n // async (context, accountContext) => {\n // await syncTeamMembers(\n // mongoStores,\n // context.octokit,\n // context.payload.organization,\n // context.payload.team,\n // );\n // },\n // ),\n // );\n\n // Repo\n /* https://developer.github.com/webhooks/event-payloads/#repository */\n repoEdited(app, appContext);\n\n // PR\n /* https://developer.github.com/webhooks/event-payloads/#pull_request */\n openedHandler(app, appContext);\n editedHandler(app, appContext);\n closedHandler(app, appContext);\n reopenedHandler(app, appContext);\n\n reviewRequestedHandler(app, appContext);\n reviewRequestRemovedHandler(app, appContext);\n reviewSubmittedHandler(app, appContext);\n reviewDismissedHandler(app, appContext);\n labelsChanged(app, appContext);\n synchronizeHandler(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#pull_request_review_comment */\n /* https://developer.github.com/webhooks/event-payloads/#issue_comment */\n commentCreated(app, appContext);\n commentEditedOrDeleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#check_run */\n checkrunCompleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#check_suite */\n checksuiteCompleted(app, appContext);\n\n /* https://developer.github.com/webhooks/event-payloads/#status */\n status(app, appContext);\n\n /* commands */\n // commands(app, 'update-branch', () => {});\n}\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport type { MongoBaseModel } from 'liwi-mongo';\nimport { MongoStore, MongoConnection } from 'liwi-mongo';\nimport type { SlackMessage } from './context/SlackMessage';\nimport type { MessageCategory } from './dm/MessageCategory';\n\n// export interface PrEventsModel extends MongoModel {\n// owner: string;\n// repo: string;\n// prId: string;\n// prNumber: string;\n// event: string;\n// }\n\nexport type AccountType = 'Organization' | 'User';\n\nexport interface AccountEmbed {\n id: number;\n login: string;\n type: AccountType;\n}\n\ninterface RepoEmbed {\n id: number;\n name: string;\n}\n\ninterface PrEmbed {\n number: number;\n}\n\ntype AccountEmbedWithoutType = Omit;\n\nexport interface UserDmSettings extends MongoBaseModel {\n userId: number;\n orgId: number;\n settings: Record;\n}\n\n// TODO _id is number\ninterface BaseAccount extends MongoBaseModel {\n login: string;\n installationId?: number;\n}\n\nexport interface User extends BaseAccount {\n type: string;\n}\n\nexport interface Org extends BaseAccount {\n slackToken?: string;\n}\n\nexport interface OrgMember extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n user: AccountEmbedWithoutType;\n slack?: { id: string };\n}\n\nexport interface OrgTeam extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n name: string;\n slug: string;\n description: string;\n}\n\nexport type SlackMessageType =\n | 'review-comment'\n | 'issue-comment'\n | 'review-submitted'\n | 'review-requested';\n\nexport interface SlackSentMessage extends MongoBaseModel {\n type: SlackMessageType;\n typeId: number | string;\n account: AccountEmbed;\n message: SlackMessage;\n sentTo: {\n channel: string;\n ts: string;\n }[];\n}\n\nexport interface AutomergeLog extends MongoBaseModel {\n account: AccountEmbed;\n repoFullName: string;\n pr: {\n id: number;\n number: number;\n isRenovate: boolean;\n mergeableState: string;\n };\n type:\n | 'rebase-renovate'\n | 'unknown mergeable_state'\n | 'blocked mergeable_state'\n | 'behind mergeable_state'\n | 'not mergeable'\n | 'failed status or checks'\n | 'already merged';\n action: 'remove' | 'reschedule' | 'wait' | 'update branch';\n}\n\nexport interface ReviewflowPr extends MongoBaseModel {\n account: AccountEmbed;\n repo: RepoEmbed;\n pr: PrEmbed;\n commentId: number;\n}\n\nexport interface MongoStores {\n connection: MongoConnection;\n userDmSettings: MongoStore;\n users: MongoStore;\n orgs: MongoStore;\n orgMembers: MongoStore;\n orgTeams: MongoStore;\n slackSentMessages: MongoStore;\n automergeLogs: MongoStore;\n prs: MongoStore;\n // prEvents: MongoStore;\n}\n\nif (!process.env.MONGO_DB) {\n throw new Error('MONGO_DB is missing in process.env');\n}\n\nexport default function init(): MongoStores {\n const config = new Map([\n ['host', process.env.MONGO_HOST || 'localhost'],\n ['port', process.env.MONGO_PORT || '27017'],\n ['database', process.env.MONGO_DB as string],\n ]);\n if (process.env.MONGO_USER) {\n config.set('user', process.env.MONGO_USER);\n config.set('password', process.env.MONGO_PASSWORD as string);\n }\n const connection = new MongoConnection(config);\n\n // const prEvents = new MongoStore(connection, 'prEvents');\n // prEvents.collection.then((coll) => {\n // coll.createIndex({ owner: 1, repo: 1, ???: 1 });\n // });\n\n const userDmSettings = new MongoStore(\n connection,\n 'userDmSettings',\n );\n userDmSettings.collection.then((coll) => {\n coll.createIndex({ userId: 1, orgId: 1 }, { unique: true });\n });\n\n const users = new MongoStore(connection, 'users');\n users.collection.then((coll) => {\n coll.createIndex({ login: 1 }, { unique: true });\n });\n\n const orgs = new MongoStore(connection, 'orgs');\n orgs.collection.then((coll) => {\n coll.createIndex({ login: 1 }, { unique: true });\n });\n\n const orgMembers = new MongoStore(connection, 'orgMembers');\n orgMembers.collection.then((coll) => {\n coll.createIndex({ 'user.id': 1, 'org.id': 1 }, { unique: true });\n });\n\n const orgTeams = new MongoStore(connection, 'orgTeams');\n orgTeams.collection.then((coll) => {\n coll.createIndex({ 'org.id': 1 });\n });\n\n const slackSentMessages = new MongoStore(\n connection,\n 'slackSentMessages',\n );\n slackSentMessages.collection.then((coll) => {\n coll.createIndex({\n 'account.id': 1,\n 'account.type': 1,\n type: 1,\n typeId: 1,\n });\n // remove older than 14 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 14 * 24 * 60 * 60 * 1000) },\n });\n });\n\n const automergeLogs = new MongoStore(\n connection,\n 'automergeLogs',\n );\n automergeLogs.collection.then((coll) => {\n coll.createIndex({\n repoFullName: 1,\n type: 1,\n });\n coll.createIndex({\n repoFullName: 1,\n 'pr.number': 1,\n });\n // remove older than 30 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) },\n });\n });\n\n const prs = new MongoStore(connection, 'prs');\n prs.collection.then((coll) => {\n coll.createIndex(\n {\n 'account.id': 1,\n 'repo.id': 1,\n 'pr.number': 1,\n },\n { unique: true },\n );\n // remove older than 12 * 30 days\n coll.deleteMany({\n created: { $lt: new Date(Date.now() - 12 * 30 * 24 * 60 * 60 * 1000) },\n });\n });\n\n // return { connection, prEvents };\n return {\n connection,\n userDmSettings,\n users,\n orgs,\n orgMembers,\n orgTeams,\n slackSentMessages,\n automergeLogs,\n prs,\n };\n}\n","import type { Octokit } from '@octokit/core';\nimport { WebClient } from '@slack/web-api';\nimport type { MongoStores, Org, OrgMember } from '../mongo';\nimport { createLink } from './utils';\n\ninterface QueueItem {\n github: Octokit;\n slackClient: WebClient;\n member: OrgMember;\n}\n\nexport const createSlackHomeWorker = (mongoStores: MongoStores) => {\n const updateMember = async (\n github: Octokit,\n slackClient: WebClient,\n member: OrgMember,\n ): Promise => {\n if (!member.slack?.id) return;\n // console.log('update member', member.org.login, member.user.login);\n\n /* search limit: 30 requests per minute = 7 update/min max */\n const [\n prsWithRequestedReviews,\n prsToMerge,\n prsWithRequestedChanges,\n prsInDraft,\n ] = await Promise.all([\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open review-requested:${member.user.login} `,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} label:\":ok_hand: code/approved\"`,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} label:\":ok_hand: code/changes-requested\"`,\n sort: 'created',\n order: 'desc',\n }),\n github.search.issuesAndPullRequests({\n q: `is:pr user:${member.org.login} is:open assignee:${member.user.login} draft:true`,\n sort: 'created',\n order: 'desc',\n per_page: 5,\n }),\n ]);\n\n const blocks: any[] = [];\n\n const buildBlocks = (title: string, results: any) => {\n if (!results.total_count) return;\n\n blocks.push(\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*${title}*`,\n },\n },\n {\n type: 'divider',\n },\n ...results.items\n .map((pr: any) => {\n const repoName = pr.repository_url.slice(\n 'https://api.github.com/repos/'.length,\n );\n const prFullName = `${repoName}#${pr.number}`;\n\n return [\n {\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: `*${createLink(pr.html_url, pr.title)}*`,\n // ${pr.labels.map((l) => `{${l.name}}`).join(' · ')}\n },\n },\n {\n type: 'context',\n elements: [\n {\n type: 'mrkdwn',\n text: `${createLink(pr.html_url, prFullName)} ${\n pr.draft ? '· _Draft_' : ''\n }`,\n },\n {\n type: 'image',\n image_url: pr.user.avatar_url,\n alt_text: pr.user.login,\n },\n {\n type: 'mrkdwn',\n text: `${pr.user.login}`,\n },\n ],\n },\n ];\n })\n .flat(),\n {\n type: 'context',\n elements: [\n {\n type: 'image',\n image_url:\n 'https://api.slack.com/img/blocks/bkb_template_images/placeholder.png',\n alt_text: 'placeholder',\n },\n ],\n },\n );\n };\n\n buildBlocks(':eyes: Requested Reviews', prsWithRequestedReviews.data);\n buildBlocks(':white_check_mark: Ready to Merge', prsToMerge.data);\n buildBlocks(':x: Changes Requested', prsWithRequestedChanges.data);\n buildBlocks(':construction: Drafts', prsInDraft.data);\n\n if (blocks.length === 0) {\n blocks.push({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: \":tada: It looks like you don't have any PR to review!\",\n },\n });\n }\n\n slackClient.views.publish({\n user_id: member.slack.id,\n view: {\n type: 'home',\n blocks,\n },\n });\n };\n\n let workerInterval: ReturnType | undefined;\n const queueKeys = new Set();\n const queue: QueueItem[] = [];\n\n const stop = (): void => {\n if (workerInterval !== undefined) {\n clearInterval(workerInterval);\n workerInterval = undefined;\n }\n };\n\n const start = (): void => {\n if (workerInterval !== undefined) return;\n workerInterval = setInterval(() => {\n const item = queue.shift();\n if (!item) {\n stop();\n return;\n }\n\n const { github, slackClient, member } = item;\n const memberId = member.slack?.id;\n\n const key = `${member.org.id}_${memberId}`;\n queueKeys.delete(key);\n\n updateMember(github, slackClient, member);\n }, 9000); // 7/min 60s 1min = 1 ttes les 8.5s max\n };\n\n const scheduleUpdateMember = (\n github: Octokit,\n slackClient: WebClient,\n member: OrgMember,\n ): void => {\n const memberId = member.slack?.id;\n if (!memberId) return;\n\n const key = `${member.org.id}_${memberId}`;\n\n if (!queueKeys.has(key)) {\n queueKeys.add(key);\n queue.push({\n github,\n slackClient,\n member,\n });\n start();\n }\n };\n\n const scheduleUpdateOrg = async (\n github: Octokit,\n org: Org,\n slackClient = new WebClient(org.slackToken),\n ): Promise => {\n const cursor = await mongoStores.orgMembers.cursor();\n cursor.forEach((member) => {\n scheduleUpdateMember(github, slackClient, member);\n });\n };\n\n const scheduleUpdateAllOrgs = async (\n auth: (installationId: number) => Promise,\n ): Promise => {\n const cursor = await mongoStores.orgs.cursor();\n cursor.forEach(async (org) => {\n if (!org.slackToken || !org.installationId) return;\n const github = await auth(org.installationId);\n await scheduleUpdateOrg(github, org);\n });\n };\n\n return {\n scheduleUpdateMember,\n scheduleUpdateOrg,\n scheduleUpdateAllOrgs,\n };\n};\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport 'dotenv/config';\nimport { run } from 'probot';\nimport appRouter from './appRouter';\nimport type { AppContext } from './context/AppContext';\nimport initApp from './initApp';\nimport mongoInit from './mongo';\nimport { createSlackHomeWorker } from './slack/home';\n\nif (!process.env.REVIEWFLOW_NAME) process.env.REVIEWFLOW_NAME = 'reviewflow';\nconsole.log({ name: process.env.REVIEWFLOW_NAME });\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\nrun(({ app, getRouter }) => {\n const mongoStores = mongoInit();\n const slackHome = createSlackHomeWorker(mongoStores);\n const appContext: AppContext = { mongoStores, slackHome };\n appRouter(app, getRouter, appContext);\n initApp(app, appContext);\n slackHome.scheduleUpdateAllOrgs((id: number) => app.auth(id));\n});\n"],"names":["process","env","GITHUB_CLIENT_ID","Error","GITHUB_CLIENT_SECRET","oauth2","create","client","id","secret","auth","tokenHost","tokenPath","authorizePath","Layout","lang","title","REVIEWFLOW_NAME","children","React","padding","AUTH_SECRET_KEY","signPromisified","promisify","sign","verifyPromisified","verify","secure","SECURE_COOKIE","createRedirectUri","req","host","hostname","PORT","readAuthCookie","strategy","cookie","cookies","algorithm","audience","headers","getAuthInfoFromCookie","res","authInfo","clearCookie","undefined","createApi","accessToken","Octokit","getUser","redirect","api","router","get","redirectUri","githubAuth","authorizationCode","authorizeURL","redirect_uri","scope","query","error","send","error_description","code","result","getToken","renderToStaticMarkup","access_token","user","users","getAuthenticated","data","login","time","Date","now","token","expiresIn","httpOnly","home","orgs","listForAuthenticatedUser","display","flexGrow","map","org","config","autoAssignToCreator","trimTitle","requiresReviewRequest","prDefaultOptions","featureBranch","autoMergeWithSkipCi","autoMerge","deleteAfterMerge","parsePR","regExp","summary","groups","dev","christophehurpeau","tilap","waitForGroups","teams","labels","list","name","color","review","ci","inProgress","succeeded","failed","needsReview","requested","changesRequested","approved","ignoreRepoPattern","autoMergeRenovateWithSkipCi","bot","status","statusInfoFromMatch","match","issue","inBody","url","botUsers","JulienBreux","ORNIKAR_EMAIL_DOMAIN","TheR3aLp3nGuinJM","abarreir","damienorny","darame07","Pixy","machartier","HugoGarrido","CorentinAndre","Mxime","vlbr","mdcarter","ChibiBlasphem","PSniezak","design","jperriere","CoralineColasse","Lenamari","loicleser","ops","logins","backends","frontends","description","duplicate","documentation","rfc","bug","enhancement","question","wontfix","chrisconfig","accountConfigs","ornikar","reviewflow","defaultDmSettings","cache","Map","getDefaultDmSettings","accountConfig","defaultConfig","updateCache","userId","newSettings","orgCache","set","getUserDmSettings","mongoStores","orgId","orgDefaultDmSettings","userDmSettingsConfig","userDmSettings","findOne","settings","syncOrg","github","installationId","orgInStore","upsertOne","_id","orgEmbed","memberIds","Promise","all","paginate","listMembers","endpoint","merge","member","push","orgMembers","type","deleteMany","$not","$in","syncTeams","teamIds","team","orgTeams","slug","dmMessages","orgSettings","octokitApp","find","o","params","findByKey","installation","apps","getOrgInstallation","catch","err","width","Object","entries","key","__html","patch","bodyParser","json","body","collection","updateOne","$set","value","updated","$setOnInsert","created","upsert","repository","repos","per_page","repo","owner","length","permissions","admin","data2","getRepoInstallation","syncUser","userInfo","userSettings","u","getUserInstallation","username","appRouter","app","getRouter","use","cookieParser","ExcludesFalsy","Boolean","ExcludesNullish","getOrCreateAccount","accountInfo","getKeys","keys","emojiRegex","createEmojiRegex","getEmojiFromRepoDescription","startsWith","emoji","exec","voidTeamSlack","mention","postMessage","resolve","updateMessage","deleteMessage","addReaction","updateHome","initTeamSlack","slackHome","context","account","payload","slackToken","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackEmails","values","slackClient","WebClient","membersInDb","findAll","members","foundEmailMembers","forEach","email","m","slack","im","missingEmails","filter","includes","memberEmailToMemberId","page","profile","has","partialUpdateMany","conversations","open","channel","console","membersMap","getUserFromGithubLogin","githubLogin","category","githubId","message","log","debug","DRY_RUN","chat","text","blocks","attachments","secondaryBlocks","thread_ts","ts","ok","update","delete","reactions","add","timestamp","scheduleUpdateMember","octokit","initAccountContext","appContext","slackPromise","githubLoginToGroup","githubLoginToTeams","teamName","getReviewerGroups","githubLogins","Set","lock","Lock","accountEmbed","accountType","callback","reject","logInfos","info","createReleaseCallback","release","getReviewerGroup","getTeamsForLogin","approveShouldWait","reviewerGroup","requestedReviewers","includesReviewerGroup","includesWaitForGroups","requestedReviewerGroups","request","some","group","accountContextsPromise","accountContexts","obtainAccountContext","existingAccountContext","existingPromise","promise","then","accountContext","handlerOrgChange","organization","createHandlerOrgChange","options","optionsRegexps","option","regexp","RegExp","optionsLabels","label","parseOptions","content","defaultOptions","parseCommitNotes","commitNotes","replace","trim","parseBody","hasLabelInPR","prLabels","l","hasFailedStatusOrChecks","pr","checks","listForRef","ref","head","sha","failedChecks","check_runs","check","conclusion","combinedStatus","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","pullRequest","repoContext","reviewflowPrContext","autoMergeLabel","removePrFromAutomergeQueue","number","isRenovatePr","createMergeLockPrFromPr","branch","addLog","action","repoFullName","full_name","automergeLogs","insertOne","isRenovate","mergeableState","mergeable_state","hasNeedsReview","hasRequestedReview","requested_reviewers","lockedPr","getMergeLockedPr","String","prId","prNumber","pushAutomergeQueue","addMergeLockPr","mergeable","prResult","pulls","pull_number","merged","reschedule","renovateRebaseBody","issues","issue_number","base","parsedBody","commentBody","mergeResult","merge_method","commit_title","commit_message","errorMessage","defaultCommentBody","toMarkdownOptions","join","toMarkdownInfos","infos","getReplacement","updateOptions","optionsToUpdate","internalUpdateBodyOptionsAndInfos","infosAndCommitNotesParagraph","createCommentBody","updateCommentOptions","updatedOptions","updateCommentBodyInfos","updateCommentBodyCommitsNotes","removeDeprecatedReviewflowInPrBody","prBody","createReviewflowComment","pullRequestNumber","createComment","getReviewflowCommentById","commentId","getComment","comment_id","getReviewflowPrContext","reviewflowCommentPromise","prEmbed","comment","reviewflowPr","prs","repoEmbed","existing","partialUpdateByKey","fetchPr","getLabelsForRepo","listLabelsForRepo","initRepoLabels","finalLabels","labelKey","labelConfig","labelColor","slice","existingLabel","createLabel","current_name","updateLabel","shouldIgnoreRepo","repoName","ignoreRepoRegexp","test","createGetReviewLabelIds","shouldIgnore","reviewGroupNames","initRepoContext","fullName","repoEmoji","getReviewLabelIds","needsReviewLabelIds","requestedReviewLabelIds","changesRequestedLabelIds","approvedReviewLabelIds","protectedLabelIds","labelIdToGroupName","reviewGroupLabels","lockMergePr","automergeQueue","lockPR","prOrPrIssueId","setTimeout","hasChangesRequestedReview","hasApprovesReview","getNeedsReviewGroupNames","reason","shift","previousLength","p","lockPullRequest","repoContextsPromise","repoContexts","obtainRepoContext","existingRepoContext","warn","createRepoHandler","createPullRequestHandler","getPullRequestInPayload","callbackPr","callbackBeforeLock","createPullRequestsHandler","getPrs","checkrunCompleted","on","check_run","pull_requests","updatedPr","checksuiteCompleted","check_suite","createStatus","createCommitStatus","target_url","addStatusCheck","previousSha","hasPrCheck","head_sha","started_at","created_at","completed_at","toISOString","output","updateStatusCheckFromLabels","createFailedStatusCheck","rr","needsReviewGroupNames","updateReviewStatus","reviewGroup","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toAddNames","toDelete","toDeleteNames","getLabelFromKey","reviewConfig","prLabel","size","addLabels","toDeleteName","removeLabel","newLabelNamesArray","oldLabels","setLabels","closed","pull_request","isNotFork","git","deleteRef","assignees","assignee","createLink","createPrLink","html_url","createMrkdwnSectionBlock","createSlackMessageWithSecondaryBlock","secondaryBlockText","getPullRequestFromPayload","getReviewersAndReviewStates","userIds","reviewers","reviewStatesByUser","listReviews","reviews","toUpperCase","reviewStates","dismissed","reviewer","checkIfUserIsBot","checkIfIsThisBot","parse","issueParser","actions","issuePrefixes","parseMentions","mentions","slackifyCommentBody","multipleLines","slackifyMarkdown","getDiscussion","in_reply_to_id","listComments","c","getMentions","discussion","getUsersInThread","prCommentCreated","saveInDb","results","filtered","slackSentMessages","typeId","sentTo","pull_request_review_id","commentByOwner","followers","f","usersInThread","prUrl","slackUtils","ownerMention","commentLink","createMessage","toOwner","ownerPart","promisesOwner","promisesNotOwner","slackifiedBody","start_line","isBotUser","slackMessage","follower","updatePrCommentBody","newBody","updateComment","updatePrCommentBodyIfNeeded","updatePrCommentBodyOptions","syncLabel","shouldHaveLabel","prHasLabel","onRemove","onAdd","response","calcDefaultOptions","featureBranchLabel","automergeLabel","skipCiLabel","prHasFeatureBranchLabel","prHasSkipCiLabel","prHasAutoMergeLabel","syncLabelsAfterCommentBodyEdited","prCommentEditedOrDeleted","sender","closed_at","criteria","sentMessages","sentMessage","readCommitsAndUpdateInfos","commits","listCommits","conventionalCommits","commit","breakingChangesCommits","index","breakingChangesNotes","notes","note","breakingChangesLabel","newCommentBody","cleanNewLines","checkIfHasDiff","text1","text2","updatePrIfNeeded","hasDiffInTitle","hasDiffInBody","diff","cleanTitle","s","arg1","arg2","toLowerCase","editOpenedPR","shouldUpdateCommentBodyInfos","isPrFromBot","errorRule","rule","date","hasLintPrCheck","promises","commentBodyInfos","shouldCreateCommentBody","edited","updatedPullRequest","updateBranch","isFromRenovate","labelsChanged","fromRenovate","codeApprovedLabel","autoMergeSkipCiLabel","createReview","event","updateBranchLabel","autoApproveAndAutoMerge","autoAssignPRToCreator","addAssignees","opened","reviewDismissed","hasChangesRequestedInReviews","hasApprovals","hasRequestedReviewsForGroup","reviewRequestRemoved","requested_reviewer","hasApprovedInReviews","sentMessageRequestedReview","split","deleteOne","reviewRequested","getEmojiFromState","reviewSubmitted","reviewUrl","reviewByOwner","newLabels","isSameBranch","branches","b","synchronize","before","repoEdited","initApp","openedHandler","editedHandler","closedHandler","reopenedHandler","reviewRequestedHandler","reviewRequestRemovedHandler","reviewSubmittedHandler","reviewDismissedHandler","synchronizeHandler","commentCreated","commentEditedOrDeleted","MONGO_DB","init","MONGO_HOST","MONGO_PORT","MONGO_USER","MONGO_PASSWORD","connection","MongoConnection","MongoStore","coll","createIndex","unique","$lt","createSlackHomeWorker","updateMember","prsWithRequestedReviews","prsToMerge","prsWithRequestedChanges","prsInDraft","search","issuesAndPullRequests","q","sort","order","buildBlocks","total_count","items","repository_url","prFullName","elements","draft","image_url","avatar_url","alt_text","flat","views","publish","user_id","view","workerInterval","queueKeys","queue","stop","clearInterval","start","setInterval","item","memberId","scheduleUpdateOrg","cursor","scheduleUpdateAllOrgs","run","mongoInit"],"mappings":"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"} \ No newline at end of file diff --git a/src/context/accountContext.ts b/src/context/accountContext.ts index 0bc908d17..374645140 100644 --- a/src/context/accountContext.ts +++ b/src/context/accountContext.ts @@ -91,20 +91,20 @@ const initAccountContext = async ( lock: (callback: () => Promise | void): Promise => { return new Promise((resolve, reject) => { const logInfos = { account: accountInfo.login }; - context.log.info('lock: try to lock account', logInfos); + context.log.info(logInfos, 'lock: try to lock account'); // eslint-disable-next-line @typescript-eslint/no-misused-promises lock('_', async (createReleaseCallback) => { const release = createReleaseCallback(() => {}); - context.log.info('lock: lock account acquired', logInfos); + context.log.info(logInfos, 'lock: lock account acquired'); try { await callback(); } catch (err) { - context.log.info('lock: release account (with error)', logInfos); + context.log.info(logInfos, 'lock: release account (with error)'); release(); reject(err); return; } - context.log.info('lock: release account', logInfos); + context.log.info(logInfos, 'lock: release account'); release(); resolve(); }); diff --git a/src/context/initRepoLabels.ts b/src/context/initRepoLabels.ts index 960e5c865..0d8f44d1d 100644 --- a/src/context/initRepoLabels.ts +++ b/src/context/initRepoLabels.ts @@ -74,12 +74,15 @@ export const initRepoLabels = async ( existingLabel.color !== labelColor || existingLabel.description !== description ) { - context.log.info('Needs to update label', { - current_name: existingLabel.name, - name: existingLabel.name !== labelConfig.name && labelConfig.name, - color: existingLabel.color !== labelColor && labelColor, - description: existingLabel.description !== description && description, - }); + context.log.info( + { + current_name: existingLabel.name, + name: existingLabel.name !== labelConfig.name && labelConfig.name, + color: existingLabel.color !== labelColor && labelColor, + description: existingLabel.description !== description && description, + }, + 'Needs to update label', + ); const result = await context.octokit.issues.updateLabel( context.repo({ diff --git a/src/context/initTeamSlack.ts b/src/context/initTeamSlack.ts index 30b8d2ff6..6548190e5 100644 --- a/src/context/initTeamSlack.ts +++ b/src/context/initTeamSlack.ts @@ -112,11 +112,14 @@ export const initTeamSlack = async ( githubLogin: string, message: SlackMessage, ): Promise => { - context.log.debug('slack: post message', { - category, - githubLogin, - message, - }); + context.log.debug( + { + category, + githubLogin, + message, + }, + 'slack: post message', + ); if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null; const userDmSettings = await getUserDmSettings( @@ -148,7 +151,7 @@ export const initTeamSlack = async ( channel: string, message: SlackMessage, ): Promise => { - context.log.debug('slack: update message', { ts, channel, message }); + context.log.debug({ ts, channel, message }, 'slack: update message'); if (process.env.DRY_RUN && process.env.DRY_RUN !== 'false') return null; const result = await slackClient.chat.update({ @@ -164,7 +167,7 @@ export const initTeamSlack = async ( return { ts: result.ts as string, channel: result.channel as string }; }, deleteMessage: async (ts: string, channel: string): Promise => { - context.log.debug('slack: delete message', { ts, channel }); + context.log.debug({ ts, channel }, 'slack: delete message'); await slackClient.chat.delete({ ts, channel, @@ -175,7 +178,7 @@ export const initTeamSlack = async ( channel: string, name: string, ): Promise => { - context.log.debug('slack: add reaction', { ts, channel, name }); + context.log.debug({ ts, channel, name }, 'slack: add reaction'); await slackClient.reactions.add({ timestamp: ts, channel, @@ -184,7 +187,7 @@ export const initTeamSlack = async ( }, updateHome: (githubLogin: string): void => { - context.log.debug('update slack home', { githubLogin }); + context.log.debug({ githubLogin }, 'update slack home'); const user = getUserFromGithubLogin(githubLogin); if (!user || !user.member) return; diff --git a/src/context/repoContext.ts b/src/context/repoContext.ts index 8fe4d8ae2..be2aa4d92 100644 --- a/src/context/repoContext.ts +++ b/src/context/repoContext.ts @@ -190,20 +190,20 @@ async function initRepoContext( prOrPrIssueId, prNumber, }; - context.log.debug('lock: try to lock pr', logInfos); + context.log.debug(logInfos, 'lock: try to lock pr'); // eslint-disable-next-line @typescript-eslint/no-misused-promises lock(String(prNumber), async (createReleaseCallback) => { const release = createReleaseCallback(() => {}); - context.log.info('lock: lock pr acquired', logInfos); + context.log.info(logInfos, 'lock: lock pr acquired'); try { await callback(); } catch (err) { - context.log.info('lock: release pr (with error)', logInfos); + context.log.info(logInfos, 'lock: release pr (with error)'); release(); reject(err); return; } - context.log.info('lock: release pr', logInfos); + context.log.info(logInfos, 'lock: release pr'); release(); resolve(); }); @@ -218,7 +218,7 @@ async function initRepoContext( const reschedule = (context: Context, pr: LockedMergePr): void => { if (!pr) throw new Error('Cannot reschedule undefined'); - context.log.info('reschedule', pr); + context.log.info(pr, 'reschedule'); setTimeout(() => { lockPR('reschedule', -1, () => { return lockPR(String(pr.id), pr.number, async () => { @@ -271,7 +271,11 @@ async function initRepoContext( if (lockMergePr && String(lockMergePr.number) === String(prNumber)) { lockMergePr = automergeQueue.shift(); context.log(`merge lock: remove ${fullName}#${prNumber}: ${reason}`); - context.log(`merge lock: next ${fullName}`, lockMergePr); + if (lockMergePr) { + context.log(lockMergePr, `merge lock: next ${fullName}`); + } else { + context.log(`merge lock: nothing next ${fullName}`); + } if (lockMergePr) { reschedule(context, lockMergePr); } @@ -286,12 +290,15 @@ async function initRepoContext( } }, pushAutomergeQueue: (pr: LockedMergePr): void => { - context.log('merge lock: push queue', { - repo: fullName, - pr, - lockMergePr, - automergeQueue, - }); + context.log( + { + repo: fullName, + pr, + lockMergePr, + automergeQueue, + }, + 'merge lock: push queue', + ); if (!automergeQueue.some((p) => p.number === pr.number)) { automergeQueue.push(pr); } diff --git a/src/events/pr-handlers/actions/autoMergeIfPossible.ts b/src/events/pr-handlers/actions/autoMergeIfPossible.ts index 1068a66d3..eb502dade 100644 --- a/src/events/pr-handlers/actions/autoMergeIfPossible.ts +++ b/src/events/pr-handlers/actions/autoMergeIfPossible.ts @@ -26,9 +26,12 @@ const hasFailedStatusOrChecks = async ( ); if (failedChecks.length > 0) { - context.log.info(`automerge not possible: failed check pr ${pr.id}`, { - checks: failedChecks.map((check) => check.name), - }); + context.log.info( + { + checks: failedChecks.map((check) => check.name), + }, + `automerge not possible: failed check pr ${pr.id}`, + ); return true; } @@ -44,9 +47,12 @@ const hasFailedStatusOrChecks = async ( (status) => status.state === 'failure' || status.state === 'error', ); - context.log.info(`automerge not possible: failed status pr ${pr.id}`, { - statuses: failedStatuses.map((status) => status.context), - }); + context.log.info( + { + statuses: failedStatuses.map((status) => status.context), + }, + `automerge not possible: failed status pr ${pr.id}`, + ); return true; } @@ -133,10 +139,13 @@ export const autoMergeIfPossible = async ( const lockedPr = repoContext.getMergeLockedPr(); if (lockedPr && String(lockedPr.number) !== String(pullRequest.number)) { - context.log.info('automerge not possible: locked pr', { - prId: pullRequest.id, - prNumber: pullRequest.number, - }); + context.log.info( + { + prId: pullRequest.id, + prNumber: pullRequest.number, + }, + 'automerge not possible: locked pr', + ); repoContext.pushAutomergeQueue(createMergeLockPrFromPr()); return false; } @@ -256,10 +265,13 @@ export const autoMergeIfPossible = async ( if (pullRequest.mergeable_state === 'behind') { addLog('behind mergeable_state', 'update branch'); - context.log.info('automerge not possible: update branch', { - head: pullRequest.head.ref, - base: pullRequest.base.ref, - }); + context.log.info( + { + head: pullRequest.head.ref, + base: pullRequest.base.ref, + }, + 'automerge not possible: update branch', + ); await context.octokit.repos.merge({ owner: pullRequest.head.repo.owner.login, @@ -304,7 +316,7 @@ export const autoMergeIfPossible = async ( } (#${pullRequest.number})`, commit_message: options.featureBranch ? undefined : '', // TODO add BC }); - context.log.debug('merge result:', mergeResult.data); + context.log.debug(mergeResult.data, 'merge result:'); repoContext.removePrFromAutomergeQueue( context, pullRequest.number, @@ -312,7 +324,7 @@ export const autoMergeIfPossible = async ( ); return Boolean('merged' in mergeResult.data && mergeResult.data.merged); } catch (err) { - context.log.info('could not merge:', err.message); + context.log.info({ errorMessage: err.message }, 'could not merge:'); repoContext.reschedule(context, createMergeLockPrFromPr()); return false; } diff --git a/src/events/pr-handlers/actions/updateBranch.ts b/src/events/pr-handlers/actions/updateBranch.ts index a724ebfa3..a882fb78f 100644 --- a/src/events/pr-handlers/actions/updateBranch.ts +++ b/src/events/pr-handlers/actions/updateBranch.ts @@ -20,11 +20,14 @@ export const updateBranch = async ( }) .catch((err) => ({ error: err } as any)); - context.log.info('update branch result', { - status: result.status, - sha: result.data?.sha, - error: result.error, - }); + context.log.info( + { + status: result.status, + sha: result.data?.sha, + error: result.error, + }, + 'update branch result', + ); if (result.status === 204) { context.octokit.issues.createComment( diff --git a/src/events/pr-handlers/actions/updateReviewStatus.ts b/src/events/pr-handlers/actions/updateReviewStatus.ts index f3b54bc5a..6eddafda1 100644 --- a/src/events/pr-handlers/actions/updateReviewStatus.ts +++ b/src/events/pr-handlers/actions/updateReviewStatus.ts @@ -24,11 +24,14 @@ export const updateReviewStatus = async < remove?: (GroupLabels | false | undefined)[]; }, ): Promise => { - context.log.debug('updateReviewStatus', { - reviewGroup, - labelsToAdd, - labelsToRemove, - }); + context.log.debug( + { + reviewGroup, + labelsToAdd, + labelsToRemove, + }, + 'updateReviewStatus', + ); let prLabels: PullRequestLabels = pullRequest.labels || []; if (!reviewGroup) return prLabels; @@ -99,13 +102,16 @@ export const updateReviewStatus = async < if (toAdd.size !== 0 || toDelete.size !== 0) { if (toDelete.size === 0 || toDelete.size < 4) { - context.log.debug('updateReviewStatus', { - reviewGroup, - toAdd: [...toAdd], - toDelete: [...toDelete], - toAddNames: [...toAddNames], - toDeleteNames: [...toDeleteNames], - }); + context.log.debug( + { + reviewGroup, + toAdd: [...toAdd], + toDelete: [...toDelete], + toAddNames: [...toAddNames], + toDeleteNames: [...toDeleteNames], + }, + 'updateReviewStatus', + ); if (toAdd.size !== 0) { const result = await context.octokit.issues.addLabels( @@ -126,22 +132,28 @@ export const updateReviewStatus = async < ); prLabels = result.data; } catch (err) { - context.log.warn('error removing label', { - err: err?.message, - }); + context.log.warn( + { + err: err?.message, + }, + 'error removing label', + ); } } } } else { const newLabelNamesArray = [...newLabelNames]; - context.log.debug('updateReviewStatus', { - reviewGroup, - toAdd: [...toAdd], - toDelete: [...toDelete], - oldLabels: prLabels.map((l) => l.name), - newLabelNames: newLabelNamesArray, - }); + context.log.debug( + { + reviewGroup, + toAdd: [...toAdd], + toDelete: [...toDelete], + oldLabels: prLabels.map((l) => l.name), + newLabelNames: newLabelNamesArray, + }, + 'updateReviewStatus', + ); const result = await context.octokit.issues.setLabels( context.issue({ diff --git a/src/events/pr-handlers/actions/updateStatusCheckFromLabels.ts b/src/events/pr-handlers/actions/updateStatusCheckFromLabels.ts index c9405758b..45b321340 100644 --- a/src/events/pr-handlers/actions/updateStatusCheckFromLabels.ts +++ b/src/events/pr-handlers/actions/updateStatusCheckFromLabels.ts @@ -23,7 +23,7 @@ const addStatusCheck = async function < ) ).data.check_runs.find((check) => check.name === process.env.REVIEWFLOW_NAME); - context.log.debug('add status check', { hasPrCheck, state, description }); + context.log.debug({ hasPrCheck, state, description }, 'add status check'); if (hasPrCheck) { await context.octokit.checks.create( @@ -65,11 +65,14 @@ export const updateStatusCheckFromLabels = < labels: PullRequestLabels = pullRequest.labels || [], previousSha?: string, ): Promise => { - context.log.debug('updateStatusCheckFromLabels', { - labels: labels.map((l) => l?.name), - hasNeedsReview: repoContext.hasNeedsReview(labels), - hasApprovesReview: repoContext.hasApprovesReview(labels), - }); + context.log.debug( + { + labels: labels.map((l) => l?.name), + hasNeedsReview: repoContext.hasNeedsReview(labels), + hasApprovesReview: repoContext.hasApprovesReview(labels), + }, + 'updateStatusCheckFromLabels', + ); const createFailedStatusCheck = (description: string): Promise => addStatusCheck(