diff --git a/dist/index-node12-dev.cjs.js b/dist/index-node12-dev.cjs.js index aeb0ff46c..67adcd3da 100644 --- a/dist/index-node12-dev.cjs.js +++ b/dist/index-node12-dev.cjs.js @@ -246,7 +246,7 @@ const config = { parsePR: { title: [{ regExp: // eslint-disable-next-line unicorn/no-unsafe-regex - /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\(([/a-z-]*)\))?(!)?:\s/, + /^(?revert: )?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\([/a-z-]+\)?((?=:\s)|(?=!:\s)))?(?!)?(?:\s.*)$/, error: { title: 'Title does not match commitlint conventional', summary: 'https://www.npmjs.com/package/@commitlint/config-conventional' @@ -381,8 +381,8 @@ const config$2 = { }, parsePR: { title: [{ - regExp: // eslint-disable-next-line unicorn/no-unsafe-regex - /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\(([/A-Za-z-]*)\))?:\s/, + // eslint-disable-next-line unicorn/no-unsafe-regex + regExp: /^(?revert: )?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\([/A-Za-z-]+\)?((?=:\s)|(?=!:\s)))?(?!)?(?:\s.*)$/, error: { title: 'Title does not match commitlint conventional', summary: 'https://www.npmjs.com/package/@commitlint/config-conventional' @@ -391,7 +391,7 @@ const config$2 = { bot: false, regExp: /\s([A-Z][\dA-Z]+-(\d+)|\[no issue])$/, error: { - title: 'Title does not have JIRA issue', + title: 'Title does not have Jira issue', summary: 'The PR title should end with ONK-0000, or [no issue]' }, status: 'jira-issue', @@ -412,6 +412,23 @@ const config$2 = { summary: `[${issue}](https://ornikar.atlassian.net/browse/${issue})` }; } + }], + head: [{ + bot: false, + // eslint-disable-next-line unicorn/no-unsafe-regex + regExp: /^(?revert-\d+-)?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\/[a-z-]+)?\/(?!)?(?.*)-(?[A-Z][\dA-Z]+-(\d+))$/, + warning: true, + error: { + title: 'Branch name does not match commitlint conventional', + summary: '' + } + }], + base: [{ + regExp: /^(master|main)$/, + error: { + title: 'PR to branches other than main is not recommended', + summary: 'https://ornikar.atlassian.net/wiki/spaces/TECH/pages/2221900272/Should+I+make+a+feature-branch+or+not' + } }] }, botUsers: ['michael-robot'], @@ -3003,37 +3020,56 @@ const cleanTitle = title => title.trim().replace(/[\s-]+\[?\s*([A-Za-z][\dA-Za-z const editOpenedPR = async (pullRequest, context, repoContext, reviewflowPrContext, shouldUpdateCommentBodyInfos, previousSha) => { const title = repoContext.config.trimTitle ? cleanTitle(pullRequest.title) : pullRequest.title; + const parsePRValue = { + title, + head: pullRequest.head.ref, + base: pullRequest.base.ref + }; const isPrFromBot = pullRequest.user && pullRequest.user.type === 'Bot'; const statuses = []; - const errorRule = repoContext.config.parsePR.title.find(rule => { - if (rule.bot === false && isPrFromBot) return false; - const match = rule.regExp.exec(title); + const warnings = []; + let errorRule; + getKeys(repoContext.config.parsePR).find(parsePRKey => { + const rules = repoContext.config.parsePR[parsePRKey]; + if (!rules) return false; + const value = parsePRValue[parsePRKey]; + errorRule = rules.find(rule => { + if (rule.bot === false && isPrFromBot) return false; + const match = rule.regExp.exec(value); + + if (match === null) { + if (rule.status) { + statuses.push({ + name: rule.status, + error: rule.error + }); + } + + if (rule.warning) { + warnings.push(rule.error); + return false; + } - if (match === null) { - if (rule.status) { + return true; + } + + if (rule.status && rule.statusInfoFromMatch) { statuses.push({ name: rule.status, - error: rule.error + info: rule.statusInfoFromMatch(match) }); + return false; } - return true; - } - - if (rule.status && rule.statusInfoFromMatch) { - statuses.push({ - name: rule.status, - info: rule.statusInfoFromMatch(match) - }); return false; - } - - return false; + }); + return errorRule; }); const date = new Date().toISOString(); const hasLintPrCheck = (await context.octokit.checks.listForRef(context.repo({ ref: pullRequest.head.sha }))).data.check_runs.find(check => check.name === `${process.env.REVIEWFLOW_NAME}/lint-pr`); + console.log(warnings); const promises = [...statuses.map(({ name, error, @@ -3050,10 +3086,11 @@ const editOpenedPR = async (pullRequest, context, repoContext, reviewflowPrConte started_at: date, completed_at: date, output: errorRule ? errorRule.error : { - title: '✓ Your PR is valid', + title: warnings.length === 0 ? '✓ Your PR is valid' : `warnings: ${warnings.map(error => error.title).join(',')}`, summary: '' } - })), !hasLintPrCheck && previousSha && errorRule ? createStatus(context, 'lint-pr', previousSha, 'success', 'New commits have been pushed') : undefined, !hasLintPrCheck && createStatus(context, 'lint-pr', pullRequest.head.sha, errorRule ? 'failure' : 'success', errorRule ? errorRule.error.title : '✓ Your PR is valid')].filter(ExcludesFalsy); + })), !hasLintPrCheck && previousSha && errorRule ? createStatus(context, 'lint-pr', previousSha, 'success', 'New commits have been pushed') : undefined, !hasLintPrCheck && createStatus(context, 'lint-pr', pullRequest.head.sha, errorRule ? 'failure' : 'success', errorRule ? errorRule.error.title : // eslint-disable-next-line unicorn/no-nested-ternary + warnings.length === 0 ? '✓ Your PR is valid' : `warning${warnings.length === 1 ? '' : 's'}: ${warnings.map(error => error.title).join(',')}`, errorRule ? errorRule.error.url : undefined)].filter(ExcludesFalsy); const body = removeDeprecatedReviewflowInPrBody(pullRequest.body); promises.push(updatePrIfNeeded(pullRequest, context, { title, diff --git a/dist/index-node12-dev.cjs.js.map b/dist/index-node12-dev.cjs.js.map index 76a999fc4..9dcd168a5 100644 --- a/dist/index-node12-dev.cjs.js.map +++ b/dist/index-node12-dev.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"index-node12-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/utils/Excludes.ts","../src/events/account-handlers/actions/syncTeamMembers.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/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/slack/utils.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/utils/getReviewersAndReviewStates.ts","../src/events/pr-handlers/utils/getRolesFromPullRequestAndReviewers.ts","../src/events/pr-handlers/closed.ts","../src/events/pr-handlers/utils/createSlackMessageWithSecondaryBlock.ts","../src/events/pr-handlers/utils/getPullRequestFromPayload.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 || 3000}` : ''\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 try {\n const authInfo = await readAuthCookie(req, strategy);\n\n if (authInfo?.id) {\n return authInfo;\n }\n } catch {}\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(\n '/login',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (req: Request, res: Response) => {\n if (await getAuthInfoFromCookie(req, res)) {\n res.redirect('/app');\n return;\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\n router.get(\n '/login-response',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\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(\n '/',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\n","import type { Config } from './types';\n\nconst config: Config<'dev', never> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prDefaultOptions: {\n autoMerge: false,\n autoMergeWithSkipCi: 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://www.npmjs.com/package/@commitlint/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: ':vertical_traffic_light: automerge',\n color: '#64DD17',\n },\n 'merge/skip-ci': {\n name: ':vertical_traffic_light: 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 autoMerge: false,\n autoMergeWithSkipCi: 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 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-Za-z-]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://www.npmjs.com/package/@commitlint/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 AymenBac: `aymen${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 camillebaronnet: `camille.baronnet${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'olivier-martinez': `olivier.martinez${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 GaelFerrand: 'gael.ferrand@othrys.dev',\n aenario: `romain.foucault${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\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: `loic.leser${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n carlbouville: `carl.bouville${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n },\n\n groupsGithubTeams: {\n dev: ['ops', 'backend', 'frontend', 'frontend-architects'],\n design: ['design'],\n },\n\n teams: {\n ops: {\n githubTeamName: 'ops',\n logins: ['JulienBreux', 'TheR3aLp3nGuinJM', 'AymenBac'],\n labels: ['teams/ops'],\n },\n\n backends: {\n githubTeamName: 'backend',\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n 'machartier',\n 'camillebaronnet',\n 'olivier-martinez',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n githubTeamName: 'frontend',\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'vlbr',\n 'budet-b',\n 'mdcarter',\n 'ChibiBlasphem',\n 'PSniezak',\n 'aenario',\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: ':vertical_traffic_light: 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-lifecycle': true,\n 'pr-lifecycle-follow': true,\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 { MongoStores, Org } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\n\ninterface OrgInfo {\n login: string;\n id: number;\n}\n\nexport const syncOrg = async (\n mongoStores: MongoStores,\n octokit: T,\n installationId: number,\n org: OrgInfo,\n): Promise => {\n const orgInStore = await mongoStores.orgs.upsertOne({\n _id: org.id,\n login: org.login,\n installationId,\n });\n\n const orgEmbed = { id: org.id, login: org.login };\n\n const memberIds: number[] = [];\n\n for await (const { data } of octokit.paginate.iterator(\n octokit.orgs.listMembers,\n { org: org.login },\n )) {\n await Promise.all(\n data.map(async (member) => {\n if (!member) return;\n memberIds.push(member.id);\n return Promise.all([\n mongoStores.orgMembers.upsertOne<'teams'>(\n {\n _id: `${org.id}_${member.id}`,\n org: orgEmbed,\n user: {\n id: member.id,\n login: member.login,\n },\n },\n {\n teams: [], // teams is synced in syncTeamMembers\n },\n ),\n mongoStores.users.upsertOne({\n _id: member.id,\n login: member.login,\n type: member.type,\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","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 { MongoStores, OrgTeamEmbed } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\nimport { ExcludesFalsy } from '../../../utils/Excludes';\n\nexport const syncTeamMembers = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n team: OrgTeamEmbed,\n): Promise => {\n const memberIds: number[] = [];\n for await (const { data } of octokit.paginate.iterator(\n octokit.teams.listMembersInOrg,\n {\n org: org.login,\n team_slug: team.slug,\n },\n )) {\n const currentIterationMemberIds = data\n .filter(ExcludesFalsy)\n .map((member) => member.id);\n memberIds.push(...currentIterationMemberIds);\n\n await mongoStores.orgMembers.partialUpdateMany(\n {\n _id: {\n $in: currentIterationMemberIds.map(\n (memberId) => `${org.id}_${memberId}`,\n ),\n },\n 'org.id': org.id,\n 'teams.id': { $ne: team.id },\n },\n { $push: { teams: team } },\n );\n }\n\n await mongoStores.orgMembers.partialUpdateMany(\n {\n 'org.id': org.id,\n 'user.id': { $not: { $in: memberIds } },\n },\n { $pull: { teams: { id: team.id } } },\n );\n};\n\nexport const syncTeamMembersWithTeamParents = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n team: OrgTeamEmbed,\n): Promise => {};\n","import type { MongoStores, OrgTeamEmbed } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\nimport { syncTeamMembers } from './syncTeamMembers';\n\nexport const syncTeams = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const orgEmbed = { id: org.id, login: org.login };\n\n const teamEmbeds: OrgTeamEmbed[] = [];\n const teamIds: number[] = [];\n\n for await (const { data } of octokit.paginate.iterator(octokit.teams.list, {\n org: org.login,\n })) {\n await Promise.all(\n data.map(async (team) => {\n teamIds.push(team.id);\n teamEmbeds.push({\n id: team.id,\n name: team.name,\n slug: team.slug,\n });\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 await Promise.all([\n mongoStores.orgTeams.deleteMany({\n 'org.id': org.id,\n _id: { $not: { $in: teamIds } },\n }),\n\n mongoStores.orgMembers.partialUpdateMany(\n {\n 'org.id': org.id,\n },\n { $pull: { teams: { id: { $not: { $in: teamIds } } } } },\n ),\n ]);\n\n return teamEmbeds;\n};\n\nexport const syncTeamsAndTeamMembers = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const teams = await syncTeams(mongoStores, octokit, org);\n for (const team of teams) {\n await syncTeamMembers(mongoStores, octokit, org, team);\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 { syncTeamsAndTeamMembers } 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-lifecycle': 'Your PR is closed, merged, reopened',\n 'pr-lifecycle-follow':\n \"Someone closed, merged, reopened a PR you're reviewing\",\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(\n '/org/:org/force-sync',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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 syncTeamsAndTeamMembers(mongoStores, user.api, org);\n\n res.redirect(`/app/org/${req.params.org}`);\n },\n );\n\n router.get(\n '/org/:org',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\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(\n '/repositories',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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 {data.map((repo: any) => (\n
  • \n \n {repo.name}\n \n
  • \n ))}\n
\n\n {data.length === 100 && (\n
We currently have a limit to 100 repositories
\n )}\n
\n
,\n ),\n );\n },\n );\n\n router.get(\n '/repository/:owner/:repository',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\n 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}\n","import type { MongoStores, User } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\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(\n '/user/force-sync',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\n router.get(\n '/user',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\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 >[1]['getRouter'],\n { mongoStores }: AppContext,\n): Promise {\n const router = (getRouter as NonNullable)('/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","import { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeamsAndTeamMembers } from '../events/account-handlers/actions/syncTeams';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { Org, User } from '../mongo';\nimport type { Octokit } from '../octokit';\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 syncTeamsAndTeamMembers(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 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 // TODO pass AccountInfo instead\n if (githubLogin.endsWith('[bot]')) {\n return `:robot_face: ${githubLogin.slice(0, -'[bot]'.length)}`;\n }\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 account.login,\n account._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 {\n PullRequestWithDecentData,\n PullRequestWithDecentDataFromWebhook,\n} from 'events/pr-handlers/utils/PullRequestData';\nimport type { Config } from '../accountConfigs';\nimport type {\n Org,\n User,\n AccountEmbed,\n AccountType,\n AccountEmbedWithoutType,\n OrgMember,\n} 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 getTeamGroup: (teamName: string) => GroupNames | undefined;\n getGithubTeamsGroups: (teamNames: string[]) => GroupNames[];\n getMembersForTeam: (teamId: string) => Promise;\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\n approveShouldWait: (\n reviewerGroup: GroupNames | undefined,\n pullRequest: PullRequestWithDecentData,\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 for (const groupName of getKeys(config.groups)) {\n Object.keys(config.groups[groupName]).forEach((login) => {\n githubLoginToGroup.set(login, groupName);\n });\n }\n\n const githubTeamNameToGroup = new Map();\n if (config.groupsGithubTeams) {\n for (const groupName of getKeys(config.groupsGithubTeams)) {\n config.groupsGithubTeams[groupName].forEach((teamName) => {\n githubTeamNameToGroup.set(teamName, groupName);\n });\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 const getGithubTeamsGroups = (githubTeamNames: string[]): string[] => [\n ...new Set(\n githubTeamNames\n .map((teamName) => githubTeamNameToGroup.get(teamName))\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 getTeamGroup: (githubTeamName): string | undefined =>\n githubTeamNameToGroup.get(githubTeamName),\n getGithubTeamsGroups,\n\n getTeamsForLogin: (githubLogin): string[] =>\n githubLoginToTeams.get(githubLogin) || [],\n\n getMembersForTeam: async (teamId): Promise => {\n if (accountInfo.type !== 'Organization') {\n throw new Error(\n `Invalid account type \"${accountInfo.type}\" for getMembersForTeam`,\n );\n }\n const cursor = await appContext.mongoStores.orgMembers.cursor<\n Pick\n >({\n 'org.id': account._id,\n 'teams.id': teamId,\n });\n await cursor.limit(100);\n const orgMembers = await cursor.toArray();\n return orgMembers.map((member) => member.user);\n },\n\n approveShouldWait: (\n reviewerGroup,\n pullRequest,\n { includesReviewerGroup, includesWaitForGroups },\n ): boolean => {\n if (\n !reviewerGroup ||\n !pullRequest.requested_reviewers ||\n !pullRequest.requested_teams\n ) {\n return false;\n }\n\n const requestedReviewerGroups = [\n ...new Set([\n ...getReviewerGroups(\n (pullRequest.requested_reviewers as PullRequestWithDecentDataFromWebhook['requested_reviewers']).map(\n (request) => request.login,\n ),\n ),\n ...(!pullRequest.requested_teams\n ? []\n : getGithubTeamsGroups(\n (pullRequest.requested_teams as PullRequestWithDecentDataFromWebhook['requested_teams']).map(\n (team) => team.name,\n ),\n )),\n ]),\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 | 'autoMerge'\n | 'autoMergeWithSkipCi'\n | 'deleteAfterMerge';\n\nexport type Options = Record;\n\nexport const options: OptionsKeys[] = [\n 'autoMerge',\n 'autoMergeWithSkipCi',\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\ninterface OptionDisplay {\n key: OptionsKeys;\n labelKey?: string;\n icon?: string;\n description: string;\n}\n\nexport const optionsDescriptions: OptionDisplay[] = [\n {\n key: 'autoMerge',\n labelKey: 'merge/automerge',\n description:\n 'Automatically merge when this PR is ready and has no failed statuses. When the repository requires _branches to be up to date before merging_, it merges default branch, with a queue per repo to prevent multiple merges when several PRs are ready. A fail job prevents the merge.',\n },\n {\n key: 'autoMergeWithSkipCi',\n labelKey: 'merge/skip-ci',\n description:\n 'Add `[skip ci]` on merge commit when merge is done with autoMerge.',\n },\n {\n key: 'deleteAfterMerge',\n icon: ':recycle:',\n description: 'Automatically delete the branch 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 return false;\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 (\n pullRequest.requested_reviewers &&\n pullRequest.requested_reviewers.length > 0\n ) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested reviewers',\n );\n return false;\n }\n\n if (pullRequest.requested_teams && pullRequest.requested_teams.length > 0) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested teams',\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 lockedPrNumber: lockedPr.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 (\n pullRequest.body &&\n pullRequest.body.includes('')\n ) {\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 const isFeatureBranch = false; // options.featureBranch;\n\n const mergeResult = await context.octokit.pulls.merge({\n merge_method: isFeatureBranch ? 'merge' : 'squash',\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n pull_number: pullRequest.number,\n commit_title: isFeatureBranch\n ? undefined\n : `${pullRequest.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pullRequest.number})`,\n commit_message: isFeatureBranch ? 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 { LabelList, StatusInfo } from 'accountConfigs/types';\nimport type { Options } from './parseBody';\nimport { parseOptions } from './parseBody';\nimport { optionsDescriptions } from './prOptions';\n\nexport const defaultCommentBody = 'This will be auto filled by reviewflow.';\n\nconst toMarkdownOptions = (\n repoLink: string,\n labelsConfig: LabelList,\n options: Options,\n): string => {\n return optionsDescriptions\n .map(({ key, labelKey, description, icon: iconValue }) => {\n const checkboxWithId = `[${\n options[key] ? 'x' : ' '\n }] `;\n\n const labelDescription = labelKey && labelsConfig[labelKey];\n const labelLink = labelDescription\n ? `[${labelDescription.name}](${repoLink}/labels/${encodeURIComponent(\n labelDescription.name,\n )}): `\n : '';\n const icon = labelLink || !iconValue ? '' : `${iconValue} `;\n\n return `- ${checkboxWithId}${icon}${labelLink}${description}`;\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 repoLink: string,\n labelsConfig: LabelList,\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 repoLink,\n labelsConfig,\n options,\n )}`;\n};\n\nexport const createCommentBody = (\n repoLink: string,\n labelsConfig: LabelList,\n defaultOptions: Options,\n infos?: StatusInfo[],\n): string => {\n return internalUpdateBodyOptionsAndInfos(\n repoLink,\n labelsConfig,\n '',\n defaultOptions,\n infos,\n );\n};\n\nexport const updateCommentOptions = (\n repoLink: string,\n labelsConfig: LabelList,\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(\n repoLink,\n labelsConfig,\n commentBody,\n updatedOptions,\n ),\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 !commitNotes ? '$1' : `#### Commits Notes:\\n\\n${commitNotes}\\n\\n$1`,\n );\n};\n\nexport const removeDeprecatedReviewflowInPrBody = (\n prBody: string | null,\n): string => {\n if (!prBody) return '';\n return prBody.replace(\n /^(.*)(.*)(.*)$/is,\n '$1$3',\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/rest';\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 as string };\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 as string };\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 as string };\n};\n","import type { RestEndpointMethodTypes } from '@octokit/rest';\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/rest';\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 | null;\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 if (labelKey === 'merge/skip-ci') {\n existingLabel = labels.find(\n (label) => label.name === 'automerge/skip-ci',\n );\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 name: existingLabel.name,\n new_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';\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<\n GroupNames extends string = any\n> = AccountContext & 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 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) => label.id && needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && requestedReviewLabelIds.includes(label.id),\n );\n const hasChangesRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && changesRequestedLabelIds.includes(label.id),\n );\n const hasApprovesReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && approvedReviewLabelIds.includes(label.id),\n );\n\n const getNeedsReviewGroupNames = (labels: PullRequestLabels): GroupNames[] =>\n labels\n .filter((label) => label.id && needsReviewLabelIds.includes(label.id))\n .map((label) =>\n labelIdToGroupName.get(label.id as NonNullable),\n )\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 { 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): ((context: Context) => Promise) => {\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 { 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\ntype OnCallback = (context: Context) => Promise;\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 GroupNames extends string = string\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 GroupNames extends string\n>(\n appContext: AppContext,\n getPrs: (\n payload: Context['payload'],\n repoContext: RepoContext,\n ) => 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 { AccountInfo } from 'context/getOrCreateAccount';\nimport type { PullRequestWithDecentData } from 'events/pr-handlers/utils/PullRequestData';\nimport 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\nexport const createOwnerPart = (\n ownerMention: string,\n pullRequest: PullRequestWithDecentData,\n sendTo: AccountInfo,\n): string => {\n const owner = pullRequest.user;\n\n if (owner && owner.id === sendTo.id) return 'your PR';\n\n const isAssignedTo: boolean =\n !!pullRequest.assignees &&\n pullRequest.assignees.some((a: any) => a && a.id === sendTo.id);\n\n return `${ownerMention}'s PR${isAssignedTo ? \" you're assigned to\" : ''}`;\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 { ExcludesFalsy } from '../../../utils/Excludes';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n PullRequestWithDecentDataFromWebhook,\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 (\n pullRequest.requested_reviewers &&\n pullRequest.requested_reviewers.length > 0\n ) {\n return createFailedStatusCheck(\n `Awaiting review from: ${(pullRequest.requested_reviewers as PullRequestWithDecentDataFromWebhook['requested_reviewers'])\n .filter(ExcludesFalsy)\n .map((rr) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (pullRequest.requested_teams && pullRequest.requested_teams.length > 0) {\n return createFailedStatusCheck(\n `Awaiting review from: ${(pullRequest.requested_teams as PullRequestWithDecentDataFromWebhook['requested_teams'])\n .filter(ExcludesFalsy)\n .map((rt) => rt.name)\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 { ExcludesFalsy } from '../../../utils/Excludes';\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(\n prLabels.map((label) => label.name).filter(ExcludesFalsy),\n );\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 (\n !label ||\n !label.name ||\n prLabels.some((prLabel) => prLabel.id === label.id)\n ) {\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 && existing.name) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n toDeleteNames.add(existing.name);\n }\n });\n }\n\n // TODO move that elsewhere\n if (pullRequest.user) {\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\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 { Context } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\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}\n\nexport type Reviewer = AccountInfo;\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 ({ data: reviews }) => {\n reviews.forEach((review) => {\n if (!review.user) return;\n if (!userIds.has(review.user.id)) {\n userIds.add(review.user.id);\n reviewers.push({\n id: review.user.id,\n login: review.user.login,\n type: review.user.type,\n });\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 { AccountInfo } from 'context/getOrCreateAccount';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\nimport type { Reviewer } from './getReviewersAndReviewStates';\n\nexport interface RequestedReviewers extends AccountInfo {\n isRequestedByName: boolean;\n requestedByTeams: string[];\n}\n\nexport function getRolesFromPullRequestAndReviewers(\n pullRequest: PullRequestWithDecentDataFromWebhook,\n reviewers: Reviewer[],\n): {\n owner: PullRequestWithDecentDataFromWebhook['user'];\n assignees: PullRequestWithDecentDataFromWebhook['assignees'];\n reviewers: Reviewer[];\n requestedReviewers: RequestedReviewers[];\n followers: AccountInfo[];\n} {\n const owner = pullRequest.user;\n const assignees = pullRequest.assignees;\n const assigneeIds = assignees.map((a) => a.id);\n\n const followers = reviewers.filter((user) => !assigneeIds.includes(user.id));\n const requestedReviewers: RequestedReviewers[] = pullRequest.requested_reviewers.map(\n (rr) => ({\n ...rr,\n isRequestedByName: true,\n requestedByTeams: [],\n }),\n );\n\n if (pullRequest.requested_teams) {\n // TODO\n // requestedReviewers.push ...\n }\n\n if (requestedReviewers) {\n followers.push(\n ...requestedReviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) && !assigneeIds.includes(rr.id)\n );\n }),\n );\n }\n\n return {\n owner,\n assignees,\n reviewers,\n requestedReviewers,\n followers,\n };\n}\n","import type { Probot } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseOptions } from './actions/utils/body/parseBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\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 repo is not ignored */\n if (reviewflowPrContext) {\n /* update status, update automerge queue, delete branch */\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 /* update slack home */\n if (pullRequest.requested_reviewers) {\n pullRequest.requested_reviewers.forEach((requestedReviewer) => {\n repoContext.slack.updateHome(requestedReviewer.login);\n });\n }\n\n if (pullRequest.requested_teams) {\n await Promise.all(\n pullRequest.requested_teams.map(async (team) => {\n const members = await repoContext.getMembersForTeam(team.id);\n members.forEach((member) => {\n repoContext.slack.updateHome(member.login);\n });\n }),\n );\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n /* send notifications to assignees and followers */\n const { reviewers } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n\n const senderMention = repoContext.slack.mention(\n context.payload.sender.login,\n );\n const ownerMention = repoContext.slack.mention(owner.login);\n const prLink = slackUtils.createPrLink(pullRequest, repoContext);\n\n const createMessage = (to: AccountInfo): string => {\n const ownerPart = slackUtils.createOwnerPart(\n ownerMention,\n pullRequest,\n to,\n );\n\n return `${\n pullRequest.merged\n ? `:rocket: ${senderMention} merged`\n : `:wastebasket: ${senderMention} closed`\n } ${ownerPart} ${prLink}\\n> ${pullRequest.title}`;\n };\n\n assignees.map((assignee) => {\n if (context.payload.sender.id === assignee.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle',\n assignee.id,\n assignee.login,\n {\n text: createMessage(assignee),\n },\n );\n });\n\n followers.map((follower) => {\n if (context.payload.sender.id === follower.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle-follow',\n follower.id,\n follower.login,\n {\n text: createMessage(follower),\n },\n );\n });\n },\n ),\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 { 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/rest';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\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 { ExcludesFalsy, 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']['listReviewComments']['response']['data']\n> => {\n if (!comment.in_reply_to_id) return [comment];\n return context.octokit.paginate(\n context.octokit.pulls.listReviewComments,\n context.pullRequest() as any,\n ({ data }) => {\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']['listReviewComments']['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']['listReviewComments']['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 (!c.user || 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 prUser = pr.user;\n if (!prUser) return;\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 = prUser.login === comment.user.login;\n const [discussion, { reviewers }] = await Promise.all([\n getDiscussion(context, comment),\n getReviewersAndReviewStates(context, repoContext),\n ]);\n\n const followers: AccountInfo[] = reviewers.filter(\n (u) => u.id !== prUser.id && u.id !== comment.user.id,\n );\n\n if (pr.requested_reviewers) {\n followers.push(\n ...pr.requested_reviewers\n .filter((rr) => {\n return (\n rr &&\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== (comment.user && comment.user.id) &&\n rr.id !== prUser.id\n );\n })\n .filter(ExcludesFalsy)\n .map((rr) => ({\n id: rr.id,\n login: rr.login,\n type: rr.type,\n })),\n );\n }\n\n const usersInThread = getUsersInThread(discussion).filter(\n (u) =>\n u.id !== prUser.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 !== prUser.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(prUser.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 (prUser && prUser.id) === comment.user.id\n ? 'his'\n : `${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 prUser.id,\n prUser.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 context.payload.repository.html_url,\n repoContext.config.labels.list,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n return {\n ...repoContext.config.prDefaultOptions,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n const { commentBody, options } = updateCommentOptions(\n context.payload.repository.html_url,\n repoContext.config.labels.list,\n reviewflowPrContext.commentBody,\n calcDefaultOptions(repoContext, pullRequest),\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, commentBody);\n\n if (options && automergeLabel) {\n await Promise.all([\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 parse from '@commitlint/parse';\nimport type { CommitNote } from '@commitlint/types';\nimport type { RestEndpointMethodTypes } from '@octokit/rest';\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 | null): string =>\n !text ? '' : text.replace(/\\r\\n/g, '\\n');\nconst checkIfHasDiff = (text1: string | null, 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 .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,\n shouldUpdateCommentBodyInfos: boolean,\n previousSha?: string,\n): Promise => {\n const title = repoContext.config.trimTitle\n ? cleanTitle(pullRequest.title)\n : pullRequest.title;\n\n const isPrFromBot = pullRequest.user && 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 context.payload.repository.html_url,\n repoContext.config.labels.list,\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 { updateReviewStatus } from './actions/updateReviewStatus';\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 codeNeedsReviewLabel = repoContext.labels['code/needs-review'];\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 if (hasLabelInPR(labels, codeNeedsReviewLabel)) {\n await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n 'dev',\n {\n remove: ['needsReview'],\n },\n );\n } else {\n await updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n labels,\n );\n }\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 autoMergeSkipCiLabel,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const option = (() => {\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 || pullRequest.assignees.length > 0) return;\n if (!pullRequest.user || 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 { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\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 if (reviewflowPrContext === null) return;\n const fromRenovate = pullRequest.head.ref.startsWith('renovate/');\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) {\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 ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\n\nexport default function reopened(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.reopened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n /* if repo is not ignored */\n if (reviewflowPrContext) {\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 /* update slack home */\n if (pullRequest.requested_reviewers) {\n pullRequest.requested_reviewers.forEach((requestedReviewer) => {\n repoContext.slack.updateHome(requestedReviewer.login);\n });\n }\n\n if (pullRequest.requested_teams) {\n await Promise.all(\n pullRequest.requested_teams.map(async (team) => {\n const members = await repoContext.getMembersForTeam(team.id);\n members.forEach((member) => {\n repoContext.slack.updateHome(member.login);\n });\n }),\n );\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n /* send notifications to assignees and followers */\n const { reviewers } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n\n const senderMention = repoContext.slack.mention(\n context.payload.sender.login,\n );\n const ownerMention = repoContext.slack.mention(owner.login);\n const prLink = slackUtils.createPrLink(pullRequest, repoContext);\n\n const createMessage = (to: AccountInfo): string => {\n const ownerPart = slackUtils.createOwnerPart(\n ownerMention,\n pullRequest,\n to,\n );\n\n return `:recycle: ${senderMention} reopened ${ownerPart} ${prLink}\\n> ${pullRequest.title}`;\n };\n\n assignees.map((assignee) => {\n if (context.payload.sender.id === assignee.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle',\n assignee.id,\n assignee.login,\n {\n text: createMessage(assignee),\n },\n );\n });\n\n followers.map((follower) => {\n if (context.payload.sender.id === follower.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle-follow',\n follower.id,\n follower.login,\n {\n text: createMessage(follower),\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 { 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.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\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n const hasApprovals = reviewStates[reviewerGroup].approved !== 0;\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n updatedPr,\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 if (assignee) {\n repoContext.slack.updateHome(assignee.login);\n }\n });\n }\n if (\n !updatedPr.assignees ||\n !updatedPr.assignees.find(\n (assignee) => 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: `:recycle: ${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: `:recycle: ${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 requestedReviewer = (context.payload as any).requested_reviewer;\n const requestedTeam = (context.payload as any).requested_team;\n const requestedReviewers = requestedReviewer\n ? [requestedReviewer]\n : await repoContext.getMembersForTeam(requestedTeam.id);\n\n const reviewerGroup = requestedReviewer\n ? repoContext.getReviewerGroup(requestedReviewer.login)\n : repoContext.getTeamGroup(requestedTeam.name);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest,\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 const assigneesLogins: string[] = [];\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n assigneesLogins.push(assignee.login);\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n requestedReviewers.forEach((potentialReviewer) => {\n if (assigneesLogins.includes(potentialReviewer)) return;\n repoContext.slack.updateHome(potentialReviewer.login);\n });\n }\n\n if (repoContext.slack) {\n if (requestedReviewers.some((rr) => rr.login === sender.login)) {\n requestedReviewers.forEach((potentialReviewer) => {\n if (potentialReviewer.login === sender.login) return;\n repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your team _${\n requestedTeam.name\n }_ review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n } else {\n requestedReviewers.forEach((potentialReviewer) => {\n repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for ${\n requestedTeam ? `your team _${requestedTeam.name}_` : 'your'\n } review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n }\n\n await Promise.all(\n requestedReviewers.map(async (potentialReviewer) => {\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}_${\n requestedTeam ? `${requestedTeam.id}_` : ''\n }${potentialReviewer.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 ),\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 requestedReviewer = (context.payload as any).requested_reviewer;\n const requestedTeam = (context.payload as any).requested_team;\n const requestedReviewers = requestedReviewer\n ? [requestedReviewer]\n : await repoContext.getMembersForTeam(requestedTeam.id);\n\n const reviewerGroup = requestedReviewer\n ? repoContext.getReviewerGroup(requestedReviewer.login)\n : repoContext.getTeamGroup(requestedTeam.name);\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 const assigneesLogins: string[] = [];\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n assigneesLogins.push(assignee.login);\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n requestedReviewers.forEach((potentialReviewer) => {\n if (assigneesLogins.includes(potentialReviewer)) return;\n repoContext.slack.updateHome(potentialReviewer.login);\n });\n }\n\n if (!shouldWait && repoContext.slack) {\n const text = `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests ${\n requestedReviewer ? 'your' : `your team _${requestedTeam.name}_`\n } review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )} !\\n> ${pullRequest.title}`;\n const message = { text };\n\n await Promise.all(\n requestedReviewers.map(async (potentialReviewer) => {\n if (sender.login === potentialReviewer.login) return;\n\n const result = await repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n message,\n );\n if (result) {\n await appContext.mongoStores.slackSentMessages.insertOne({\n type: 'review-requested',\n typeId: `${pullRequest.id}_${\n requestedTeam ? `${requestedTeam.id}_` : ''\n }${potentialReviewer.id}`,\n message,\n account: repoContext.accountEmbed,\n sentTo: [result],\n });\n }\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';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\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 { reviewers, reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n const isReviewByOwner = owner.login === reviewer.login;\n\n const filteredFollowers = followers.filter(\n (follower) => follower.id !== reviewer.id,\n );\n\n if (!isReviewByOwner) {\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,\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 (assignees) {\n assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !assignees.find((assignee) => assignee.login === reviewer.login)\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(owner.login);\n\n const createMessage = (\n toOwner?: boolean,\n isAssignedTo?: boolean,\n ): string => {\n const ownerPart = toOwner\n ? 'your PR'\n : `${ownerMention}'s PR${\n isAssignedTo ? \" you're assigned to\" : ''\n }`;\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 assignees.forEach((assignee) => {\n repoContext.slack.postMessage(\n 'pr-review',\n assignee.id,\n assignee.login,\n createSlackMessageWithSecondaryBlock(\n createMessage(assignee.id === owner.id, true),\n slackifiedBody,\n ),\n );\n });\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n filteredFollowers.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 filteredFollowers.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 {\n syncTeams,\n syncTeamsAndTeamMembers,\n} 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 appContext,\n async (context, accountContext) => {\n // TODO: only sync team members and team parents members\n // await syncTeamMembersWithTeamParents(\n // appContext.mongoStores,\n // context.octokit,\n // context.payload.organization,\n // {\n // id: context.payload.team.id,\n // name: context.payload.team.name,\n // slug: context.payload.team.slug,\n // },\n // );\n await syncTeamsAndTeamMembers(\n appContext.mongoStores,\n context.octokit,\n context.payload.organization,\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\nexport type 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 OrgTeam extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n name: string;\n slug: string;\n description: string | null;\n}\n\nexport interface OrgTeamEmbed {\n id: OrgTeam['_id'];\n name: OrgTeam['name'];\n slug: OrgTeam['slug'];\n}\n\nexport interface OrgMember extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n user: AccountEmbedWithoutType;\n slack?: { id: string };\n teams: OrgTeamEmbed[];\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 coll.createIndex(\n { 'org.id': 1, 'user.id': 1, 'teams.id': 1 },\n { unique: true },\n );\n coll.createIndex({ 'org.id': 1, 'teams.id': 1 });\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 { WebClient } from '@slack/web-api';\nimport type { MongoStores, Org, OrgMember } from '../mongo';\nimport type { Octokit } from '../octokit';\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 octokit: 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 octokit.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 octokit.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 octokit.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 octokit.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","autoMerge","autoMergeWithSkipCi","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","AymenBac","abarreir","damienorny","darame07","Pixy","machartier","camillebaronnet","HugoGarrido","CorentinAndre","Mxime","vlbr","mdcarter","ChibiBlasphem","PSniezak","GaelFerrand","aenario","design","jperriere","CoralineColasse","Lenamari","loicleser","carlbouville","groupsGithubTeams","ops","githubTeamName","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","octokit","installationId","orgInStore","upsertOne","_id","orgEmbed","memberIds","paginate","iterator","listMembers","Promise","all","member","push","orgMembers","type","deleteMany","$not","$in","ExcludesFalsy","Boolean","ExcludesNullish","syncTeamMembers","team","listMembersInOrg","team_slug","slug","currentIterationMemberIds","filter","partialUpdateMany","memberId","$ne","$push","$pull","syncTeams","teamEmbeds","teamIds","orgTeams","syncTeamsAndTeamMembers","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","github","userInfo","userSettings","u","getUserInstallation","username","appRouter","app","getRouter","use","cookieParser","getOrCreateAccount","accountInfo","getKeys","keys","emojiRegex","createEmojiRegex","getEmojiFromRepoDescription","startsWith","emoji","exec","voidTeamSlack","mention","postMessage","resolve","updateMessage","deleteMessage","addReaction","updateHome","initTeamSlack","slackHome","context","account","slackToken","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackEmails","values","slackClient","WebClient","membersInDb","findAll","members","foundEmailMembers","forEach","email","m","slack","im","missingEmails","includes","memberEmailToMemberId","page","profile","has","conversations","open","channel","console","membersMap","getUserFromGithubLogin","githubLogin","endsWith","slice","category","githubId","message","log","debug","DRY_RUN","chat","text","blocks","attachments","secondaryBlocks","thread_ts","ts","ok","update","delete","reactions","add","timestamp","scheduleUpdateMember","initAccountContext","appContext","payload","slackPromise","githubLoginToGroup","githubTeamNameToGroup","teamName","githubLoginToTeams","getReviewerGroups","githubLogins","Set","getGithubTeamsGroups","githubTeamNames","lock","Lock","accountEmbed","accountType","callback","reject","logInfos","info","createReleaseCallback","release","getReviewerGroup","getTeamGroup","getTeamsForLogin","getMembersForTeam","teamId","cursor","limit","toArray","approveShouldWait","reviewerGroup","pullRequest","includesReviewerGroup","includesWaitForGroups","requested_reviewers","requested_teams","requestedReviewerGroups","request","some","group","accountContextsPromise","accountContexts","obtainAccountContext","existingAccountContext","existingPromise","promise","then","accountContext","handlerOrgChange","organization","createHandlerOrgChange","options","optionsRegexps","option","regexp","RegExp","optionsDescriptions","labelKey","icon","parseOptions","content","defaultOptions","parseCommitNotes","commitNotes","replace","trim","parseBody","hasLabelInPR","prLabels","label","l","hasFailedStatusOrChecks","pr","checks","listForRef","ref","head","sha","failedChecks","check_runs","check","conclusion","combinedStatus","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","repoContext","reviewflowPrContext","autoMergeLabel","removePrFromAutomergeQueue","number","isRenovatePr","createMergeLockPrFromPr","branch","addLog","action","repoFullName","full_name","automergeLogs","insertOne","isRenovate","mergeableState","mergeable_state","hasNeedsReview","hasRequestedReview","lockedPr","getMergeLockedPr","String","prId","prNumber","lockedPrNumber","pushAutomergeQueue","addMergeLockPr","mergeable","prResult","pulls","pull_number","merged","reschedule","renovateRebaseBody","issues","issue_number","base","merge","parsedBody","commentBody","mergeResult","merge_method","commit_title","commit_message","errorMessage","defaultCommentBody","toMarkdownOptions","repoLink","labelsConfig","iconValue","checkboxWithId","labelDescription","labelLink","encodeURIComponent","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","labelConfig","labelColor","existingLabel","createLabel","current_name","updateLabel","new_name","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","createLink","createPrLink","html_url","createOwnerPart","ownerMention","sendTo","isAssignedTo","assignees","a","createStatus","createCommitStatus","target_url","addStatusCheck","previousSha","hasPrCheck","head_sha","started_at","created_at","completed_at","toISOString","output","updateStatusCheckFromLabels","createFailedStatusCheck","rr","rt","needsReviewGroupNames","updateReviewStatus","reviewGroup","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toAddNames","toDelete","toDeleteNames","getLabelFromKey","reviewConfig","prLabel","size","addLabels","toDeleteName","removeLabel","newLabelNamesArray","oldLabels","setLabels","getReviewersAndReviewStates","userIds","reviewers","reviewStatesByUser","listReviews","reviews","toUpperCase","reviewStates","dismissed","reviewer","getRolesFromPullRequestAndReviewers","assigneeIds","followers","requestedReviewers","isRequestedByName","requestedByTeams","f","closed","pull_request","isNotFork","git","deleteRef","requestedReviewer","assignee","senderMention","sender","prLink","slackUtils","createMessage","to","ownerPart","follower","createMrkdwnSectionBlock","createSlackMessageWithSecondaryBlock","secondaryBlockText","getPullRequestFromPayload","checkIfUserIsBot","checkIfIsThisBot","parse","issueParser","actions","issuePrefixes","parseMentions","mentions","slackifyCommentBody","multipleLines","slackifyMarkdown","getDiscussion","in_reply_to_id","listReviewComments","c","getMentions","discussion","getUsersInThread","prCommentCreated","saveInDb","results","filtered","slackSentMessages","typeId","sentTo","prUser","pull_request_review_id","commentByOwner","usersInThread","prUrl","commentLink","toOwner","promisesOwner","promisesNotOwner","slackifiedBody","start_line","isBotUser","slackMessage","updatePrCommentBody","newBody","updateComment","updatePrCommentBodyIfNeeded","updatePrCommentBodyOptions","syncLabel","shouldHaveLabel","prHasLabel","onRemove","onAdd","response","calcDefaultOptions","automergeLabel","skipCiLabel","prHasSkipCiLabel","prHasAutoMergeLabel","syncLabelsAfterCommentBodyEdited","prCommentEditedOrDeleted","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","codeNeedsReviewLabel","autoMergeSkipCiLabel","createReview","event","updateBranchLabel","autoApproveAndAutoMerge","autoAssignPRToCreator","addAssignees","opened","reopened","reviewDismissed","hasChangesRequestedInReviews","hasApprovals","hasRequestedReviewsForGroup","reviewRequestRemoved","requested_reviewer","requestedTeam","requested_team","hasApprovedInReviews","assigneesLogins","potentialReviewer","sentMessageRequestedReview","split","deleteOne","reviewRequested","getEmojiFromState","reviewSubmitted","reviewUrl","isReviewByOwner","filteredFollowers","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","scheduleUpdateOrg","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,IAAZ,IAAoB,IAAK,EAA5D,GAAgE,EACjE,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,MAAI;AACF,UAAMC,QAAQ,GAAG,MAAMT,cAAc,CAACJ,GAAD,EAFtB,IAEsB,CAArC;;AAEA,QAAIa,QAAJ,aAAIA,QAAJ,eAAIA,QAAQ,CAAEnC,EAAd,EAAkB;AAChB,aAAOmC,QAAP;AACD;AACF,GAND,CAME,MAAM;;AAERD,EAAAA,GAAG,CAACE,WAAJ,CAAiB,QAAD,IAAiB,EAAjC;AACA,SAAOC,SAAP;AACD,CAfD;;AAiBA,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,CACE,QADF;AAGE,SAAOvB,GAAP,EAAqBY,GAArB,KAAuC;AACrC,QAAI,MAAMD,qBAAqB,CAACX,GAAD,EAAMY,GAAN,CAA/B,EAA2C;AACzCA,MAAAA,GAAG,CAACQ,QAAJ,CAAa,MAAb;AACA;AACD,KAJoC;AAOrC;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,CAbqC;;AAyBrCjB,IAAAA,GAAG,CAACQ,QAAJ,CAAaI,WAAb;AACD,GA7BH;AAgCAF,EAAAA,MAAM,CAACC,GAAP,CACE,iBADF;AAGE,SAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAClB,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,CAPkB;AASlB;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,GA5DH;AA8DD;;ACjLc,SAAS8B,IAAT,CACb5B,MADa,EAIP;AACNA,EAAAA,MAAM,CAACC,GAAP,CACE,GADF;AAGE,SAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAClB,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,GAjCH;AAmCD;;AC9CD,MAAMc,MAA4B,GAAG;AACnCC,EAAAA,mBAAmB,EAAE,IADc;AAEnCC,EAAAA,SAAS,EAAE,IAFwB;AAGnCC,EAAAA,qBAAqB,EAAE,KAHY;AAInCC,EAAAA,gBAAgB,EAAE;AAChBC,IAAAA,SAAS,EAAE,KADK;AAEhBC,IAAAA,mBAAmB,EAAE,KAFL;AAGhBC,IAAAA,gBAAgB,EAAE;AAHF,GAJiB;AASnCC,EAAAA,OAAO,EAAE;AACP/E,IAAAA,KAAK,EAAE,CACL;AACEgF,MAAAA,MAAM;AAEJ,mGAHJ;AAIEnC,MAAAA,KAAK,EAAE;AACL7C,QAAAA,KAAK,EAAE,8CADF;AAELiF,QAAAA,OAAO,EACL;AAHG;AAJT,KADK;AADA,GAT0B;AAuBnCC,EAAAA,MAAM,EAAE;AACNC,IAAAA,GAAG,EAAE;AACHC,MAAAA,iBAAiB,EAAE,wBADhB;AAEHC,MAAAA,KAAK,EAAE;AAFJ;AADC,GAvB2B;AA6BnCC,EAAAA,aAAa,EAAE;AACbH,IAAAA,GAAG,EAAE;AADQ,GA7BoB;AAgCnCI,EAAAA,KAAK,EAAE,EAhC4B;AAiCnCC,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,oCADW;AAEjBC,QAAAA,KAAK,EAAE;AAFU,OAzBf;AA6BJ,uBAAiB;AACfD,QAAAA,IAAI,EAAE,kCADS;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;AAjC2B,CAArC;;ACAA,MAAM7B,QAA4B,GAAG;AACnCC,EAAAA,mBAAmB,EAAE,IADc;AAEnCC,EAAAA,SAAS,EAAE,IAFwB;AAGnCC,EAAAA,qBAAqB,EAAE,KAHY;AAInCC,EAAAA,gBAAgB,EAAE;AAChBC,IAAAA,SAAS,EAAE,KADK;AAEhBC,IAAAA,mBAAmB,EAAE,KAFL;AAGhBC,IAAAA,gBAAgB,EAAE;AAHF,GAJiB;AASnCC,EAAAA,OAAO,EAAE;AACP/E,IAAAA,KAAK,EAAE;AADA,GAT0B;AAYnCkF,EAAAA,MAAM,EAAE,EAZ2B;AAanCI,EAAAA,aAAa,EAAE,EAboB;AAcnCC,EAAAA,KAAK,EAAE,EAd4B;AAenCC,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;AAf2B,CAArC;;ACAA,MAAMzB,QAAkE,GAAG;AACzEC,EAAAA,mBAAmB,EAAE,IADoD;AAEzEC,EAAAA,SAAS,EAAE,IAF8D;AAGzE4B,EAAAA,iBAAiB,EAAE,mBAHsD;AAIzE3B,EAAAA,qBAAqB,EAAE,IAJkD;AAKzE4B,EAAAA,2BAA2B,EAAE,KAL4C;AAMzE3B,EAAAA,gBAAgB,EAAE;AAChBE,IAAAA,mBAAmB,EAAE,KADL;AAEhBD,IAAAA,SAAS,EAAE,KAFK;AAGhBE,IAAAA,gBAAgB,EAAE;AAHF,GANuD;AAWzEC,EAAAA,OAAO,EAAE;AACP/E,IAAAA,KAAK,EAAE,CACL;AACEgF,MAAAA,MAAM;AAEJ,kGAHJ;AAIEnC,MAAAA,KAAK,EAAE;AACL7C,QAAAA,KAAK,EAAE,8CADF;AAELiF,QAAAA,OAAO,EACL;AAHG;AAJT,KADK,EAWL;AACEsB,MAAAA,GAAG,EAAE,KADP;AAEEvB,MAAAA,MAAM,EAAE,sCAFV;AAGEnC,MAAAA,KAAK,EAAE;AACL7C,QAAAA,KAAK,EAAE,gCADF;AAELiF,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;AACL3G,YAAAA,KAAK,EAAE,UADF;AAELiF,YAAAA,OAAO,EAAE;AAFJ,WAAP;AAID;;AACD,eAAO;AACL2B,UAAAA,MAAM,EAAE,IADH;AAELC,UAAAA,GAAG,EAAG,wCAAuCF,KAAM,EAF9C;AAGL3G,UAAAA,KAAK,EAAG,eAAc2G,KAAM,EAHvB;AAIL1B,UAAAA,OAAO,EAAG,IAAG0B,KAAM,0CAAyCA,KAAM;AAJ7D,SAAP;AAMD;AAtBH,KAXK;AADA,GAXgE;AAkDzEG,EAAAA,QAAQ,EAAE,CAAC,eAAD,CAlD+D;AAoDzE5B,EAAAA,MAAM,EAAE;AACNC,IAAAA,GAAG,EAAE;AACH;AACA4B,MAAAA,WAAW,EAAG,eAAc/H,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAF1D;AAGHC,MAAAA,gBAAgB,EAAG,cAAajI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAH9D;AAIHE,MAAAA,QAAQ,EAAG,QAAOlI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAJhD;;AAMH;AACAG,MAAAA,QAAQ,EAAG,YAAWnI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAPpD;AAQHI,MAAAA,UAAU,EAAG,cAAapI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EARxD;AASH,uBAAkB,UAAShI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EATzD;AAUHK,MAAAA,QAAQ,EAAG,QAAOrI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAVhD;AAWHM,MAAAA,IAAI,EAAG,gBAAetI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAXpD;AAYHO,MAAAA,UAAU,EAAG,aAAYvI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAZvD;AAaHQ,MAAAA,eAAe,EAAG,mBAAkBxI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAblE;AAcH,0BAAqB,mBAAkBhI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAdrE;;AAgBH;AACA5B,MAAAA,iBAAiB,EAAG,aAAYpG,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAjB9D;AAkBHS,MAAAA,WAAW,EAAG,OAAMzI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAlBlD;AAmBHU,MAAAA,aAAa,EAAG,WAAU1I,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAnBxD;AAoBHW,MAAAA,KAAK,EAAG,SAAQ3I,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EApB9C;AAqBHY,MAAAA,IAAI,EAAG,WAAU5I,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EArB/C;AAsBH,iBAAY,iBAAgBhI,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAtB1D;AAuBHa,MAAAA,QAAQ,EAAG,gBAAe7I,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAvBxD;AAwBHc,MAAAA,aAAa,EAAG,cAAa9I,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAxB3D;AAyBHe,MAAAA,QAAQ,EAAG,eAAc/I,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAzBvD;AA0BHgB,MAAAA,WAAW,EAAE,yBA1BV;AA2BHC,MAAAA,OAAO,EAAG,kBAAiBjJ,OAAO,CAACC,GAAR,CAAY+H,oBAAqB;AA3BzD,KADC;AA+BNkB,IAAAA,MAAM,EAAE;AACNC,MAAAA,SAAS,EAAG,SAAQnJ,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAD/C;AAENoB,MAAAA,eAAe,EAAG,WAAUpJ,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAFvD;AAGNqB,MAAAA,QAAQ,EAAG,OAAMrJ,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAH5C;AAINsB,MAAAA,SAAS,EAAG,aAAYtJ,OAAO,CAACC,GAAR,CAAY+H,oBAAqB,EAJnD;AAKNuB,MAAAA,YAAY,EAAG,gBAAevJ,OAAO,CAACC,GAAR,CAAY+H,oBAAqB;AALzD;AA/BF,GApDiE;AA4FzEwB,EAAAA,iBAAiB,EAAE;AACjBrD,IAAAA,GAAG,EAAE,CAAC,KAAD,EAAQ,SAAR,EAAmB,UAAnB,EAA+B,qBAA/B,CADY;AAEjB+C,IAAAA,MAAM,EAAE,CAAC,QAAD;AAFS,GA5FsD;AAiGzE3C,EAAAA,KAAK,EAAE;AACLkD,IAAAA,GAAG,EAAE;AACHC,MAAAA,cAAc,EAAE,KADb;AAEHC,MAAAA,MAAM,EAAE,CAAC,aAAD,EAAgB,kBAAhB,EAAoC,UAApC,CAFL;AAGHnD,MAAAA,MAAM,EAAE,CAAC,WAAD;AAHL,KADA;AAOLoD,IAAAA,QAAQ,EAAE;AACRF,MAAAA,cAAc,EAAE,SADR;AAERC,MAAAA,MAAM,EAAE,CACN,UADM,EAEN,cAFM,EAGN,YAHM,EAIN,eAJM,EAKN,UALM,EAMN,MANM,EAON,YAPM,EAQN,iBARM,EASN,kBATM,CAFA;AAaRnD,MAAAA,MAAM,EAAE,CAAC,eAAD;AAbA,KAPL;AAuBLqD,IAAAA,SAAS,EAAE;AACTH,MAAAA,cAAc,EAAE,UADP;AAETC,MAAAA,MAAM,EAAE,CACN,mBADM,EAEN,aAFM,EAGN,eAHM,EAIN,eAJM,EAKN,OALM,EAMN,MANM,EAON,SAPM,EAQN,UARM,EASN,eATM,EAUN,UAVM,EAWN,SAXM,CAFC;AAeTnD,MAAAA,MAAM,EAAE,CAAC,gBAAD;AAfC;AAvBN,GAjGkE;AA2IzEF,EAAAA,aAAa,EAAE;AACbH,IAAAA,GAAG,EAAE,EADQ;AAEb+C,IAAAA,MAAM,EAAE,CAAC,KAAD;AAFK,GA3I0D;AA+IzE1C,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,kCADS;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;AAElBoD,QAAAA,WAAW,EAAE,0DAFK;AAGlBnD,QAAAA,KAAK,EAAE;AAHW,OA7EhB;AAkFJoD,MAAAA,SAAS,EAAE;AACTrD,QAAAA,IAAI,EAAE,WADG;AAEToD,QAAAA,WAAW,EAAE,2CAFJ;AAGTnD,QAAAA,KAAK,EAAE;AAHE,OAlFP;AAuFJqD,MAAAA,aAAa,EAAE;AACbtD,QAAAA,IAAI,EAAE,eADO;AAEboD,QAAAA,WAAW,EAAE,4CAFA;AAGbnD,QAAAA,KAAK,EAAE;AAHM,OAvFX;AA4FJsD,MAAAA,GAAG,EAAE;AACHvD,QAAAA,IAAI,EAAE,KADH;AAEHoD,QAAAA,WAAW,EAAE,sBAFV;AAGHnD,QAAAA,KAAK,EAAE;AAHJ,OA5FD;AAiGJuD,MAAAA,GAAG,EAAE;AACHxD,QAAAA,IAAI,EAAE,KADH;AAEHoD,QAAAA,WAAW,EAAE,yBAFV;AAGHnD,QAAAA,KAAK,EAAE;AAHJ,OAjGD;AAsGJwD,MAAAA,WAAW,EAAE;AACXzD,QAAAA,IAAI,EAAE,aADK;AAEXoD,QAAAA,WAAW,EAAE,wBAFF;AAGXnD,QAAAA,KAAK,EAAE;AAHI,OAtGT;AA2GJ,qBAAe;AACbD,QAAAA,IAAI,EAAE,aADO;AAEboD,QAAAA,WAAW,EAAE,2BAFA;AAGbnD,QAAAA,KAAK,EAAE;AAHM,OA3GX;AAgHJyD,MAAAA,QAAQ,EAAE;AACR1D,QAAAA,IAAI,EAAE,UADE;AAERoD,QAAAA,WAAW,EAAE,kCAFL;AAGRnD,QAAAA,KAAK,EAAE;AAHC,OAhHN;AAqHJ0D,MAAAA,OAAO,EAAE;AACP3D,QAAAA,IAAI,EAAE,SADC;AAEPoD,QAAAA,WAAW,EAAE,4BAFN;AAGPnD,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;AAYN8B,MAAAA,MAAM,EAAE;AACNjC,QAAAA,WAAW,EAAE,qBADP;AAENC,QAAAA,SAAS,EAAE,yBAFL;AAGNC,QAAAA,gBAAgB,EAAE,0BAHZ;AAINC,QAAAA,QAAQ,EAAE;AAJJ;AAZF;AA7HF;AA/IiE,CAA3E;;ACCA,MAAM7B,QAA4B,GAAG,EACnC,GAAG+E,MADgC;AAEnC5E,EAAAA,qBAAqB,EAAE,IAFY;AAGnCQ,EAAAA,MAAM,EAAE;AACNC,IAAAA,GAAG,EAAE;AACHC,MAAAA,iBAAiB,EAAE,wBADhB;AAEH,0BAAoB;AAFjB;AADC;AAH2B,CAArC;;ACQO,MAAMmE,cAA2C,GAAG;AACzDC,WAAAA,QADyD;AAEzDpE,qBAAAA,MAFyD;AAGzDqE,cAAAA;AAHyD,CAApD;AASP;AACA;AACA;AACA;AACA;;ACtBO,MAAMC,iBAAmD,GAAG;AACjE,kBAAgB,IADiD;AAEjE,yBAAuB,IAF0C;AAGjE,eAAa,IAHoD;AAIjE,sBAAoB,IAJ6C;AAKjE,gBAAc,IALmD;AAMjE,qBAAmB,IAN8C;AAOjE,uBAAqB,IAP4C;AAQjE,4BAA0B,KARuC;AASjE,wBAAsB,IAT2C;AAUjE,uBAAqB,IAV4C;AAWjE,wBAAsB,IAX2C;AAYjE,2BAAyB;AAZwC,CAA5D;;ACIP,MAAMC,KAAK,GAAG,IAAIC,GAAJ,EAAd;;AAEA,MAAMC,oBAAoB,GAAIvF,GAAD,IAAiC;AAC5D,QAAMwF,aAAa,GAAGP,cAAc,CAACjF,GAAD,CAAd,IAAuByF,QAA7C;AACA,SAAOD,aAAa,CAACJ,iBAAd,GACH,EAAE,GAAGA,iBAAL;AAAwB,OAAGI,aAAa,CAACJ;AAAzC,GADG,GAEHA,iBAFJ;AAGD,CALD;;AAOO,MAAMM,WAAW,GAAG,CACzB1F,GADyB,EAEzB2F,MAFyB,EAGzBC,WAHyB,KAIhB;AACT,MAAIC,QAAQ,GAAGR,KAAK,CAACtH,GAAN,CAAUiC,GAAV,CAAf;;AACA,MAAI,CAAC6F,QAAL,EAAe;AACbA,IAAAA,QAAQ,GAAG,IAAIP,GAAJ,EAAX;AACAD,IAAAA,KAAK,CAACS,GAAN,CAAU9F,GAAV,EAAe6F,QAAf;AACD;;AACDA,EAAAA,QAAQ,CAACC,GAAT,CAAaH,MAAb,EAAqB,EAAE,GAAGJ,oBAAoB,CAACvF,GAAD,CAAzB;AAAgC,OAAG4F;AAAnC,GAArB;AACD,CAXM;AAaA,MAAMG,iBAAiB,GAAG,OAC/BC,WAD+B,EAE/BhG,GAF+B,EAG/BiG,KAH+B,EAI/BN,MAJ+B,KAKH;AAC5B,QAAMO,oBAAoB,GAAGX,oBAAoB,CAACvF,GAAD,CAAjD;AAEA,QAAMmG,oBAAoB,GAAG,MAAMH,WAAW,CAACI,cAAZ,CAA2BC,OAA3B,CAAmC;AACpEJ,IAAAA,KADoE;AAEpEN,IAAAA;AAFoE,GAAnC,CAAnC;AAKA,QAAM1F,MAAM,GAAGkG,oBAAoB,GAC/B,EACE,GAAGD,oBADL;AAEE,OAAGC,oBAAoB,CAACG;AAF1B,GAD+B,GAK/BJ,oBALJ;AAOAR,EAAAA,WAAW,CAAC1F,GAAD,EAAM2F,MAAN,EAAc1F,MAAd,CAAX;AACA,SAAOA,MAAP;AACD,CAtBM;;ACpBA,MAAMsG,OAAO,GAAG,OACrBP,WADqB,EAErBQ,OAFqB,EAGrBC,cAHqB,EAIrBzG,GAJqB,KAKJ;AACjB,QAAM0G,UAAU,GAAG,MAAMV,WAAW,CAACrG,IAAZ,CAAiBgH,SAAjB,CAA2B;AAClDC,IAAAA,GAAG,EAAE5G,GAAG,CAAC9E,EADyC;AAElDiE,IAAAA,KAAK,EAAEa,GAAG,CAACb,KAFuC;AAGlDsH,IAAAA;AAHkD,GAA3B,CAAzB;AAMA,QAAMI,QAAQ,GAAG;AAAE3L,IAAAA,EAAE,EAAE8E,GAAG,CAAC9E,EAAV;AAAciE,IAAAA,KAAK,EAAEa,GAAG,CAACb;AAAzB,GAAjB;AAEA,QAAM2H,SAAmB,GAAG,EAA5B;;AAEA,aAAW,MAAM;AAAE5H,IAAAA;AAAF,GAAjB,IAA6BsH,OAAO,CAACO,QAAR,CAAiBC,QAAjB,CAC3BR,OAAO,CAAC7G,IAAR,CAAasH,WADc,EAE3B;AAAEjH,IAAAA,GAAG,EAAEA,GAAG,CAACb;AAAX,GAF2B,CAA7B,EAGG;AACD,UAAM+H,OAAO,CAACC,GAAR,CACJjI,IAAI,CAACa,GAAL,CAAS,MAAOqH,MAAP,IAAkB;AACzB,UAAI,CAACA,MAAL,EAAa;AACbN,MAAAA,SAAS,CAACO,IAAV,CAAeD,MAAM,CAAClM,EAAtB;AACA,aAAOgM,OAAO,CAACC,GAAR,CAAY,CACjBnB,WAAW,CAACsB,UAAZ,CAAuBX,SAAvB,CACE;AACEC,QAAAA,GAAG,EAAG,GAAE5G,GAAG,CAAC9E,EAAG,IAAGkM,MAAM,CAAClM,EAAG,EAD9B;AAEE8E,QAAAA,GAAG,EAAE6G,QAFP;AAGE9H,QAAAA,IAAI,EAAE;AACJ7D,UAAAA,EAAE,EAAEkM,MAAM,CAAClM,EADP;AAEJiE,UAAAA,KAAK,EAAEiI,MAAM,CAACjI;AAFV;AAHR,OADF,EASE;AACE8B,QAAAA,KAAK,EAAE,EADT;;AAAA,OATF,CADiB,EAcjB+E,WAAW,CAAChH,KAAZ,CAAkB2H,SAAlB,CAA4B;AAC1BC,QAAAA,GAAG,EAAEQ,MAAM,CAAClM,EADc;AAE1BiE,QAAAA,KAAK,EAAEiI,MAAM,CAACjI,KAFY;AAG1BoI,QAAAA,IAAI,EAAEH,MAAM,CAACG;AAHa,OAA5B,CAdiB,CAAZ,CAAP;AAoBD,KAvBD,CADI,CAAN;AA0BD;;AAED,QAAMvB,WAAW,CAACsB,UAAZ,CAAuBE,UAAvB,CAAkC;AACtC,cAAUxH,GAAG,CAAC9E,EADwB;AAEtC,eAAW;AAAEuM,MAAAA,IAAI,EAAE;AAAEC,QAAAA,GAAG,EAAEZ;AAAP;AAAR;AAF2B,GAAlC,CAAN;AAKA,SAAOJ,UAAP;AACD,CAtDM;;ACRA,MAAMiB,aAAa,GAAIC,OAAvB;AAIA,MAAMC,eAAe,GAAMzK,GAAD,IAAcA,GAAG,KAAK,IAAhD;;ACAA,MAAM0K,eAAe,GAAG,OAC7B9B,WAD6B,EAE7BQ,OAF6B,EAG7BxG,GAH6B,EAI7B+H,IAJ6B,KAKX;AAClB,QAAMjB,SAAmB,GAAG,EAA5B;;AACA,aAAW,MAAM;AAAE5H,IAAAA;AAAF,GAAjB,IAA6BsH,OAAO,CAACO,QAAR,CAAiBC,QAAjB,CAC3BR,OAAO,CAACvF,KAAR,CAAc+G,gBADa,EAE3B;AACEhI,IAAAA,GAAG,EAAEA,GAAG,CAACb,KADX;AAEE8I,IAAAA,SAAS,EAAEF,IAAI,CAACG;AAFlB,GAF2B,CAA7B,EAMG;AACD,UAAMC,yBAAyB,GAAGjJ,IAAI,CACnCkJ,MAD+B,CACxBT,aADwB,EAE/B5H,GAF+B,CAE1BqH,MAAD,IAAYA,MAAM,CAAClM,EAFQ,CAAlC;AAGA4L,IAAAA,SAAS,CAACO,IAAV,CAAe,GAAGc,yBAAlB;AAEA,UAAMnC,WAAW,CAACsB,UAAZ,CAAuBe,iBAAvB,CACJ;AACEzB,MAAAA,GAAG,EAAE;AACHc,QAAAA,GAAG,EAAES,yBAAyB,CAACpI,GAA1B,CACFuI,QAAD,IAAe,GAAEtI,GAAG,CAAC9E,EAAG,IAAGoN,QAAS,EADjC;AADF,OADP;AAME,gBAAUtI,GAAG,CAAC9E,EANhB;AAOE,kBAAY;AAAEqN,QAAAA,GAAG,EAAER,IAAI,CAAC7M;AAAZ;AAPd,KADI,EAUJ;AAAEsN,MAAAA,KAAK,EAAE;AAAEvH,QAAAA,KAAK,EAAE8G;AAAT;AAAT,KAVI,CAAN;AAYD;;AAED,QAAM/B,WAAW,CAACsB,UAAZ,CAAuBe,iBAAvB,CACJ;AACE,cAAUrI,GAAG,CAAC9E,EADhB;AAEE,eAAW;AAAEuM,MAAAA,IAAI,EAAE;AAAEC,QAAAA,GAAG,EAAEZ;AAAP;AAAR;AAFb,GADI,EAKJ;AAAE2B,IAAAA,KAAK,EAAE;AAAExH,MAAAA,KAAK,EAAE;AAAE/F,QAAAA,EAAE,EAAE6M,IAAI,CAAC7M;AAAX;AAAT;AAAT,GALI,CAAN;AAOD,CAxCM;;ACAA,MAAMwN,SAAS,GAAG,OACvB1C,WADuB,EAEvBQ,OAFuB,EAGvBxG,GAHuB,KAIK;AAC5B,QAAM6G,QAAQ,GAAG;AAAE3L,IAAAA,EAAE,EAAE8E,GAAG,CAAC9E,EAAV;AAAciE,IAAAA,KAAK,EAAEa,GAAG,CAACb;AAAzB,GAAjB;AAEA,QAAMwJ,UAA0B,GAAG,EAAnC;AACA,QAAMC,OAAiB,GAAG,EAA1B;;AAEA,aAAW,MAAM;AAAE1J,IAAAA;AAAF,GAAjB,IAA6BsH,OAAO,CAACO,QAAR,CAAiBC,QAAjB,CAA0BR,OAAO,CAACvF,KAAR,CAAcE,IAAxC,EAA8C;AACzEnB,IAAAA,GAAG,EAAEA,GAAG,CAACb;AADgE,GAA9C,CAA7B,EAEI;AACF,UAAM+H,OAAO,CAACC,GAAR,CACJjI,IAAI,CAACa,GAAL,CAAS,MAAOgI,IAAP,IAAgB;AACvBa,MAAAA,OAAO,CAACvB,IAAR,CAAaU,IAAI,CAAC7M,EAAlB;AACAyN,MAAAA,UAAU,CAACtB,IAAX,CAAgB;AACdnM,QAAAA,EAAE,EAAE6M,IAAI,CAAC7M,EADK;AAEdkG,QAAAA,IAAI,EAAE2G,IAAI,CAAC3G,IAFG;AAGd8G,QAAAA,IAAI,EAAEH,IAAI,CAACG;AAHG,OAAhB;AAKA,aAAOlC,WAAW,CAAC6C,QAAZ,CAAqBlC,SAArB,CAA+B;AACpCC,QAAAA,GAAG,EAAEmB,IAAI,CAAC7M,EAD0B;AAEpC8E,QAAAA,GAAG,EAAE6G,QAF+B;AAGpCzF,QAAAA,IAAI,EAAE2G,IAAI,CAAC3G,IAHyB;AAIpC8G,QAAAA,IAAI,EAAEH,IAAI,CAACG,IAJyB;AAKpC1D,QAAAA,WAAW,EAAEuD,IAAI,CAACvD;AALkB,OAA/B,CAAP;AAOD,KAdD,CADI,CAAN;AAiBD;;AAED,QAAM0C,OAAO,CAACC,GAAR,CAAY,CAChBnB,WAAW,CAAC6C,QAAZ,CAAqBrB,UAArB,CAAgC;AAC9B,cAAUxH,GAAG,CAAC9E,EADgB;AAE9B0L,IAAAA,GAAG,EAAE;AAAEa,MAAAA,IAAI,EAAE;AAAEC,QAAAA,GAAG,EAAEkB;AAAP;AAAR;AAFyB,GAAhC,CADgB,EAMhB5C,WAAW,CAACsB,UAAZ,CAAuBe,iBAAvB,CACE;AACE,cAAUrI,GAAG,CAAC9E;AADhB,GADF,EAIE;AAAEuN,IAAAA,KAAK,EAAE;AAAExH,MAAAA,KAAK,EAAE;AAAE/F,QAAAA,EAAE,EAAE;AAAEuM,UAAAA,IAAI,EAAE;AAAEC,YAAAA,GAAG,EAAEkB;AAAP;AAAR;AAAN;AAAT;AAAT,GAJF,CANgB,CAAZ,CAAN;AAcA,SAAOD,UAAP;AACD,CA/CM;AAiDA,MAAMG,uBAAuB,GAAG,OACrC9C,WADqC,EAErCQ,OAFqC,EAGrCxG,GAHqC,KAInB;AAClB,QAAMiB,KAAK,GAAG,MAAMyH,SAAS,CAAC1C,WAAD,EAAcQ,OAAd,EAAuBxG,GAAvB,CAA7B;;AACA,OAAK,MAAM+H,IAAX,IAAmB9G,KAAnB,EAA0B;AACxB,UAAM6G,eAAe,CAAC9B,WAAD,EAAcQ,OAAd,EAAuBxG,GAAvB,EAA4B+H,IAA5B,CAArB;AACD;AACF,CATM;;ACvCP,MAAMgB,UAA2C,GAAG;AAClD,kBAAgB,qCADkC;AAElD,yBACE,wDAHgD;AAIlD,eAAa,wDAJqC;AAKlD,sBAAoB,6CAL8B;AAMlD,gBAAc,8BANoC;AAOlD,qBAAmB,4BAP+B;AAQlD,uBAAqB,4CAR6B;AASlD,4BAA0B,0CATwB;AAUlD,wBAAsB,+BAV4B;AAWlD,uBAAqB,2CAX6B;AAYlD,wBAAsB,gDAZ4B;AAalD,2BACE;AAdgD,CAApD;AAiBe,SAASC,WAAT,CACblL,MADa,EAEbmL,UAFa,EAGbjD,WAHa,EAIP;AACNlI,EAAAA,MAAM,CAACC,GAAP,CACE,sBADF;AAGE,SAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAClB,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,CAAUgK,IAAV,CAAgBC,CAAD,IAAOA,CAAC,CAAChK,KAAF,KAAY3C,GAAG,CAAC4M,MAAJ,CAAWpJ,GAA7C,CAAZ;AACA,QAAI,CAACA,GAAL,EAAU,OAAO5C,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAEV,UAAMuL,CAAC,GAAG,MAAMnD,WAAW,CAACrG,IAAZ,CAAiB0J,SAAjB,CAA2BrJ,GAAG,CAAC9E,EAA/B,CAAhB;AACA,QAAI,CAACiO,CAAL,EAAQ,OAAO/L,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAER,UAAM2I,OAAO,CAACP,WAAD,EAAcjH,IAAI,CAAClB,GAAnB,EAAwBsL,CAAC,CAAC1C,cAA1B,EAAoDzG,GAApD,CAAb;AACA,UAAM8I,uBAAuB,CAAC9C,WAAD,EAAcjH,IAAI,CAAClB,GAAnB,EAAwBmC,GAAxB,CAA7B;AAEA5C,IAAAA,GAAG,CAACQ,QAAJ,CAAc,YAAWpB,GAAG,CAAC4M,MAAJ,CAAWpJ,GAAI,EAAxC;AACD,GAlBH;AAqBAlC,EAAAA,MAAM,CAACC,GAAP,CACE,WADF;AAGE,SAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAClB,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,CAAUgK,IAAV,CAAgBC,CAAD,IAAOA,CAAC,CAAChK,KAAF,KAAY3C,GAAG,CAAC4M,MAAJ,CAAWpJ,GAA7C,CAAZ;AACA,QAAI,CAACA,GAAL,EAAU,OAAO5C,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAEV,UAAM0L,YAAY,GAAG,MAAML,UAAU,CAACM,IAAX,CACxBC,kBADwB,CACL;AAAExJ,MAAAA,GAAG,EAAEA,GAAG,CAACb;AAAX,KADK,EAExBsK,KAFwB,CAEjBC,GAAD,IAAS;AACd,aAAO;AAAExH,QAAAA,MAAM,EAAEwH,GAAG,CAACxH,MAAd;AAAsBhD,QAAAA,IAAI,EAAE3B;AAA5B,OAAP;AACD,KAJwB,CAA3B;;AAMA,QAAI,CAAC+L,YAAL,EAAmB;AACjB,aAAOlM,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,UAAM6J,aAAa,GAAGP,cAAc,CAACjF,GAAG,CAACb,KAAL,CAApC;AACA,UAAMiH,cAAc,GAAG,MAAML,iBAAiB,CAC5CC,WAD4C,EAE5ChG,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,CAAC2J,aAAD,GACG,yHADH,GAEI,iGAAgGxF,GAAG,CAACb,KAAM,KAJjH,CADF,eAOEtD;AAAK,MAAA,KAAK,EAAE;AAAE8N,QAAAA,KAAK,EAAE;AAAT;AAAZ,oBACE9N,0DADF,EAEG+N,MAAM,CAACC,OAAP,CAAed,UAAf,EAA2BhJ,GAA3B,CAA+B,CAAC,CAAC+J,GAAD,EAAM1I,IAAN,CAAD,kBAC9BvF;AAAK,MAAA,GAAG,EAAEiO;AAAV,oBACEjO;AAAO,MAAA,OAAO,EAAEiO;AAAhB,oBACEjO;AACE;AACA,MAAA,uBAAuB,EAAE;AACvBkO,QAAAA,MAAM,EAAG,cAAaD,GAAI,wCACxB1D,cAAc,CAAC0D,GAAD,CAAd,GACI,oBADJ,GAEI,EACL,sIAAqIA,GAAI;AALnH;AAF3B,MADF,EAWG1I,IAXH,CADF,CADD,CAFH,CAPF,CAPF,CADF,CADkB,CADtB;AA0CD,GAtFH;AAyFAtD,EAAAA,MAAM,CAACkM,KAAP,CAAa,WAAb,EAA0BC,mBAAU,CAACC,IAAX,EAA1B,EAA6C,OAAO1N,GAAP,EAAYY,GAAZ,KAAoB;AAC/D,QAAI,CAACZ,GAAG,CAAC2N,IAAT,EAAe;AACb/M,MAAAA,GAAG,CAAC8E,MAAJ,CAAW,GAAX,EAAgB1D,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,CAAUgK,IAAV,CAAgBC,CAAD,IAAOA,CAAC,CAAChK,KAAF,KAAY3C,GAAG,CAAC4M,MAAJ,CAAWpJ,GAA7C,CAAZ;AACA,QAAI,CAACA,GAAL,EAAU,OAAO5C,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAEV,KAAC,MAAMoI,WAAW,CAACI,cAAZ,CAA2BgE,UAAlC,EAA8CC,SAA9C,CACE;AACEzD,MAAAA,GAAG,EAAG,GAAE5G,GAAG,CAAC9E,EAAG,IAAG6D,IAAI,CAAC1B,QAAL,CAAcnC,EAAG;AADrC,KADF,EAIE;AACEoP,MAAAA,IAAI,EAAE;AACJ,SAAE,YAAW9N,GAAG,CAAC2N,IAAJ,CAASL,GAAI,EAA1B,GAA8BtN,GAAG,CAAC2N,IAAJ,CAASI,KADnC;AAEJC,QAAAA,OAAO,EAAE,IAAInL,IAAJ;AAFL,OADR;AAKEoL,MAAAA,YAAY,EAAE;AACZxE,QAAAA,KAAK,EAAEjG,GAAG,CAAC9E,EADC;AAEZyK,QAAAA,MAAM,EAAE5G,IAAI,CAAC1B,QAAL,CAAcnC,EAFV;AAGZwP,QAAAA,OAAO,EAAE,IAAIrL,IAAJ;AAHG;AALhB,KAJF,EAeE;AAAEsL,MAAAA,MAAM,EAAE;AAAV,KAfF;AAkBA,UAAMxE,oBAAoB,GAAG,MAAMH,WAAW,CAACI,cAAZ,CAA2BC,OAA3B,CAAmC;AACpEJ,MAAAA,KAAK,EAAEjG,GAAG,CAAC9E,EADyD;AAEpEyK,MAAAA,MAAM,EAAE5G,IAAI,CAAC1B,QAAL,CAAcnC;AAF8C,KAAnC,CAAnC;;AAKA,QAAIiL,oBAAJ,EAA0B;AACxBT,MAAAA,WAAW,CAAC1F,GAAG,CAACb,KAAL,EAAYJ,IAAI,CAAC1B,QAAL,CAAcnC,EAA1B,EAA8BiL,oBAAoB,CAACG,QAAnD,CAAX;AACD;;AAEDlJ,IAAAA,GAAG,CAACoB,IAAJ,CAAS,IAAT;AACD,GAzCD;AA0CD;;ACrLc,SAASoM,UAAT,CACb9M,MADa,EAEbmL,UAFa,EAGP;AACNnL,EAAAA,MAAM,CAACC,GAAP,CACE,eADF;AAGE,SAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAClB,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,CAASgN,KAAT,CAAejL,wBAAf,CAAwC;AAC7DkL,MAAAA,QAAQ,EAAE;AADmD,KAAxC,CAAvB;AAIA1N,IAAAA,GAAG,CAACoB,IAAJ,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,uDACEA,6DADF,eAEEA,yCACGqD,IAAI,CAACa,GAAL,CAAUgL,IAAD,iBACRlP;AAAI,MAAA,GAAG,EAAEkP,IAAI,CAAC7P;AAAd,oBACEW;AACE,MAAA,IAAI,EAAG,mBAAkBkP,IAAI,CAACC,KAAL,CAAW7L,KAAM,IAAG4L,IAAI,CAAC3J,IAAK;AADzD,OAGG2J,IAAI,CAAC3J,IAHR,CADF,CADD,CADH,CAFF,EAcGlC,IAAI,CAAC+L,MAAL,KAAgB,GAAhB,iBACCpP,0FAfJ,CADF,CADkB,CADtB;AAwBD,GAlCH;AAqCAiC,EAAAA,MAAM,CAACC,GAAP,CACE,gCADF;AAGE,SAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAClB,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,CAASgN,KAAT,CAAe9M,GAAf,CAAmB;AACxCiN,MAAAA,KAAK,EAAExO,GAAG,CAAC4M,MAAJ,CAAW4B,KADsB;AAExCD,MAAAA,IAAI,EAAEvO,GAAG,CAAC4M,MAAJ,CAAWwB;AAFuB,KAAnB,CAAvB;;AAKA,QAAI,CAAC1L,IAAL,EAAW;AACT9B,MAAAA,GAAG,CAAC8E,MAAJ,CAAW,GAAX,EAAgB1D,IAAhB,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,2DADF,CADkB,CADtB;AAOA;AACD;;AAED,QAAI,CAACqD,IAAI,CAACgM,WAAN,IAAqB,CAAChM,IAAI,CAACgM,WAAL,CAAiBC,KAA3C,EAAkD;AAChD/N,MAAAA,GAAG,CAAC8E,MAAJ,CAAW,GAAX,EAAgB1D,IAAhB,CACEK,2BAAoB,eAClBhD,6BAAC,MAAD,qBACEA,+GADF,CADkB,CADtB;AAUA;AACD;;AAED,UAAM;AAAEqD,MAAAA,IAAI,EAAEkM;AAAR,QAAkB,MAAMnC,UAAU,CAACM,IAAX,CAC3B8B,mBAD2B,CACP;AACnBL,MAAAA,KAAK,EAAExO,GAAG,CAAC4M,MAAJ,CAAW4B,KADC;AAEnBD,MAAAA,IAAI,EAAEvO,GAAG,CAAC4M,MAAJ,CAAWwB;AAFE,KADO,EAK3BnB,KAL2B,CAKpBC,GAAD,IAAS;AACd,aAAO;AAAExH,QAAAA,MAAM,EAAEwH,GAAG,CAACxH,MAAd;AAAsBhD,QAAAA,IAAI,EAAE3B;AAA5B,OAAP;AACD,KAP2B,CAA9B;;AASA,QAAI,CAAC6N,KAAL,EAAY;AACVhO,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,CAAC4M,MAAJ,CAAWwB,UAAhB,CADF,CADF,CADkB,CADtB;AASD,GA1EH;AA4ED;;ACpHM,MAAMU,QAAQ,GAAG,OACtBtF,WADsB,EAEtBuF,MAFsB,EAGtB9E,cAHsB,EAItB+E,QAJsB,KAKJ;AAClB,QAAMzM,IAAI,GAAG,MAAMiH,WAAW,CAAChH,KAAZ,CAAkB2H,SAAlB,CAA4B;AAC7CC,IAAAA,GAAG,EAAE4E,QAAQ,CAACtQ,EAD+B;AAE7CiE,IAAAA,KAAK,EAAEqM,QAAQ,CAACrM,KAF6B;AAG7CoI,IAAAA,IAAI,EAAE,MAHuC;AAI7Cd,IAAAA;AAJ6C,GAA5B,CAAnB;AAOA,SAAO1H,IAAP;AACD,CAdM;;ACCQ,SAAS0M,YAAT,CACb3N,MADa,EAEbmL,UAFa,EAGbjD,WAHa,EAIP;AACNlI,EAAAA,MAAM,CAACC,GAAP,CACE,kBADF;AAGE,SAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAClB,UAAM2B,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW,OAFO;AAKlB;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA,UAAM2M,CAAC,GAAG,MAAM1F,WAAW,CAAChH,KAAZ,CAAkBqK,SAAlB,CAA4BtK,IAAI,CAAC1B,QAAL,CAAcnC,EAA1C,CAAhB;AACA,QAAI,CAACwQ,CAAD,IAAM,CAACA,CAAC,CAACjF,cAAb,EAA6B,OAAOrJ,GAAG,CAACQ,QAAJ,CAAa,MAAb,CAAP;AAE7B,UAAM0N,QAAQ,CACZtF,WADY,EAEZjH,IAAI,CAAClB,GAFO,EAGZ6N,CAAC,CAACjF,cAHU,EAIZ1H,IAAI,CAAC1B,QAJO,CAAd;AAOAD,IAAAA,GAAG,CAACQ,QAAJ,CAAa,WAAb;AACD,GA5BH;AA+BAE,EAAAA,MAAM,CAACC,GAAP,CACE,OADF;AAGE,SAAOvB,GAAP,EAAYY,GAAZ,KAAoB;AAClB,UAAM2B,IAAI,GAAG,MAAMpB,OAAO,CAACnB,GAAD,EAAMY,GAAN,CAA1B;AACA,QAAI,CAAC2B,IAAL,EAAW;AAEX,UAAM;AAAEG,MAAAA,IAAI,EAAEoK;AAAR,QAAyB,MAAML,UAAU,CAACM,IAAX,CAClCoC,mBADkC,CACd;AACnBC,MAAAA,QAAQ,EAAE7M,IAAI,CAAC1B,QAAL,CAAc8B;AADL,KADc,EAIlCsK,KAJkC,CAI3BC,GAAD,IAAS;AACd,aAAO;AAAExH,QAAAA,MAAM,EAAEwH,GAAG,CAACxH,MAAd;AAAsBhD,QAAAA,IAAI,EAAE3B;AAA5B,OAAP;AACD,KANkC,CAArC;;AAQA,QAAI,CAAC+L,YAAL,EAAmB;AACjB,aAAOlM,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,GAzCH;AA2CD;;AC/Ec,eAAekQ,SAAf,CACbC,GADa,EAEbC,SAFa,EAMb;AAAE/F,EAAAA;AAAF,CANa,EAOE;AACf,QAAMlI,MAAM,GAAIiO,SAAD,CAA6C,MAA7C,CAAf;AACA,QAAM9C,UAAU,GAAG,MAAM6C,GAAG,CAAC1Q,IAAJ,EAAzB;AAEA0C,EAAAA,MAAM,CAACkO,GAAP,CAAWC,qBAAY,EAAvB;AAEA7Q,EAAAA,IAAI,CAAC0C,MAAD,CAAJ;AACA8M,EAAAA,UAAU,CAAC9M,MAAD,EAASmL,UAAT,CAAV;AACAvJ,EAAAA,IAAI,CAAC5B,MAAD,CAAJ;AACAkL,EAAAA,WAAW,CAAClL,MAAD,EAASmL,UAAT,EAAqBjD,WAArB,CAAX;AACAyF,EAAAA,YAAY,CAAC3N,MAAD,EAASmL,UAAT,EAAqBjD,WAArB,CAAZ;AACD;;ACdM,MAAMkG,kBAAkB,GAAG,OAChC;AAAElG,EAAAA;AAAF,CADgC,EAEhCuF,MAFgC,EAGhC9E,cAHgC,EAIhC0F,WAJgC,KAKR;AAAA;;AACxB,UAAQA,WAAW,CAAC5E,IAApB;AACE,SAAK,cAAL;AAAqB;AACnB,YAAIvH,GAAG,GAAG,MAAMgG,WAAW,CAACrG,IAAZ,CAAiB0J,SAAjB,CAA2B8C,WAAW,CAACjR,EAAvC,CAAhB;AACA,oBAAI8E,GAAJ,iCAAI,KAAKyG,cAAT,EAAyB,OAAOzG,GAAP,CAFN;;AAKnBA,QAAAA,GAAG,GAAG,MAAMuG,OAAO,CAACP,WAAD,EAAcuF,MAAd,EAAsB9E,cAAtB,EAAsC0F,WAAtC,CAAnB;AACA,cAAMrD,uBAAuB,CAAC9C,WAAD,EAAcuF,MAAd,EAAsBY,WAAtB,CAA7B;AACA,eAAOnM,GAAP;AACD;;AAED,SAAK,MAAL;AAAa;AACX,YAAIjB,IAAI,GAAG,MAAMiH,WAAW,CAAChH,KAAZ,CAAkBqK,SAAlB,CAA4B8C,WAAW,CAACjR,EAAxC,CAAjB;AACA,qBAAI6D,IAAJ,kCAAI,MAAM0H,cAAV,EAA0B,OAAO1H,IAAP;AAE1BA,QAAAA,IAAI,GAAG,MAAMuM,QAAQ,CAACtF,WAAD,EAAcuF,MAAd,EAAsB9E,cAAtB,EAAsC0F,WAAtC,CAArB;AACA,eAAOpN,IAAP;AACD;;AAED;AACE,YAAM,IAAIlE,KAAJ,CAAW,8BAA6BsR,WAAW,CAAC5E,IAAK,EAAzD,CAAN;AApBJ;AAsBD,CA5BM;;ACXA,MAAM6E,OAAO,GAClBjD,CADqB,IAELS,MAAM,CAACyC,IAAP,CAAYlD,CAAZ,CAFX;AAIP,MAAMmD,UAAU,GAAGC,yBAAgB,EAAnC;AAEO,MAAMC,2BAA2B,GACtChI,WADyC,IAE9B;AACX,MAAI,CAACA,WAAL,EAAkB,OAAO,EAAP;;AAClB,MAAIA,WAAW,CAACiI,UAAZ,CAAuB,GAAvB,CAAJ,EAAiC;AAC/B,UAAM,GAAGC,KAAH,IAAY,WAAWC,IAAX,CAAgBnI,WAAhB,KAAgC,EAAlD;AACA,WAAOkI,KAAK,IAAI,EAAhB;AACD;;AACD,QAAMtK,KAAK,GAAGkK,UAAU,CAACK,IAAX,CAAgBnI,WAAhB,CAAd;AACA,MAAIpC,KAAK,IAAIoC,WAAW,CAACiI,UAAZ,CAAuBrK,KAAK,CAAC,CAAD,CAA5B,CAAb,EAA+C,OAAOA,KAAK,CAAC,CAAD,CAAZ;AAC/C,SAAO,EAAP;AACD,CAXM;;ACNA,MAAMwK,aAAa,GAAG,OAAkB;AAC7CC,EAAAA,OAAO,EAAE,MAAc,EADsB;AAE7CC,EAAAA,WAAW,EAAE,MAAqB5F,OAAO,CAAC6F,OAAR,CAAgB,IAAhB,CAFW;AAG7CC,EAAAA,aAAa,EAAE,MAAqB9F,OAAO,CAAC6F,OAAR,CAAgB,IAAhB,CAHS;AAI7CE,EAAAA,aAAa,EAAE,MAA0B/F,OAAO,CAAC6F,OAAR,CAAgBxP,SAAhB,CAJI;AAK7C2P,EAAAA,WAAW,EAAE,MAA0BhG,OAAO,CAAC6F,OAAR,CAAgBxP,SAAhB,CALM;AAM7C4P,EAAAA,UAAU,EAAE,MAAY5P;AANqB,CAAlB,CAAtB;;ACYA,MAAM6P,aAAa,GAAG,OAC3B;AAAEpH,EAAAA,WAAF;AAAeqH,EAAAA;AAAf,CAD2B,EAE3BC,OAF2B,EAG3BrN,MAH2B,EAI3BsN,OAJ2B,KAKJ;AACvB,QAAMC,UAAU,GAAG,gBAAgBD,OAAhB,IAA2BA,OAAO,CAACC,UAAtD;;AAEA,MAAI,CAACA,UAAL,EAAiB;AACf,WAAOZ,aAAa,EAApB;AACD;;AAED,QAAMa,uBAAuB,GAAGrB,OAAO,CAACnM,MAAM,CAACW,MAAR,CAAP,CAAuB8M,MAAvB,CAE7B,CAACC,GAAD,EAAMC,SAAN,KAAoB;AACrBhE,IAAAA,MAAM,CAACiE,MAAP,CAAcF,GAAd,EAAmB1N,MAAM,CAACW,MAAP,CAAcgN,SAAd,CAAnB;AACA,WAAOD,GAAP;AACD,GAL+B,EAK7B,EAL6B,CAAhC;AAOA,QAAMG,WAAW,GAAGlE,MAAM,CAACmE,MAAP,CAAcN,uBAAd,CAApB;AACA,QAAMO,WAAW,GAAG,IAAIC,gBAAJ,CAAcT,UAAd,CAApB;AAEA,QAAMU,WAAW,GAAG,MAAMlI,WAAW,CAACsB,UAAZ,CAAuB6G,OAAvB,CAA+B;AACvD,cAAUZ,OAAO,CAAC3G;AADqC,GAA/B,CAA1B;AAIA,QAAMwH,OAA6C,GAAG,EAAtD;AACA,QAAMC,iBAA2B,GAAG,EAApC;AAEAzE,EAAAA,MAAM,CAACC,OAAP,CAAe4D,uBAAf,EAAwCa,OAAxC,CAAgD,CAAC,CAACnP,KAAD,EAAQoP,KAAR,CAAD,KAAoB;AAAA;;AAClE,UAAMnH,MAAM,GAAG8G,WAAW,CAAChF,IAAZ,CAAkBsF,CAAD,IAAOA,CAAC,CAACzP,IAAF,CAAOI,KAAP,KAAiBA,KAAzC,CAAf;;AACA,QAAIiI,MAAJ,aAAIA,MAAJ,gCAAIA,MAAM,CAAEqH,KAAZ,0CAAI,cAAevT,EAAnB,EAAuB;AACrBmT,MAAAA,iBAAiB,CAAChH,IAAlB,CAAuBkH,KAAvB;AACAH,MAAAA,OAAO,CAAC/G,IAAR,CAAa,CAACkH,KAAD,EAAQ;AAAEnH,QAAAA,MAAM,EAAE;AAAElM,UAAAA,EAAE,EAAEkM,MAAM,CAACqH,KAAP,CAAavT;AAAnB,SAAV;AAAmCwT,QAAAA,EAAE,EAAEnR;AAAvC,OAAR,CAAb;AACD;AACF,GAND;;AAQA,MAAI8Q,iBAAiB,CAACpD,MAAlB,KAA6B6C,WAAW,CAAC7C,MAA7C,EAAqD;AACnD,UAAM0D,aAAa,GAAGb,WAAW,CAAC1F,MAAZ,CACnBmG,KAAD,IAAW,CAACF,iBAAiB,CAACO,QAAlB,CAA2BL,KAA3B,CADQ,CAAtB;AAIA,UAAMM,qBAAqB,GAAG,IAAIvJ,GAAJ,CAC5BsE,MAAM,CAACC,OAAP,CAAe4D,uBAAf,EAAwC1N,GAAxC,CAA4C,CAAC,CAACZ,KAAD,EAAQoP,KAAR,CAAD;AAAA;;AAAA,aAAoB,CAC9DA,KAD8D,uBAE9DL,WAAW,CAAChF,IAAZ,CAAkBsF,CAAD,IAAOA,CAAC,CAACzP,IAAF,CAAOI,KAAP,KAAiBA,KAAzC,CAF8D,sDAE9D,kBAAiDyH,GAFa,CAApB;AAAA,KAA5C,CAD4B,CAA9B;AAOA,UAAMoH,WAAW,CAACjH,QAAZ,CAAqB,YAArB,EAAmC,EAAnC,EAAwC+H,IAAD,IAAe;AAC1DA,MAAAA,IAAI,CAACV,OAAL,CAAaE,OAAb,CAAsBlH,MAAD,IAAiB;AAAA;;AACpC,cAAMmH,KAAK,sBAAGnH,MAAM,CAAC2H,OAAV,oDAAG,gBAAgBR,KAA9B;;AACA,YAAIA,KAAK,IAAII,aAAa,CAACC,QAAd,CAAuBL,KAAvB,CAAb,EAA4C;AAC1CH,UAAAA,OAAO,CAAC/G,IAAR,CAAa,CAACkH,KAAD,EAAQ;AAAEnH,YAAAA,MAAF;AAAUsH,YAAAA,EAAE,EAAEnR;AAAd,WAAR,CAAb;;AACA,cAAIsR,qBAAqB,CAACG,GAAtB,CAA0BT,KAA1B,CAAJ,EAAsC;AACpCvI,YAAAA,WAAW,CAACsB,UAAZ,CAAuBe,iBAAvB,CACE;AACEzB,cAAAA,GAAG,EAAEiI,qBAAqB,CAAC9Q,GAAtB,CAA0BwQ,KAA1B;AADP,aADF,EAIE;AAAEjE,cAAAA,IAAI,EAAE;AAAEmE,gBAAAA,KAAK,EAAE;AAAEvT,kBAAAA,EAAE,EAAEkM,MAAM,CAAClM;AAAb;AAAT;AAAR,aAJF;AAMD;AACF;AACF,OAbD;AAcA,aAAO,KAAP;AACD,KAhBK,CAAN;AAiBD;;AAED,OAAK,MAAM,GAAG6D,IAAH,CAAX,IAAuBqP,OAAvB,EAAgC;AAC9B,QAAI;AACF,YAAMM,EAAO,GAAG,MAAMV,WAAW,CAACiB,aAAZ,CAA0BC,IAA1B,CAA+B;AACnDlQ,QAAAA,KAAK,EAAED,IAAI,CAACqI,MAAL,CAAYlM;AADgC,OAA/B,CAAtB;AAGA6D,MAAAA,IAAI,CAAC2P,EAAL,GAAUA,EAAE,CAACS,OAAb;AACD,KALD,CAKE,OAAOzF,GAAP,EAAY;AACZ0F,MAAAA,OAAO,CAAC7Q,KAAR,CAAcmL,GAAd;AACD;AACF;;AAED,QAAM2F,UAAU,GAAG,IAAI/J,GAAJ,CAAQ8I,OAAR,CAAnB;;AAEA,QAAMkB,sBAAsB,GAAIC,WAAD,IAAyB;AACtD,UAAMhB,KAAK,GAAGd,uBAAuB,CAAC8B,WAAD,CAArC;AACA,QAAI,CAAChB,KAAL,EAAY,OAAO,IAAP;AACZ,WAAOc,UAAU,CAACtR,GAAX,CAAewQ,KAAf,CAAP;AACD,GAJD;;AAMA,SAAO;AACL1B,IAAAA,OAAO,EAAG0C,WAAD,IAAiC;AACxC;AACA,UAAIA,WAAW,CAACC,QAAZ,CAAqB,OAArB,CAAJ,EAAmC;AACjC,eAAQ,gBAAeD,WAAW,CAACE,KAAZ,CAAkB,CAAlB,EAAqB,EAArB,CAAsC,EAA7D;AACD;;AACD,YAAM1Q,IAAI,GAAGuQ,sBAAsB,CAACC,WAAD,CAAnC;AACA,UAAI,CAACxQ,IAAL,EAAW,OAAOwQ,WAAP;AACX,aAAQ,KAAIxQ,IAAI,CAACqI,MAAL,CAAYlM,EAAG,GAA3B;AACD,KATI;AAUL4R,IAAAA,WAAW,EAAE,OACX4C,QADW,EAEXC,QAFW,EAGXJ,WAHW,EAIXK,OAJW,KAKyB;AACpCtC,MAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CACE;AACEJ,QAAAA,QADF;AAEEH,QAAAA,WAFF;AAGEK,QAAAA;AAHF,OADF,EAME,qBANF;AAQA,UAAIlV,OAAO,CAACC,GAAR,CAAYoV,OAAZ,IAAuBrV,OAAO,CAACC,GAAR,CAAYoV,OAAZ,KAAwB,OAAnD,EAA4D,OAAO,IAAP;AAE5D,YAAM3J,cAAc,GAAG,MAAML,iBAAiB,CAC5CC,WAD4C,EAE5CuH,OAAO,CAACpO,KAFoC,EAG5CoO,OAAO,CAAC3G,GAHoC,EAI5C+I,QAJ4C,CAA9C;AAOA,UAAI,CAACvJ,cAAc,CAACsJ,QAAD,CAAnB,EAA+B,OAAO,IAAP;AAE/B,YAAM3Q,IAAI,GAAGuQ,sBAAsB,CAACC,WAAD,CAAnC;AACA,UAAI,CAACxQ,IAAD,IAAS,CAACA,IAAI,CAAC2P,EAAnB,EAAuB,OAAO,IAAP;AACvB,YAAM/P,MAAM,GAAG,MAAMqP,WAAW,CAACgC,IAAZ,CAAiBlD,WAAjB,CAA6B;AAChDlB,QAAAA,QAAQ,EAAElR,OAAO,CAACC,GAAR,CAAYgB,eAD0B;AAEhDwT,QAAAA,OAAO,EAAEpQ,IAAI,CAAC2P,EAAL,CAAQxT,EAF+B;AAGhD+U,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,GAET7S,SAP4C;AAQhD8S,QAAAA,SAAS,EAAET,OAAO,CAACU;AAR6B,OAA7B,CAArB;AAUA,UAAI,CAAC3R,MAAM,CAAC4R,EAAZ,EAAgB,OAAO,IAAP;AAChB,aAAO;AAAED,QAAAA,EAAE,EAAE3R,MAAM,CAAC2R,EAAb;AAA2BnB,QAAAA,OAAO,EAAExQ,MAAM,CAACwQ;AAA3C,OAAP;AACD,KAjDI;AAkDLnC,IAAAA,aAAa,EAAE,OACbsD,EADa,EAEbnB,OAFa,EAGbS,OAHa,KAIuB;AACpCtC,MAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CAAkB;AAAEQ,QAAAA,EAAF;AAAMnB,QAAAA,OAAN;AAAeS,QAAAA;AAAf,OAAlB,EAA4C,uBAA5C;AACA,UAAIlV,OAAO,CAACC,GAAR,CAAYoV,OAAZ,IAAuBrV,OAAO,CAACC,GAAR,CAAYoV,OAAZ,KAAwB,OAAnD,EAA4D,OAAO,IAAP;AAE5D,YAAMpR,MAAM,GAAG,MAAMqP,WAAW,CAACgC,IAAZ,CAAiBQ,MAAjB,CAAwB;AAC3CF,QAAAA,EAD2C;AAE3CnB,QAAAA,OAF2C;AAG3Cc,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,GAET7S;AAPuC,OAAxB,CAArB;AASA,UAAI,CAACoB,MAAM,CAAC4R,EAAZ,EAAgB,OAAO,IAAP;AAChB,aAAO;AAAED,QAAAA,EAAE,EAAE3R,MAAM,CAAC2R,EAAb;AAA2BnB,QAAAA,OAAO,EAAExQ,MAAM,CAACwQ;AAA3C,OAAP;AACD,KArEI;AAsELlC,IAAAA,aAAa,EAAE,OAAOqD,EAAP,EAAmBnB,OAAnB,KAAsD;AACnE7B,MAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CAAkB;AAAEQ,QAAAA,EAAF;AAAMnB,QAAAA;AAAN,OAAlB,EAAmC,uBAAnC;AACA,YAAMnB,WAAW,CAACgC,IAAZ,CAAiBS,MAAjB,CAAwB;AAC5BH,QAAAA,EAD4B;AAE5BnB,QAAAA;AAF4B,OAAxB,CAAN;AAID,KA5EI;AA6ELjC,IAAAA,WAAW,EAAE,OACXoD,EADW,EAEXnB,OAFW,EAGX/N,IAHW,KAIO;AAClBkM,MAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CAAkB;AAAEQ,QAAAA,EAAF;AAAMnB,QAAAA,OAAN;AAAe/N,QAAAA;AAAf,OAAlB,EAAyC,qBAAzC;AACA,YAAM4M,WAAW,CAAC0C,SAAZ,CAAsBC,GAAtB,CAA0B;AAC9BC,QAAAA,SAAS,EAAEN,EADmB;AAE9BnB,QAAAA,OAF8B;AAG9B/N,QAAAA;AAH8B,OAA1B,CAAN;AAKD,KAxFI;AA0FL+L,IAAAA,UAAU,EAAGoC,WAAD,IAA+B;AACzCjC,MAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CAAkB;AAAEP,QAAAA;AAAF,OAAlB,EAAmC,mBAAnC;AACA,YAAMxQ,IAAI,GAAGuQ,sBAAsB,CAACC,WAAD,CAAnC;AACA,UAAI,CAACxQ,IAAD,IAAS,CAACA,IAAI,CAACqI,MAAnB,EAA2B;AAE3BiG,MAAAA,SAAS,CAACwD,oBAAV,CAA+BvD,OAAO,CAAC9G,OAAvC,EAAgDwH,WAAhD,EAA6D;AAC3DjP,QAAAA,IAAI,EAAE;AAAE7D,UAAAA,EAAE,EAAE,IAAN;AAAYiE,UAAAA,KAAK,EAAEoQ;AAAnB,SADqD;AAE3DvP,QAAAA,GAAG,EAAE;AAAE9E,UAAAA,EAAE,EAAEqS,OAAO,CAAC3G,GAAd;AAAmBzH,UAAAA,KAAK,EAAEoO,OAAO,CAACpO;AAAlC,SAFsD;AAG3DsP,QAAAA,KAAK,EAAE;AAAEvT,UAAAA,EAAE,EAAE6D,IAAI,CAACqI,MAAL,CAAYlM;AAAlB;AAHoD,OAA7D;AAKD;AApGI,GAAP;AAsGD,CA7LM;;ACoCP,MAAM4V,kBAAkB,GAAG,OACzBC,UADyB,EAEzBzD,OAFyB,EAGzBrN,MAHyB,EAIzBkM,WAJyB,KAKG;AAC5B,QAAMoB,OAAO,GAAG,MAAMrB,kBAAkB,CACtC6E,UADsC,EAEtCzD,OAAO,CAAC9G,OAF8B,EAGtC8G,OAAO,CAAC0D,OAAR,CAAgB1H,YAAhB,CAA6BpO,EAHS,EAItCiR,WAJsC,CAAxC;AAMA,QAAM8E,YAAY,GAAG7D,aAAa,CAAC2D,UAAD,EAAazD,OAAb,EAAsBrN,MAAtB,EAA8BsN,OAA9B,CAAlC;AAEA,QAAM2D,kBAAkB,GAAG,IAAI5L,GAAJ,EAA3B;;AACA,OAAK,MAAMsI,SAAX,IAAwBxB,OAAO,CAACnM,MAAM,CAACW,MAAR,CAA/B,EAAgD;AAC9CgJ,IAAAA,MAAM,CAACyC,IAAP,CAAYpM,MAAM,CAACW,MAAP,CAAcgN,SAAd,CAAZ,EAAsCU,OAAtC,CAA+CnP,KAAD,IAAW;AACvD+R,MAAAA,kBAAkB,CAACpL,GAAnB,CAAuB3G,KAAvB,EAA8ByO,SAA9B;AACD,KAFD;AAGD;;AAED,QAAMuD,qBAAqB,GAAG,IAAI7L,GAAJ,EAA9B;;AACA,MAAIrF,MAAM,CAACiE,iBAAX,EAA8B;AAC5B,SAAK,MAAM0J,SAAX,IAAwBxB,OAAO,CAACnM,MAAM,CAACiE,iBAAR,CAA/B,EAA2D;AACzDjE,MAAAA,MAAM,CAACiE,iBAAP,CAAyB0J,SAAzB,EAAoCU,OAApC,CAA6C8C,QAAD,IAAc;AACxDD,QAAAA,qBAAqB,CAACrL,GAAtB,CAA0BsL,QAA1B,EAAoCxD,SAApC;AACD,OAFD;AAGD;AACF;;AAED,QAAMyD,kBAAkB,GAAG,IAAI/L,GAAJ,EAA3B;AACA8G,EAAAA,OAAO,CAACnM,MAAM,CAACgB,KAAP,IAAgB,EAAjB,CAAP,CAA4BqN,OAA5B,CAAqC8C,QAAD,IAAc;AAC/CnR,IAAAA,MAAM,CAACgB,KAAR,CAAmDmQ,QAAnD,EAA6D/M,MAA7D,CAAoEiK,OAApE,CACGnP,KAAD,IAAW;AACT,YAAM8B,KAAK,GAAGoQ,kBAAkB,CAACtT,GAAnB,CAAuBoB,KAAvB,CAAd;;AACA,UAAI8B,KAAJ,EAAW;AACTA,QAAAA,KAAK,CAACoG,IAAN,CAAW+J,QAAX;AACD,OAFD,MAEO;AACLC,QAAAA,kBAAkB,CAACvL,GAAnB,CAAuB3G,KAAvB,EAA8B,CAACiS,QAAD,CAA9B;AACD;AACF,KARH;AAUD,GAXD;;AAaA,QAAME,iBAAiB,GAAIC,YAAD,IAAsC,CAC9D,GAAG,IAAIC,GAAJ,CACDD,YAAY,CACTxR,GADH,CACQwP,WAAD,IAAiB2B,kBAAkB,CAACnT,GAAnB,CAAuBwR,WAAvB,CADxB,EAEGnH,MAFH,CAEUT,aAFV,CADC,CAD2D,CAAhE;;AAOA,QAAM8J,oBAAoB,GAAIC,eAAD,IAAyC,CACpE,GAAG,IAAIF,GAAJ,CACDE,eAAe,CACZ3R,GADH,CACQqR,QAAD,IAAcD,qBAAqB,CAACpT,GAAtB,CAA0BqT,QAA1B,CADrB,EAEGhJ,MAFH,CAEUT,aAFV,CADC,CADiE,CAAtE;;AAQA,QAAMgK,MAAI,GAAGC,SAAI,EAAjB;AAEA,SAAO;AACL3R,IAAAA,MADK;AAELsN,IAAAA,OAFK;AAGLsE,IAAAA,YAAY,EAAE;AACZ3W,MAAAA,EAAE,EAAEiR,WAAW,CAACjR,EADJ;AAEZiE,MAAAA,KAAK,EAAEgN,WAAW,CAAChN,KAFP;AAGZoI,MAAAA,IAAI,EAAE4E,WAAW,CAAC5E;AAHN,KAHT;AAQLuK,IAAAA,WAAW,EAAE3F,WAAW,CAAC5E,IARpB;AASLoK,IAAAA,IAAI,EAAGI,QAAD,IAAyD;AAC7D,aAAO,IAAI7K,OAAJ,CAAY,CAAC6F,OAAD,EAAUiF,MAAV,KAAqB;AACtC,cAAMC,QAAQ,GAAG;AAAE1E,UAAAA,OAAO,EAAEpB,WAAW,CAAChN;AAAvB,SAAjB;AACAmO,QAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiBD,QAAjB,EAA2B,2BAA3B,EAFsC;;AAItCN,QAAAA,MAAI,CAAC,GAAD,EAAM,MAAOQ,qBAAP,IAAiC;AACzC,gBAAMC,OAAO,GAAGD,qBAAqB,CAAC,MAAM,EAAP,CAArC;AACA7E,UAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiBD,QAAjB,EAA2B,6BAA3B;;AACA,cAAI;AACF,kBAAMF,QAAQ,EAAd;AACD,WAFD,CAEE,OAAOrI,GAAP,EAAY;AACZ4D,YAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiBD,QAAjB,EAA2B,oCAA3B;AACAG,YAAAA,OAAO;AACPJ,YAAAA,MAAM,CAACtI,GAAD,CAAN;AACA;AACD;;AACD4D,UAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiBD,QAAjB,EAA2B,uBAA3B;AACAG,UAAAA,OAAO;AACPrF,UAAAA,OAAO;AACR,SAdG,CAAJ;AAeD,OAnBM,CAAP;AAoBD,KA9BI;AA+BLsF,IAAAA,gBAAgB,EAAG9C,WAAD,IAChB2B,kBAAkB,CAACnT,GAAnB,CAAuBwR,WAAvB,CAhCG;AAiCL+B,IAAAA,iBAjCK;AAkCLgB,IAAAA,YAAY,EAAGlO,cAAD,IACZ+M,qBAAqB,CAACpT,GAAtB,CAA0BqG,cAA1B,CAnCG;AAoCLqN,IAAAA,oBApCK;AAsCLc,IAAAA,gBAAgB,EAAGhD,WAAD,IAChB8B,kBAAkB,CAACtT,GAAnB,CAAuBwR,WAAvB,KAAuC,EAvCpC;AAyCLiD,IAAAA,iBAAiB,EAAE,MAAOC,MAAP,IAAsD;AACvE,UAAItG,WAAW,CAAC5E,IAAZ,KAAqB,cAAzB,EAAyC;AACvC,cAAM,IAAI1M,KAAJ,CACH,yBAAwBsR,WAAW,CAAC5E,IAAK,yBADtC,CAAN;AAGD;;AACD,YAAMmL,MAAM,GAAG,MAAM3B,UAAU,CAAC/K,WAAX,CAAuBsB,UAAvB,CAAkCoL,MAAlC,CAEnB;AACA,kBAAUnF,OAAO,CAAC3G,GADlB;AAEA,oBAAY6L;AAFZ,OAFmB,CAArB;AAMA,YAAMC,MAAM,CAACC,KAAP,CAAa,GAAb,CAAN;AACA,YAAMrL,UAAU,GAAG,MAAMoL,MAAM,CAACE,OAAP,EAAzB;AACA,aAAOtL,UAAU,CAACvH,GAAX,CAAgBqH,MAAD,IAAYA,MAAM,CAACrI,IAAlC,CAAP;AACD,KAxDI;AA0DL8T,IAAAA,iBAAiB,EAAE,CACjBC,aADiB,EAEjBC,WAFiB,EAGjB;AAAEC,MAAAA,qBAAF;AAAyBC,MAAAA;AAAzB,KAHiB,KAIL;AACZ,UACE,CAACH,aAAD,IACA,CAACC,WAAW,CAACG,mBADb,IAEA,CAACH,WAAW,CAACI,eAHf,EAIE;AACA,eAAO,KAAP;AACD;;AAED,YAAMC,uBAAuB,GAAG,CAC9B,GAAG,IAAI5B,GAAJ,CAAQ,CACT,GAAGF,iBAAiB,CACjByB,WAAW,CAACG,mBAAb,CAAiGnT,GAAjG,CACGsT,OAAD,IAAaA,OAAO,CAAClU,KADvB,CADkB,CADX,EAMT,IAAI,CAAC4T,WAAW,CAACI,eAAb,GACA,EADA,GAEA1B,oBAAoB,CACjBsB,WAAW,CAACI,eAAb,CAAyFpT,GAAzF,CACGgI,IAAD,IAAUA,IAAI,CAAC3G,IADjB,CADkB,CAFxB,CANS,CAAR,CAD2B,CAAhC,CATY;;AA2BZ,UACE4R,qBAAqB,IACrBI,uBAAuB,CAACxE,QAAxB,CAAiCkE,aAAjC,CAFF,EAGE;AACA,eAAO,IAAP;AACD,OAhCW;;;AAmCZ,UAAI7S,MAAM,CAACe,aAAP,IAAwBiS,qBAA5B,EAAmD;AACjD,cAAMjS,aAAa,GAAGf,MAAM,CAACe,aAA7B;AACA,eAAOoS,uBAAuB,CAACE,IAAxB,CAA8BC,KAAD,IAClCvS,aAAa,CAAC8R,aAAD,CAAb,CAA6BlE,QAA7B,CAAsC2E,KAAtC,CADK,CAAP;AAGD;;AAED,aAAO,KAAP;AACD,KAzGI;AA2GL9E,IAAAA,KAAK,EAAE,MAAMwC;AA3GR,GAAP;AA6GD,CA1KD;;AA4KA,MAAMuC,sBAAsB,GAAG,IAAIlO,GAAJ,EAA/B;AACA,MAAMmO,eAAe,GAAG,IAAInO,GAAJ,EAAxB;AAEO,MAAMoO,oBAAoB,GAAG,CAClC3C,UADkC,EAElCzD,OAFkC,EAGlCrN,MAHkC,EAIlCkM,WAJkC,KAKN;AAC5B,QAAMwH,sBAAsB,GAAGF,eAAe,CAAC1V,GAAhB,CAAoBoO,WAAW,CAAChN,KAAhC,CAA/B;AACA,MAAIwU,sBAAJ,EAA4B,OAAOA,sBAAP;AAE5B,QAAMC,eAAe,GAAGJ,sBAAsB,CAACzV,GAAvB,CAA2BoO,WAAW,CAAChN,KAAvC,CAAxB;AACA,MAAIyU,eAAJ,EAAqB,OAAO1M,OAAO,CAAC6F,OAAR,CAAgB6G,eAAhB,CAAP;AAErB,QAAMC,OAAO,GAAG/C,kBAAkB,CAACC,UAAD,EAAazD,OAAb,EAAsBrN,MAAtB,EAA8BkM,WAA9B,CAAlC;AACAqH,EAAAA,sBAAsB,CAAC1N,GAAvB,CAA2BqG,WAAW,CAAChN,KAAvC,EAA8C0U,OAA9C;AAEA,SAAOA,OAAO,CAACC,IAAR,CAAcC,cAAD,IAAoB;AACtCP,IAAAA,sBAAsB,CAAC/C,MAAvB,CAA8BtE,WAAW,CAAChN,KAA1C;AACAsU,IAAAA,eAAe,CAAC3N,GAAhB,CAAoBqG,WAAW,CAAChN,KAAhC,EAAuC4U,cAAvC;AACA,WAAOA,cAAP;AACD,GAJM,CAAP;AAKD,CApBM;;ACtNA,MAAMC,gBAAgB,GAAG,OAG9BjD,UAH8B,EAI9BzD,OAJ8B,EAK9ByE,QAL8B,KAMZ;AAClB,QAAM/R,GAAG,GAAGsN,OAAO,CAAC0D,OAAR,CAAgBiD,YAA5B;AACA,MAAI,CAACjU,GAAL,EAAU;AACV,QAAMC,MAAM,GAAGgF,cAAc,CAACjF,GAAG,CAACb,KAAL,CAAd,IAA6BsG,QAA5C;AACA,QAAMsO,cAAc,GAAG,MAAML,oBAAoB,CAC/C3C,UAD+C,EAE/CzD,OAF+C,EAG/CrN,MAH+C,EAI/C,EAAE,GAAGD,GAAL;AAAUuH,IAAAA,IAAI,EAAE;AAAhB,GAJ+C,CAAjD;AAMA,MAAI,CAACwM,cAAL,EAAqB;AAErB,SAAOA,cAAc,CAACpC,IAAf,CAAoB,YAAY;AACrC,UAAMI,QAAQ,CAACzE,OAAD,EAAUyG,cAAV,CAAd;AACD,GAFM,CAAP;AAGD,CArBM;AAuBA,MAAMG,sBAAsB,GAAG,CAGpCnD,UAHoC,EAIpCgB,QAJoC,KAKhCzE,OAAD,IAAyB;AAC5B,SAAO0G,gBAAgB,CAACjD,UAAD,EAAazD,OAAb,EAAsByE,QAAtB,CAAvB;AACD,CAPM;;AC3BA,MAAMoC,OAAsB,GAAG,CACpC,WADoC,EAEpC,qBAFoC,EAGpC,kBAHoC,CAA/B;AAKA,MAAMC,cAGV,GAAGD,OAAO,CAACpU,GAAR,CAAasU,MAAD,KAAa;AAC7BvK,EAAAA,GAAG,EAAEuK,MADwB;AAE7BC,EAAAA,MAAM,EAAE,IAAIC,MAAJ,CAAY,mCAAkCF,MAAO,MAArD;AAFqB,CAAb,CAAZ,CAHC;AAeA,MAAMG,mBAAoC,GAAG,CAClD;AACE1K,EAAAA,GAAG,EAAE,WADP;AAEE2K,EAAAA,QAAQ,EAAE,iBAFZ;AAGEjQ,EAAAA,WAAW,EACT;AAJJ,CADkD,EAOlD;AACEsF,EAAAA,GAAG,EAAE,qBADP;AAEE2K,EAAAA,QAAQ,EAAE,eAFZ;AAGEjQ,EAAAA,WAAW,EACT;AAJJ,CAPkD,EAalD;AACEsF,EAAAA,GAAG,EAAE,kBADP;AAEE4K,EAAAA,IAAI,EAAE,WAFR;AAGElQ,EAAAA,WAAW,EAAE;AAHf,CAbkD,CAA7C;;ACtBA,MAAMmQ,YAAY,GAAG,CAC1BC,OAD0B,EAE1BC,cAF0B,KAGd;AACZ,SAAOT,cAAc,CAAC1G,MAAf,CAA2B,CAACC,GAAD,EAAM;AAAE7D,IAAAA,GAAF;AAAOwK,IAAAA;AAAP,GAAN,KAA0B;AAC1D,UAAMlS,KAAK,GAAGkS,MAAM,CAAC3H,IAAP,CAAYiI,OAAZ,CAAd;AACAjH,IAAAA,GAAG,CAAC7D,GAAD,CAAH,GAAW,CAAC1H,KAAD,GACPyS,cAAc,CAAC/K,GAAD,CAAd,IAAuB,KADhB,GAEP1H,KAAK,CAAC,CAAD,CAAL,KAAa,GAAb,IAAoBA,KAAK,CAAC,CAAD,CAAL,KAAa,GAFrC;AAGA,WAAOuL,GAAP;AACD,GANM,EAMJ,EANI,CAAP;AAOD,CAXM;AAaA,MAAMmH,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;AACLV,IAAAA,OAAO,EAAEQ,YAAY,CAACC,OAAD,EAAUC,cAAV,CADhB;AAELE,IAAAA,WAAW,EAAED,gBAAgB,CAACF,OAAD;AAFxB,GAAP;AAID,CARM;;ACjCQ,SAASO,YAAT,CACbC,QADa,EAEbC,KAFa,EAGJ;AACT,MAAI,CAACA,KAAL,EAAY,OAAO,KAAP;AACZ,SAAOD,QAAQ,CAAC9B,IAAT,CAAegC,CAAD,IAAgBA,CAAC,CAACpa,EAAF,KAASma,KAAK,CAACna,EAA7C,CAAP;AACD;;ACGD,MAAMqa,uBAAuB,GAAG,OAC9BC,EAD8B,EAE9BlI,OAF8B,KAGT;AACrB,QAAMmI,MAAM,GAAG,MAAMnI,OAAO,CAAC9G,OAAR,CAAgBiP,MAAhB,CAAuBC,UAAvB,CACnBpI,OAAO,CAACvC,IAAR,CAAa;AACX4K,IAAAA,GAAG,EAAEH,EAAE,CAACI,IAAH,CAAQC,GADF;AAEX/K,IAAAA,QAAQ,EAAE;AAFC,GAAb,CADmB,CAArB;AAOA,QAAMgL,YAAY,GAAGL,MAAM,CAACvW,IAAP,CAAY6W,UAAZ,CAAuB3N,MAAvB,CAClB4N,KAAD,IAAWA,KAAK,CAACC,UAAN,KAAqB,SADb,CAArB;;AAIA,MAAIH,YAAY,CAAC7K,MAAb,GAAsB,CAA1B,EAA6B;AAC3BqC,IAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CACE;AACEuD,MAAAA,MAAM,EAAEK,YAAY,CAAC/V,GAAb,CAAkBiW,KAAD,IAAWA,KAAK,CAAC5U,IAAlC;AADV,KADF,EAIG,2CAA0CoU,EAAE,CAACta,EAAG,EAJnD;AAMA,WAAO,IAAP;AACD;;AAED,QAAMgb,cAAc,GAAG,MAAM5I,OAAO,CAAC9G,OAAR,CAAgBqE,KAAhB,CAAsBsL,uBAAtB,CAC3B7I,OAAO,CAACvC,IAAR,CAAa;AACX4K,IAAAA,GAAG,EAAEH,EAAE,CAACI,IAAH,CAAQC,GADF;AAEX/K,IAAAA,QAAQ,EAAE;AAFC,GAAb,CAD2B,CAA7B;;AAOA,MAAIoL,cAAc,CAAChX,IAAf,CAAoBkX,KAApB,KAA8B,SAAlC,EAA6C;AAC3C,UAAMC,cAAc,GAAGH,cAAc,CAAChX,IAAf,CAAoBoX,QAApB,CAA6BlO,MAA7B,CACpBlG,MAAD,IAAYA,MAAM,CAACkU,KAAP,KAAiB,SAAjB,IAA8BlU,MAAM,CAACkU,KAAP,KAAiB,OADtC,CAAvB;AAIA9I,IAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CACE;AACEoE,MAAAA,QAAQ,EAAED,cAAc,CAACtW,GAAf,CAAoBmC,MAAD,IAAYA,MAAM,CAACoL,OAAtC;AADZ,KADF,EAIG,4CAA2CkI,EAAE,CAACta,EAAG,EAJpD;AAOA,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD,CAhDD;;AAkDO,MAAMqb,mBAAmB,GAAG,OACjCxD,WADiC,EAEjCzF,OAFiC,EAGjCkJ,WAHiC,EAIjCC,mBAJiC,EAKjCrB,QAA2B,GAAGrC,WAAW,CAAC7R,MALT,KAMZ;AACrB,MAAIuV,mBAAmB,KAAK,IAA5B,EAAkC,OAAO,KAAP;AAElC,QAAMC,cAAc,GAAGF,WAAW,CAACtV,MAAZ,CAAmB,iBAAnB,CAAvB;;AAEA,MAAI,CAACiU,YAAY,CAACC,QAAD,EAAWsB,cAAX,CAAjB,EAA6C;AAC3CF,IAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,oBAHF;AAKA,WAAO,KAAP;AACD;;AAED,QAAMC,YAAY,GAAG9D,WAAW,CAAC6C,IAAZ,CAAiBD,GAAjB,CAAqBlJ,UAArB,CAAgC,WAAhC,CAArB;;AAEA,QAAMqK,uBAAuB,GAAG,OAAO;AACrC5b,IAAAA,EAAE,EAAE6X,WAAW,CAAC7X,EADqB;AAErC0b,IAAAA,MAAM,EAAE7D,WAAW,CAAC6D,MAFiB;AAGrCG,IAAAA,MAAM,EAAEhE,WAAW,CAAC6C,IAAZ,CAAiBD;AAHY,GAAP,CAAhC;;AAMA,MAAI5C,WAAW,CAACqD,KAAZ,KAAsB,MAA1B,EAAkC;AAChCI,IAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,kBAHF;AAKA,WAAO,KAAP;AACD;;AAED,QAAMI,MAAM,GAAG,CACbzP,IADa,EAEb0P,MAFa,KAGJ;AACT,UAAMC,YAAY,GAAGnE,WAAW,CAAC6C,IAAZ,CAAiB7K,IAAjB,CAAsBoM,SAA3C;AACA7J,IAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAkB,cAAagF,YAAa,IAAGnE,WAAW,CAAC7X,EAAG,IAAGqM,IAAK,EAAtE;AACAiP,IAAAA,WAAW,CAACzF,UAAZ,CAAuB/K,WAAvB,CAAmCoR,aAAnC,CAAiDC,SAAjD,CAA2D;AACzD9J,MAAAA,OAAO,EAAEiJ,WAAW,CAAC3E,YADoC;AAEzDqF,MAAAA,YAFyD;AAGzD1B,MAAAA,EAAE,EAAE;AACFta,QAAAA,EAAE,EAAE6X,WAAW,CAAC7X,EADd;AAEF0b,QAAAA,MAAM,EAAE7D,WAAW,CAAC6D,MAFlB;AAGFU,QAAAA,UAAU,EAAET,YAHV;AAIFU,QAAAA,cAAc,EAAExE,WAAW,CAACyE;AAJ1B,OAHqD;AASzDjQ,MAAAA,IATyD;AAUzD0P,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,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,iBAHF;AAKA,WAAO,KAAP;AACD;;AAED,MACE7D,WAAW,CAACG,mBAAZ,IACAH,WAAW,CAACG,mBAAZ,CAAgCjI,MAAhC,GAAyC,CAF3C,EAGE;AACAuL,IAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,+BAHF;AAKA,WAAO,KAAP;AACD;;AAED,MAAI7D,WAAW,CAACI,eAAZ,IAA+BJ,WAAW,CAACI,eAAZ,CAA4BlI,MAA5B,GAAqC,CAAxE,EAA2E;AACzEuL,IAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,2BAHF;AAKA,WAAO,KAAP;AACD;;AAED,QAAMe,QAAQ,GAAGnB,WAAW,CAACoB,gBAAZ,EAAjB;;AACA,MAAID,QAAQ,IAAIE,MAAM,CAACF,QAAQ,CAACf,MAAV,CAAN,KAA4BiB,MAAM,CAAC9E,WAAW,CAAC6D,MAAb,CAAlD,EAAwE;AACtEtJ,IAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CACE;AACE4F,MAAAA,IAAI,EAAE/E,WAAW,CAAC7X,EADpB;AAEE6c,MAAAA,QAAQ,EAAEhF,WAAW,CAAC6D,MAFxB;AAGEoB,MAAAA,cAAc,EAAEL,QAAQ,CAACf;AAH3B,KADF,EAME,mCANF;AAQAJ,IAAAA,WAAW,CAACyB,kBAAZ,CAA+BnB,uBAAuB,EAAtD;AACA,WAAO,KAAP;AACD;;AAEDN,EAAAA,WAAW,CAAC0B,cAAZ,CAA2BpB,uBAAuB,EAAlD;;AAEA,MAAI/D,WAAW,CAACoF,SAAZ,IAAyB,IAA7B,EAAmC;AACjC,UAAMC,QAAQ,GAAG,MAAM9K,OAAO,CAAC9G,OAAR,CAAgB6R,KAAhB,CAAsBta,GAAtB,CACrBuP,OAAO,CAACvC,IAAR,CAAa;AACXuN,MAAAA,WAAW,EAAEvF,WAAW,CAAC6D;AADd,KAAb,CADqB,CAAvB;AAKA7D,IAAAA,WAAW,GAAGqF,QAAQ,CAAClZ,IAAvB;AACD;;AAED,MAAI6T,WAAW,CAACwF,MAAhB,EAAwB;AACtBvB,IAAAA,MAAM,CAAC,gBAAD,EAAmB,QAAnB,CAAN;AACAR,IAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,mBAHF;AAKA,WAAO,KAAP;AACD;;AAEDtJ,EAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CACG,eAAca,WAAW,CAAC7X,EAAG,MAAK6X,WAAW,CAAC6D,MAAO,eAAc7D,WAAW,CAACoF,SAAU,UAASpF,WAAW,CAACyE,eAAgB,EADjI,EAvHqB;;AA4HrB,MACE,EACEzE,WAAW,CAACyE,eAAZ,KAAgC,OAAhC,IACAzE,WAAW,CAACyE,eAAZ,KAAgC,WADhC,IAEAzE,WAAW,CAACyE,eAAZ,KAAgC,UAHlC,CADF,EAME;AACA,QACE,CAACzE,WAAW,CAACyE,eAAb,IACAzE,WAAW,CAACyE,eAAZ,KAAgC,SAFlC,EAGE;AACAR,MAAAA,MAAM,CAAC,yBAAD,EAA4B,YAA5B,CAAN,CADA;;AAGAR,MAAAA,WAAW,CAACgC,UAAZ,CAAuBlL,OAAvB,EAAgCwJ,uBAAuB,EAAvD;AACA,aAAO,KAAP;AACD;;AAED,QAAID,YAAJ,EAAkB;AAChB,UACE9D,WAAW,CAACyE,eAAZ,KAAgC,QAAhC,IACAzE,WAAW,CAACyE,eAAZ,KAAgC,OAFlC,EAGE;AACAR,QAAAA,MAAM,CAAC,iBAAD,EAAoB,MAApB,CAAN,CADA;;AAIA,YACEjE,WAAW,CAAC5I,IAAZ,IACA4I,WAAW,CAAC5I,IAAZ,CAAiByE,QAAjB,CAA0B,uBAA1B,CAFF,EAGE;AACA,cAAImE,WAAW,CAAC5I,IAAZ,CAAiByE,QAAjB,CAA0B,2BAA1B,CAAJ,EAA4D;AAC1D,mBAAO,KAAP;AACD;;AAED,gBAAM6J,kBAAkB,GAAG1F,WAAW,CAAC5I,IAAZ,CAAiB6K,OAAjB,CACzB,2BADyB,EAEzB,2BAFyB,CAA3B;AAIA,gBAAM1H,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuBlI,MAAvB,CACJlD,OAAO,CAACvC,IAAR,CAAa;AACX4N,YAAAA,YAAY,EAAE5F,WAAW,CAAC6D,MADf;AAEXzM,YAAAA,IAAI,EAAEsO;AAFK,WAAb,CADI,CAAN;AAMD,SAlBD,MAkBO,IAAI,CAAC1F,WAAW,CAACrX,KAAZ,CAAkB+Q,UAAlB,CAA6B,SAA7B,CAAL,EAA8C;AACnD,gBAAMa,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuBlI,MAAvB,CACJlD,OAAO,CAACvC,IAAR,CAAa;AACX4N,YAAAA,YAAY,EAAE5F,WAAW,CAAC6D,MADf;AAEXlb,YAAAA,KAAK,EAAG,UAASqX,WAAW,CAACrX,KAAM;AAFxB,WAAb,CADI,CAAN;AAMD;;AACD,eAAO,KAAP;AACD;;AAED,UAAI,MAAM6Z,uBAAuB,CAACxC,WAAD,EAAczF,OAAd,CAAjC,EAAyD;AACvD0J,QAAAA,MAAM,CAAC,yBAAD,EAA4B,QAA5B,CAAN;AACAR,QAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,yBAHF;AAKA,eAAO,KAAP;AACD,OARD,MAQO,IAAI7D,WAAW,CAACyE,eAAZ,KAAgC,SAApC,EAA+C;AACpDR,QAAAA,MAAM,CAAC,yBAAD,EAA4B,MAA5B,CAAN,CADoD;;AAGpD,eAAO,KAAP;AACD;;AAED1J,MAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CACG,yDAAwDa,WAAW,CAACyE,eAAgB,EADvF;AAGA,aAAO,KAAP;AACD;;AAED,QAAIzE,WAAW,CAACyE,eAAZ,KAAgC,SAApC,EAA+C;AAC7C,UAAI,MAAMjC,uBAAuB,CAACxC,WAAD,EAAczF,OAAd,CAAjC,EAAyD;AACvD0J,QAAAA,MAAM,CAAC,yBAAD,EAA4B,QAA5B,CAAN;AACAR,QAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,yBAHF;AAKA,eAAO,KAAP;AACD,OARD,MAQO;AACLI,QAAAA,MAAM,CAAC,yBAAD,EAA4B,MAA5B,CAAN,CADK;;AAGL,eAAO,KAAP;AACD;AACF;;AAED,QAAIjE,WAAW,CAACyE,eAAZ,KAAgC,QAApC,EAA8C;AAC5CR,MAAAA,MAAM,CAAC,wBAAD,EAA2B,eAA3B,CAAN;AACA1J,MAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CACE;AACE0D,QAAAA,IAAI,EAAE7C,WAAW,CAAC6C,IAAZ,CAAiBD,GADzB;AAEEiD,QAAAA,IAAI,EAAE7F,WAAW,CAAC6F,IAAZ,CAAiBjD;AAFzB,OADF,EAKE,uCALF;AAQA,YAAMrI,OAAO,CAAC9G,OAAR,CAAgBqE,KAAhB,CAAsBgO,KAAtB,CAA4B;AAChC7N,QAAAA,KAAK,EAAE+H,WAAW,CAAC6C,IAAZ,CAAiB7K,IAAjB,CAAsBC,KAAtB,CAA4B7L,KADH;AAEhC4L,QAAAA,IAAI,EAAEgI,WAAW,CAAC6C,IAAZ,CAAiB7K,IAAjB,CAAsB3J,IAFI;AAGhCwU,QAAAA,IAAI,EAAE7C,WAAW,CAAC6F,IAAZ,CAAiBjD,GAHS;AAIhCiD,QAAAA,IAAI,EAAE7F,WAAW,CAAC6C,IAAZ,CAAiBD;AAJS,OAA5B,CAAN;AAOA,aAAO,KAAP;AACD;;AAEDqB,IAAAA,MAAM,CAAC,eAAD,EAAkB,QAAlB,CAAN;AACAR,IAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGG,mBAAkB7D,WAAW,CAACyE,eAAgB,EAHjD;AAKAlK,IAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CACG,yDAAwDa,WAAW,CAACyE,eAAgB,EADvF;AAGA,WAAO,KAAP;AACD;;AAED,MAAI;AACFlK,IAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAkB,iBAAgBa,WAAW,CAAC6D,MAAO,EAArD;AAEA,UAAMkC,UAAU,GAAG5D,SAAS,CAC1BuB,mBAAmB,CAACsC,WADM,EAE1BvC,WAAW,CAACvW,MAAZ,CAAmBI,gBAFO,CAA5B;AAIA,UAAM8T,OAAO,GAAG,CAAA2E,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU,CAAE3E,OAAZ,KAAuBqC,WAAW,CAACvW,MAAZ,CAAmBI,gBAA1D;AAC+B;AAE/B,UAAM2Y,WAAW,GAAG,MAAM1L,OAAO,CAAC9G,OAAR,CAAgB6R,KAAhB,CAAsBQ,KAAtB,CAA4B;AACpDI,MAAAA,YAAY,EAA8B,QADU;AAEpDjO,MAAAA,KAAK,EAAE+H,WAAW,CAAC6C,IAAZ,CAAiB7K,IAAjB,CAAsBC,KAAtB,CAA4B7L,KAFiB;AAGpD4L,MAAAA,IAAI,EAAEgI,WAAW,CAAC6C,IAAZ,CAAiB7K,IAAjB,CAAsB3J,IAHwB;AAIpDkX,MAAAA,WAAW,EAAEvF,WAAW,CAAC6D,MAJ2B;AAKpDsC,MAAAA,YAAY,EAEP,GAAEnG,WAAW,CAACrX,KAAM,GACnByY,OAAO,CAAC5T,mBAAR,GAA8B,YAA9B,GAA6C,EAC9C,MAAKwS,WAAW,CAAC6D,MAAO,GATuB;AAUpDuC,MAAAA,cAAc,EAAgC,EAVM;;AAAA,KAA5B,CAA1B;AAYA7L,IAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CAAkBkJ,WAAW,CAAC9Z,IAA9B,EAAoC,eAApC;AACAsX,IAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,QAHF;AAKA,WAAOhP,OAAO,CAAC,YAAYoR,WAAW,CAAC9Z,IAAxB,IAAgC8Z,WAAW,CAAC9Z,IAAZ,CAAiBqZ,MAAlD,CAAd;AACD,GA7BD,CA6BE,OAAO7O,GAAP,EAAY;AACZ4D,IAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiB;AAAEkH,MAAAA,YAAY,EAAE1P,GAAG,CAACkG;AAApB,KAAjB,EAAgD,kBAAhD;AACA4G,IAAAA,WAAW,CAACgC,UAAZ,CAAuBlL,OAAvB,EAAgCwJ,uBAAuB,EAAvD;AACA,WAAO,KAAP;AACD;AACF,CA9RM;;ACzDA,MAAMuC,kBAAkB,GAAG,yCAA3B;;AAEP,MAAMC,iBAAiB,GAAG,CACxBC,QADwB,EAExBC,YAFwB,EAGxBrF,OAHwB,KAIb;AACX,SAAOK,mBAAmB,CACvBzU,GADI,CACA,CAAC;AAAE+J,IAAAA,GAAF;AAAO2K,IAAAA,QAAP;AAAiBjQ,IAAAA,WAAjB;AAA8BkQ,IAAAA,IAAI,EAAE+E;AAApC,GAAD,KAAqD;AACxD,UAAMC,cAAc,GAAI,IACtBvF,OAAO,CAACrK,GAAD,CAAP,GAAe,GAAf,GAAqB,GACtB,qBAAoBA,GAAI,MAFzB;AAIA,UAAM6P,gBAAgB,GAAGlF,QAAQ,IAAI+E,YAAY,CAAC/E,QAAD,CAAjD;AACA,UAAMmF,SAAS,GAAGD,gBAAgB,GAC7B,IAAGA,gBAAgB,CAACvY,IAAK,KAAImY,QAAS,WAAUM,kBAAkB,CACjEF,gBAAgB,CAACvY,IADgD,CAEjE,KAH4B,GAI9B,EAJJ;AAKA,UAAMsT,IAAI,GAAGkF,SAAS,IAAI,CAACH,SAAd,GAA0B,EAA1B,GAAgC,GAAEA,SAAU,GAAzD;AAEA,WAAQ,KAAIC,cAAe,GAAEhF,IAAK,GAAEkF,SAAU,GAAEpV,WAAY,EAA5D;AACD,GAfI,EAgBJsV,IAhBI,CAgBC,IAhBD,CAAP;AAiBD,CAtBD;;AAwBA,MAAMC,eAAe,GAAIC,KAAD,IAAiC;AACvD,SAAOA,KAAK,CACTja,GADI,CACCmS,IAAD,IAAU;AACb,QAAIA,IAAI,CAAC3P,GAAT,EAAc,OAAQ,IAAG2P,IAAI,CAACxW,KAAM,KAAIwW,IAAI,CAAC3P,GAAI,GAAnC;AACd,WAAO2P,IAAI,CAACxW,KAAZ;AACD,GAJI,EAKJoe,IALI,CAKC,IALD,CAAP;AAMD,CAPD;;AAcA,MAAMG,cAAc,GAAID,KAAD,IAAkC;AACvD,MAAI,CAACA,KAAL,EAAY,OAAO,MAAP;AACZ,SAAOA,KAAK,CAAC/O,MAAN,GAAe,CAAf,GACF,kBAAiB8O,eAAe,CAACC,KAAD,CAAQ,QADtC,GAEH,IAFJ;AAGD,CALD;;AAOA,MAAME,aAAa,GAAG,CACpB/F,OADoB,EAEpBgG,eAFoB,KAGR;AACZ,MAAI,CAACA,eAAL,EAAsB,OAAOhG,OAAP;AACtB,SAAO,EAAE,GAAGA,OAAL;AAAc,OAAGgG;AAAjB,GAAP;AACD,CAND;;AAQA,MAAMC,iCAAiC,GAAG,CACxCb,QADwC,EAExCC,YAFwC,EAGxCrP,IAHwC,EAIxCgK,OAJwC,EAKxC6F,KALwC,KAM7B;AACX,QAAMK,4BAA4B,GAAGlQ,IAAI,CAAC6K,OAAL;AAEnC,sEAFmC,EAGnCiF,cAAc,CAACD,KAAD,CAHqB,CAArC;AAMA,SAAQ,GAAEK,4BAA6B,kBAAiBf,iBAAiB,CACvEC,QADuE,EAEvEC,YAFuE,EAGvErF,OAHuE,CAIvE,EAJF;AAKD,CAlBD;;AAoBO,MAAMmG,iBAAiB,GAAG,CAC/Bf,QAD+B,EAE/BC,YAF+B,EAG/B3E,cAH+B,EAI/BmF,KAJ+B,KAKpB;AACX,SAAOI,iCAAiC,CACtCb,QADsC,EAEtCC,YAFsC,EAGtC,EAHsC,EAItC3E,cAJsC,EAKtCmF,KALsC,CAAxC;AAOD,CAbM;AAeA,MAAMO,oBAAoB,GAAG,CAClChB,QADkC,EAElCC,YAFkC,EAGlCT,WAHkC,EAIlClE,cAJkC,EAKlCsF,eALkC,KAMP;AAC3B,QAAMhG,OAAO,GAAGQ,YAAY,CAACoE,WAAD,EAAclE,cAAd,CAA5B;AACA,QAAM2F,cAAc,GAAGN,aAAa,CAAC/F,OAAD,EAAUgG,eAAV,CAApC;AAEA,SAAO;AACLhG,IAAAA,OAAO,EAAEqG,cADJ;AAELzB,IAAAA,WAAW,EAAEqB,iCAAiC,CAC5Cb,QAD4C,EAE5CC,YAF4C,EAG5CT,WAH4C,EAI5CyB,cAJ4C;AAFzC,GAAP;AASD,CAnBM;AAqBA,MAAMC,sBAAsB,GAAG,CACpC1B,WADoC,EAEpCiB,KAFoC,KAGzB;AACX,SAAOjB,WAAW,CAAC/D,OAAZ;AAEL;AACA;AACA,4EAJK,EAKJ,GAAEiF,cAAc,CAACD,KAAD,CAAQ,IALpB,CAAP;AAOD,CAXM;AAaA,MAAMU,6BAA6B,GAAG,CAC3C3B,WAD2C,EAE3ChE,WAF2C,KAGhC;AACX,SAAOgE,WAAW,CAAC/D,OAAZ;AAEL,+CAFK,EAGL,CAACD,WAAD,GAAe,IAAf,GAAuB,0BAAyBA,WAAY,QAHvD,CAAP;AAKD,CATM;AAWA,MAAM4F,kCAAkC,GAC7CC,MADgD,IAErC;AACX,MAAI,CAACA,MAAL,EAAa,OAAO,EAAP;AACb,SAAOA,MAAM,CAAC5F,OAAP,CACL,qGADK,EAEL,MAFK,CAAP;AAID,CARM;;ACxIA,MAAM6F,uBAAuB,GAAG,CACrCC,iBADqC,EAErCxN,OAFqC,EAGrCnD,IAHqC,KAMlC;AACH,SAAOmD,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CACJqC,aADI,CACUzN,OAAO,CAACvC,IAAR,CAAa;AAAE4N,IAAAA,YAAY,EAAEmC,iBAAhB;AAAmC3Q,IAAAA;AAAnC,GAAb,CADV,EAEJ2J,IAFI,CAEC,CAAC;AAAE5U,IAAAA;AAAF,GAAD,KAAcA,IAFf,CAAP;AAGD,CAVM;AAYA,MAAM8b,wBAAwB,GAAG,CACtCF,iBADsC,EAEtCxN,OAFsC,EAGtC2N,SAHsC,KAMnC;AACH,SAAO3N,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CACJwC,UADI,CAEH5N,OAAO,CAACvC,IAAR,CAAa;AACX4N,IAAAA,YAAY,EAAEmC,iBADH;AAEXK,IAAAA,UAAU,EAAEF;AAFD,GAAb,CAFG,EAOJnH,IAPI,CAQH,CAAC;AAAE5U,IAAAA;AAAF,GAAD,KAAcA,IARX,EASH,MAAM,IATH,CAAP;AAWD,CAlBM;;ACGA,MAAMkc,sBAAsB,GAAG,OACpCN,iBADoC,EAEpCxN,OAFoC,EAGpCkJ,WAHoC,EAIpC6E,wBAJoC,KAKH;AACjC,QAAMtK,UAAU,GAAGyF,WAAW,CAACzF,UAA/B;AACA,QAAMuK,OAAO,GAAG;AAAE1E,IAAAA,MAAM,EAAEkE;AAAV,GAAhB;;AAEA,MAAIO,wBAAJ,EAA8B;AAC5B,UAAME,OAAO,GAAG,MAAMF,wBAAtB;AACA,UAAMG,YAAY,GAAG,MAAMzK,UAAU,CAAC/K,WAAX,CAAuByV,GAAvB,CAA2BpE,SAA3B,CAAqC;AAC9D9J,MAAAA,OAAO,EAAEiJ,WAAW,CAAC3E,YADyC;AAE9D9G,MAAAA,IAAI,EAAEyL,WAAW,CAACkF,SAF4C;AAG9DlG,MAAAA,EAAE,EAAE8F,OAH0D;AAI9DL,MAAAA,SAAS,EAAEM,OAAO,CAACrgB;AAJ2C,KAArC,CAA3B;AAMA,WAAO;AAAEsgB,MAAAA,YAAF;AAAgBzC,MAAAA,WAAW,EAAEwC,OAAO,CAACpR;AAArC,KAAP;AACD;;AAED,QAAMwR,QAAQ,GAAG,MAAM5K,UAAU,CAAC/K,WAAX,CAAuByV,GAAvB,CAA2BpV,OAA3B,CAAmC;AACxD,kBAAcmQ,WAAW,CAAC3E,YAAZ,CAAyB3W,EADiB;AAExD,eAAWsb,WAAW,CAACkF,SAAZ,CAAsBxgB,EAFuB;AAGxD,iBAAa4f;AAH2C,GAAnC,CAAvB;AAKA,QAAMS,OAAO,GACXI,QAAQ,KACP,MAAMX,wBAAwB,CAC7BF,iBAD6B,EAE7BxN,OAF6B,EAG7BqO,QAAQ,CAACV,SAHoB,CADvB,CADV;;AAQA,MAAI,CAACM,OAAD,IAAY,CAACI,QAAjB,EAA2B;AACzB,UAAMJ,OAAO,GAAG,MAAMV,uBAAuB,CAC3CC,iBAD2C,EAE3CxN,OAF2C,EAG3C+L,kBAH2C,CAA7C;;AAMA,QAAI,CAACsC,QAAL,EAAe;AACb,YAAMH,YAAY,GAAG,MAAMzK,UAAU,CAAC/K,WAAX,CAAuByV,GAAvB,CAA2BpE,SAA3B,CAAqC;AAC9D9J,QAAAA,OAAO,EAAEiJ,WAAW,CAAC3E,YADyC;AAE9D9G,QAAAA,IAAI,EAAEyL,WAAW,CAACkF,SAF4C;AAG9DlG,QAAAA,EAAE,EAAE8F,OAH0D;AAI9DL,QAAAA,SAAS,EAAEM,OAAO,CAACrgB;AAJ2C,OAArC,CAA3B;AAMA,aAAO;AAAEsgB,QAAAA,YAAF;AAAgBzC,QAAAA,WAAW,EAAEwC,OAAO,CAACpR;AAArC,OAAP;AACD,KARD,MAQO;AACL,YAAM4G,UAAU,CAAC/K,WAAX,CAAuByV,GAAvB,CAA2BG,kBAA3B,CAA8CD,QAAQ,CAAC/U,GAAvD,EAA4D;AAChE0D,QAAAA,IAAI,EAAE;AAAE2Q,UAAAA,SAAS,EAAEM,OAAO,CAACrgB;AAArB;AAD0D,OAA5D,CAAN;AAGD;AACF;;AAED,SAAO;AAAEsgB,IAAAA,YAAY,EAAEG,QAAhB;AAA0B5C,IAAAA,WAAW,EAAEwC,OAAO,CAAEpR;AAAhD,GAAP;AACD,CAxDM;;AChBA,MAAM0R,OAAO,GAAG,OACrBvO,OADqB,EAErByK,QAFqB,KAGoD;AACzE,QAAMK,QAAQ,GAAG,MAAM9K,OAAO,CAAC9G,OAAR,CAAgB6R,KAAhB,CAAsBta,GAAtB,CACrBuP,OAAO,CAACvC,IAAR,CAAa;AAAEuN,IAAAA,WAAW,EAAEP;AAAf,GAAb,CADqB,CAAvB;AAIA,SAAOK,QAAQ,CAAClZ,IAAhB;AACD,CATM;;ACeA,MAAM4c,gBAAgB,GAAG,OAC9BxO,OAD8B,KAI3B;AACH,QAAM;AAAEpO,IAAAA,IAAI,EAAEgC;AAAR,MAAmB,MAAMoM,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuBqD,iBAAvB,CAC7BzO,OAAO,CAACvC,IAAR,CAAa;AAAED,IAAAA,QAAQ,EAAE;AAAZ,GAAb,CAD6B,CAA/B;AAGA,SAAO5J,MAAP;AACD,CATM;AAWA,MAAM8a,cAAc,GAAG,OAC5B1O,OAD4B,EAE5BrN,MAF4B,KAGF;AAC1B,QAAMiB,MAAM,GAAG,MAAM4a,gBAAgB,CAACxO,OAAD,CAArC;AACA,QAAM2O,WAA0C,GAAG,EAAnD;;AAEA,OAAK,MAAM,CAACxH,QAAD,EAAWyH,WAAX,CAAX,IAAsCtS,MAAM,CAACC,OAAP,CAAe5J,MAAM,CAACiB,MAAP,CAAcC,IAA7B,CAAtC,EAA0E;AACxE,UAAMgb,UAAU,GAAGD,WAAW,CAAC7a,KAAZ,CAAkBoO,KAAlB,CAAwB,CAAxB,CAAnB;AACA,UAAMjL,WAAW,GAAG0X,WAAW,CAAC1X,WAAZ,GACf,GAAE0X,WAAW,CAAC1X,WAAY,yBADX,GAEf,4BAA2BiQ,QAAS,EAFzC;AAIA,QAAI2H,aAAa,GAAGlb,MAAM,CAACgI,IAAP,CAAamM,KAAD,IAAWA,KAAK,CAACjU,IAAN,KAAe8a,WAAW,CAAC9a,IAAlD,CAApB;;AACA,QAAI,CAACgb,aAAL,EAAoB;AAClBA,MAAAA,aAAa,GAAGlb,MAAM,CAACgI,IAAP,CAAamM,KAAD,IAAWA,KAAK,CAAC7Q,WAAN,KAAsBA,WAA7C,CAAhB;AACD;;AACD,QAAI,CAAC4X,aAAL,EAAoB;AAClB,UAAI3H,QAAQ,KAAK,qBAAjB,EAAwC;AACtC2H,QAAAA,aAAa,GAAGlb,MAAM,CAACgI,IAAP,CACbmM,KAAD,IAAWA,KAAK,CAACjU,IAAN,KAAe,qBADZ,CAAhB;AAGD;;AACD,UAAIqT,QAAQ,KAAK,iBAAjB,EAAoC;AAClC2H,QAAAA,aAAa,GAAGlb,MAAM,CAACgI,IAAP,CACbmM,KAAD,IAAWA,KAAK,CAACjU,IAAN,KAAe,iBADZ,CAAhB;AAGD;;AACD,UAAIqT,QAAQ,KAAK,WAAjB,EAA8B;AAC5B2H,QAAAA,aAAa,GAAGlb,MAAM,CAACgI,IAAP,CAAamM,KAAD,IAAWA,KAAK,CAACjU,IAAN,KAAe,OAAtC,CAAhB;AACD;;AACD,UAAIqT,QAAQ,KAAK,eAAjB,EAAkC;AAChC2H,QAAAA,aAAa,GAAGlb,MAAM,CAACgI,IAAP,CACbmM,KAAD,IAAWA,KAAK,CAACjU,IAAN,KAAe,mBADZ,CAAhB;AAGD;AACF;;AAED,QAAI,CAACgb,aAAL,EAAoB;AAClB,YAAMzd,MAAM,GAAG,MAAM2O,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuB2D,WAAvB,CACnB/O,OAAO,CAACvC,IAAR,CAAa;AACX3J,QAAAA,IAAI,EAAE8a,WAAW,CAAC9a,IADP;AAEXC,QAAAA,KAAK,EAAE8a,UAFI;AAGX3X,QAAAA;AAHW,OAAb,CADmB,CAArB;AAOAyX,MAAAA,WAAW,CAACxH,QAAD,CAAX,GAAwB9V,MAAM,CAACO,IAA/B;AACD,KATD,MASO,IACLkd,aAAa,CAAChb,IAAd,KAAuB8a,WAAW,CAAC9a,IAAnC,IACAgb,aAAa,CAAC/a,KAAd,KAAwB8a,UADxB,IAEAC,aAAa,CAAC5X,WAAd,KAA8BA,WAHzB,EAIL;AACA8I,MAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CACE;AACEoK,QAAAA,YAAY,EAAEF,aAAa,CAAChb,IAD9B;AAEEA,QAAAA,IAAI,EAAEgb,aAAa,CAAChb,IAAd,KAAuB8a,WAAW,CAAC9a,IAAnC,IAA2C8a,WAAW,CAAC9a,IAF/D;AAGEC,QAAAA,KAAK,EAAE+a,aAAa,CAAC/a,KAAd,KAAwB8a,UAAxB,IAAsCA,UAH/C;AAIE3X,QAAAA,WAAW,EAAE4X,aAAa,CAAC5X,WAAd,KAA8BA,WAA9B,IAA6CA;AAJ5D,OADF,EAOE,uBAPF;AAUA,YAAM7F,MAAM,GAAG,MAAM2O,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuB6D,WAAvB,CACnBjP,OAAO,CAACvC,IAAR,CAAa;AACX3J,QAAAA,IAAI,EAAEgb,aAAa,CAAChb,IADT;AAEXob,QAAAA,QAAQ,EAAEN,WAAW,CAAC9a,IAFX;AAGXC,QAAAA,KAAK,EAAE8a,UAHI;AAIX3X,QAAAA;AAJW,OAAb,CADmB,CAArB;AAQAyX,MAAAA,WAAW,CAACxH,QAAD,CAAX,GAAwB9V,MAAM,CAACO,IAA/B;AACD,KAxBM,MAwBA;AACL+c,MAAAA,WAAW,CAACxH,QAAD,CAAX,GAAwB2H,aAAxB;AACD;AACF;;AAED,SAAOH,WAAP;AACD,CA7EM;;ACwCA,MAAMQ,gBAAgB,GAAG,CAC9BC,QAD8B,EAE9BlX,aAF8B,KAGlB;AACZ,QAAMmX,gBAAgB,GACpBnX,aAAa,CAACzD,iBAAd,IACA,IAAIwS,MAAJ,CAAY,IAAG/O,aAAa,CAACzD,iBAAkB,GAA/C,CAFF;;AAIA,MAAI2a,QAAQ,KAAK,iBAAjB,EAAoC;AAClC,WAAOhiB,OAAO,CAACC,GAAR,CAAYgB,eAAZ,KAAgC,gBAAvC;AACD;;AAED,MAAIghB,gBAAJ,EAAsB;AACpB,WAAOA,gBAAgB,CAACC,IAAjB,CAAsBF,QAAtB,CAAP;AACD;;AAED,SAAO,KAAP;AACD,CAjBM;;AAmBP,MAAMG,uBAAuB,GAAG,CAC9BC,YAD8B,EAE9B7c,MAF8B,EAG9B8c,gBAH8B,EAI9B7b,MAJ8B,KAKY;AAC1C,MAAI4b,YAAJ,EAAkB,OAAO,MAAqC,EAA5C;AAClB,SAAQrI,QAAD,IACLsI,gBAAgB,CACbhd,GADH,CACQ+J,GAAD,IAAS7J,MAAM,CAACiB,MAAP,CAAcI,MAAd,CAAqBwI,GAArB,EAA0B2K,QAA1B,CADhB,EAEGrM,MAFH,CAEUR,OAFV,EAGG7H,GAHH,CAGQqB,IAAD,IAAUF,MAAM,CAACE,IAAD,CAAN,CAAalG,EAH9B,CADF;AAKD,CAZD;;AAcA,eAAe8hB,eAAf,CACEjM,UADF,EAEEzD,OAFF,EAGErN,MAHF,EAIoC;AAClC,QAAM;AACJ/E,IAAAA,EADI;AAEJkG,IAAAA,IAFI;AAGJ+V,IAAAA,SAAS,EAAE8F,QAHP;AAIJjS,IAAAA,KAAK,EAAEhL,GAJH;AAKJwE,IAAAA;AALI,MAMF8I,OAAO,CAAC0D,OAAR,CAAgBpG,UANpB;AAOA,QAAMsS,SAAS,GAAG1Q,2BAA2B,CAAChI,WAAD,CAA7C;AAEA,QAAMuP,cAAc,GAAG,MAAML,oBAAoB,CAC/C3C,UAD+C,EAE/CzD,OAF+C,EAG/CrN,MAH+C,EAI/CD,GAJ+C,CAAjD;AAMA,QAAMwW,WAAW,GAAG5M,MAAM,CAAC5O,MAAP,CAAc+Y,cAAd,CAApB;AAEA,QAAM+I,YAAY,GAAGL,gBAAgB,CAACrb,IAAD,EAAOnB,MAAP,CAArC;AAEA,QAAMiB,MAAM,GAAG4b,YAAY,GAAG,EAAH,GAAQ,MAAMd,cAAc,CAAC1O,OAAD,EAAUrN,MAAV,CAAvD;AAEA,QAAM8c,gBAAgB,GAAGnT,MAAM,CAACyC,IAAP,CAAYpM,MAAM,CAACW,MAAnB,CAAzB;AACA,QAAMuc,iBAAiB,GAAGN,uBAAuB,CAC/CC,YAD+C,EAE/C7c,MAF+C,EAG/C8c,gBAH+C,EAI/C7b,MAJ+C,CAAjD;AAOA,QAAMkc,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,IAAInY,GAAJ,EAA3B;;AACA,MAAI,CAACwX,YAAL,EAAmB;AACjBC,IAAAA,gBAAgB,CAACzO,OAAjB,CAA0BxE,GAAD,IAAS;AAChC,YAAM4T,iBAAiB,GAAGzd,MAAM,CAACiB,MAAP,CAAcI,MAAd,CAAqBwI,GAArB,CAA1B;AACAF,MAAAA,MAAM,CAACyC,IAAP,CAAYqR,iBAAZ,EAA+BpP,OAA/B,CAAwCmG,QAAD,IAAsB;AAC3DgJ,QAAAA,kBAAkB,CAAC3X,GAAnB,CAAuB5E,MAAM,CAACwc,iBAAiB,CAACjJ,QAAD,CAAlB,CAAN,CAAoCvZ,EAA3D,EAA+D4O,GAA/D;AACD,OAFD;AAGD,KALD;AAMD,GAjDiC;;;AA4ElC,QAAM6H,MAAI,GAAGC,SAAI,EAAjB;AACA,MAAI+L,WAAJ;AACA,MAAIC,cAA+B,GAAG,EAAtC;;AAEA,QAAMC,MAAM,GAAG,CACbC,aADa,EAEb/F,QAFa,EAGbhG,QAHa,KAKb,IAAI7K,OAAJ,CAAY,CAAC6F,OAAD,EAAUiF,MAAV,KAAqB;AAC/B,UAAMC,QAAQ,GAAG;AACflH,MAAAA,IAAI,EAAEkS,QADS;AAEfa,MAAAA,aAFe;AAGf/F,MAAAA;AAHe,KAAjB;AAKAzK,IAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CAAkBmC,QAAlB,EAA4B,sBAA5B,EAN+B;;AAQ/BN,IAAAA,MAAI,CAACkG,MAAM,CAACE,QAAD,CAAP,EAAmB,MAAO5F,qBAAP,IAAiC;AACtD,YAAMC,OAAO,GAAGD,qBAAqB,CAAC,MAAM,EAAP,CAArC;AACA7E,MAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiBD,QAAjB,EAA2B,wBAA3B;;AACA,UAAI;AACF,cAAMF,QAAQ,EAAd;AACD,OAFD,CAEE,OAAOrI,GAAP,EAAY;AACZ4D,QAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiBD,QAAjB,EAA2B,+BAA3B;AACAG,QAAAA,OAAO;AACPJ,QAAAA,MAAM,CAACtI,GAAD,CAAN;AACA;AACD;;AACD4D,MAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiBD,QAAjB,EAA2B,kBAA3B;AACAG,MAAAA,OAAO;AACPrF,MAAAA,OAAO;AACR,KAdG,CAAJ;AAeD,GAvBD,CALF;;AAqCA,QAAMyL,UAAU,GAAG,CAAClL,OAAD,EAAwBkI,EAAxB,KAAoD;AACrE,QAAI,CAACA,EAAL,EAAS,MAAM,IAAI3a,KAAJ,CAAU,6BAAV,CAAN;AACTyS,IAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiBsD,EAAjB,EAAqB,YAArB;AACAuI,IAAAA,UAAU,CAAC,MAAM;AACfF,MAAAA,MAAM,CAAC,YAAD,EAAe,CAAC,CAAhB,EAAmB,MAAM;AAC7B,eAAOA,MAAM,CAAChG,MAAM,CAACrC,EAAE,CAACta,EAAJ,CAAP,EAAgBsa,EAAE,CAACoB,MAAnB,EAA2B,YAAY;AAClD,gBAAM,CAAC7D,WAAD,EAAc0D,mBAAd,IAAqC,MAAMvP,OAAO,CAACC,GAAR,CAAY,CAC3D0U,OAAO,CAACvO,OAAD,EAAUkI,EAAE,CAACoB,MAAb,CADoD,EAE3DwE,sBAAsB,CAAC5F,EAAE,CAACoB,MAAJ,EAAYtJ,OAAZ,EAAqBkJ,WAArB,CAFqC,CAAZ,CAAjD;AAIA,gBAAMD,mBAAmB,CACvBxD,WADuB,EAEvBzF,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,SAXY,CAAb;AAYD,OAbK,CAAN;AAcD,KAfS,EAeP,MAfO,CAAV;AAgBD,GAnBD;;AAqBA,SAAO7M,MAAM,CAACiE,MAAP,CAAc2I,WAAd,EAA2B;AAChCzF,IAAAA,UADgC;AAEhC7P,IAAAA,MAFgC;AAGhCgW,IAAAA,YAAY,EAAE+F,QAHkB;AAIhCvB,IAAAA,SAAS,EAAE;AAAExgB,MAAAA,EAAF;AAAMkG,MAAAA;AAAN,KAJqB;AAKhC8b,IAAAA,SALgC;AAMhCM,IAAAA,iBANgC;AAOhCV,IAAAA,YAPgC;AAQhCrF,IAAAA,cAAc,EA7FQvW,MAAD,IACrBA,MAAM,CAACoS,IAAP,CAAa+B,KAAD,IAAWA,KAAK,CAACna,EAAN,IAAYkiB,mBAAmB,CAACxO,QAApB,CAA6ByG,KAAK,CAACna,EAAnC,CAAnC,CAoFgC;AAShCwc,IAAAA,kBAAkB,EA5FQxW,MAAD,IACzBA,MAAM,CAACoS,IAAP,CACG+B,KAAD,IAAWA,KAAK,CAACna,EAAN,IAAYmiB,uBAAuB,CAACzO,QAAxB,CAAiCyG,KAAK,CAACna,EAAvC,CADzB,CAkFgC;AAUhC8iB,IAAAA,yBAAyB,EAzFQ9c,MAAD,IAChCA,MAAM,CAACoS,IAAP,CACG+B,KAAD,IAAWA,KAAK,CAACna,EAAN,IAAYoiB,wBAAwB,CAAC1O,QAAzB,CAAkCyG,KAAK,CAACna,EAAxC,CADzB,CA8EgC;AAWhC+iB,IAAAA,iBAAiB,EAtFQ/c,MAAD,IACxBA,MAAM,CAACoS,IAAP,CACG+B,KAAD,IAAWA,KAAK,CAACna,EAAN,IAAYqiB,sBAAsB,CAAC3O,QAAvB,CAAgCyG,KAAK,CAACna,EAAtC,CADzB,CA0EgC;AAYhCgjB,IAAAA,wBAAwB,EAlFQhd,MAAD,IAC/BA,MAAM,CACHkH,MADH,CACWiN,KAAD,IAAWA,KAAK,CAACna,EAAN,IAAYkiB,mBAAmB,CAACxO,QAApB,CAA6ByG,KAAK,CAACna,EAAnC,CADjC,EAEG6E,GAFH,CAEQsV,KAAD,IACHoI,kBAAkB,CAAC1f,GAAnB,CAAuBsX,KAAK,CAACna,EAA7B,CAHJ,EAKGkN,MALH,CAKUT,aALV,CAqEgC;AAchCiQ,IAAAA,gBAAgB,EAAE,MAAM+F,WAdQ;AAehCzF,IAAAA,cAAc,EAAG1C,EAAD,IAA6B;AAC3CpG,MAAAA,OAAO,CAACS,GAAR,CAAY,kBAAZ,EAAgC;AAC9B9E,QAAAA,IAAI,EAAEkS,QADwB;AAE9BzH,QAAAA;AAF8B,OAAhC;;AAIA,UAAImI,WAAW,IAAI9F,MAAM,CAAC8F,WAAW,CAAC/G,MAAb,CAAN,KAA+BiB,MAAM,CAACrC,EAAE,CAACoB,MAAJ,CAAxD,EAAqE;AACnE;AACD;;AACD,UAAI+G,WAAJ,EAAiB,MAAM,IAAI9iB,KAAJ,CAAU,mBAAV,CAAN;AACjB8iB,MAAAA,WAAW,GAAGnI,EAAd;AACD,KAzB+B;AA0BhCmB,IAAAA,0BAA0B,EAAE,CAC1BrJ,OAD0B,EAE1ByK,QAF0B,EAG1BoG,MAH0B,KAIjB;AACT,UAAIR,WAAW,IAAI9F,MAAM,CAAC8F,WAAW,CAAC/G,MAAb,CAAN,KAA+BiB,MAAM,CAACE,QAAD,CAAxD,EAAoE;AAClE4F,QAAAA,WAAW,GAAGC,cAAc,CAACQ,KAAf,EAAd;AACA9Q,QAAAA,OAAO,CAACuC,GAAR,CAAa,sBAAqBoN,QAAS,IAAGlF,QAAS,KAAIoG,MAAO,EAAlE;;AACA,YAAIR,WAAJ,EAAiB;AACfrQ,UAAAA,OAAO,CAACuC,GAAR,CAAY8N,WAAZ,EAA0B,oBAAmBV,QAAS,EAAtD;AACD,SAFD,MAEO;AACL3P,UAAAA,OAAO,CAACuC,GAAR,CAAa,4BAA2BoN,QAAS,EAAjD;AACD;;AACD,YAAIU,WAAJ,EAAiB;AACfnF,UAAAA,UAAU,CAAClL,OAAD,EAAUqQ,WAAV,CAAV;AACD;AACF,OAXD,MAWO;AACL,cAAMU,cAAc,GAAGT,cAAc,CAAC3S,MAAtC;AACA2S,QAAAA,cAAc,GAAGA,cAAc,CAACxV,MAAf,CACdmC,KAAD,IAAWsN,MAAM,CAACtN,KAAK,CAACqM,MAAP,CAAN,KAAyBiB,MAAM,CAACE,QAAD,CAD3B,CAAjB;;AAGA,YAAI6F,cAAc,CAAC3S,MAAf,KAA0BoT,cAA9B,EAA8C;AAC5C/Q,UAAAA,OAAO,CAACuC,GAAR,CAAa,sBAAqBoN,QAAS,IAAGlF,QAAS,KAAIoG,MAAO,EAAlE;AACD;AACF;AACF,KAnD+B;AAoDhClG,IAAAA,kBAAkB,EAAGzC,EAAD,IAA6B;AAC/ClI,MAAAA,OAAO,CAACuC,GAAR,CACE;AACE9E,QAAAA,IAAI,EAAEkS,QADR;AAEEzH,QAAAA,EAFF;AAGEmI,QAAAA,WAHF;AAIEC,QAAAA;AAJF,OADF,EAOE,wBAPF;;AASA,UAAI,CAACA,cAAc,CAACtK,IAAf,CAAqBgL,CAAD,IAAOA,CAAC,CAAC1H,MAAF,KAAapB,EAAE,CAACoB,MAA3C,CAAL,EAAyD;AACvDgH,QAAAA,cAAc,CAACvW,IAAf,CAAoBmO,EAApB;AACD;AACF,KAjE+B;AAkEhCgD,IAAAA,UAlEgC;AAoEhCqF,IAAAA,MApEgC;AAqEhCU,IAAAA,eAAe,EAjGO,CACtBxL,WADsB,EAEtBhB,QAFsB,KAGJ;AAClB,aAAO8L,MAAM,CAAChG,MAAM,CAAC9E,WAAW,CAAC7X,EAAb,CAAP,EAAyB6X,WAAW,CAAC6D,MAArC,EAA6C7E,QAA7C,CAAb;AACD;AAuBiC,GAA3B,CAAP;AAuED;;AAED,MAAMyM,mBAAmB,GAAG,IAAIlZ,GAAJ,EAA5B;AACA,MAAMmZ,YAAY,GAAG,IAAInZ,GAAJ,EAArB;AAEO,MAAMoZ,iBAAiB,GAAG,CAC/B3N,UAD+B,EAE/BzD,OAF+B,KAGe;AAC9C,QAAMvC,IAAI,GAAGuC,OAAO,CAAC0D,OAAR,CAAgBpG,UAA7B;AACA,QAAMI,KAAK,GAAGD,IAAI,CAACC,KAAnB;AACA,QAAMlB,GAAG,GAAGiB,IAAI,CAAC7P,EAAjB;AAEA,QAAMyjB,mBAAmB,GAAGF,YAAY,CAAC1gB,GAAb,CAAiB+L,GAAjB,CAA5B;AACA,MAAI6U,mBAAJ,EAAyB,OAAOA,mBAAP;AAEzB,QAAM/K,eAAe,GAAG4K,mBAAmB,CAACzgB,GAApB,CAAwB+L,GAAxB,CAAxB;AACA,MAAI8J,eAAJ,EAAqB,OAAO1M,OAAO,CAAC6F,OAAR,CAAgB6G,eAAhB,CAAP;AAErB,MAAIpO,aAAa,GAAGP,cAAc,CAAC+F,KAAK,CAAC7L,KAAP,CAAlC;;AAEA,MAAI,CAACqG,aAAL,EAAoB;AAClB4J,IAAAA,OAAO,CAACwP,IAAR,CAAc,4BAA2B5T,KAAK,CAAC7L,KAAM,EAArD;AACAqG,IAAAA,aAAa,GAAGC,QAAhB;AACD;;AAED,QAAMoO,OAAO,GAAGmJ,eAAe,CAACjM,UAAD,EAAazD,OAAb,EAAsB9H,aAAtB,CAA/B;AACAgZ,EAAAA,mBAAmB,CAAC1Y,GAApB,CAAwBgE,GAAxB,EAA6B+J,OAA7B;AAEA,SAAOA,OAAO,CAACC,IAAR,CAAc0C,WAAD,IAAiB;AACnCgI,IAAAA,mBAAmB,CAAC/N,MAApB,CAA2B3G,GAA3B;AACA2U,IAAAA,YAAY,CAAC3Y,GAAb,CAAiBgE,GAAjB,EAAsB0M,WAAtB;AACA,WAAOA,WAAP;AACD,GAJM,CAAP;AAKD,CA7BM;;AC1TA,MAAMqI,iBAAiB,GAAG,CAG/B9N,UAH+B,EAI/BgB,QAJ+B,KAQc;AAC7C,SAAO,MAAOzE,OAAP,IAAkC;AACvC,UAAMkJ,WAAW,GAAG,MAAMkI,iBAAiB,CAAC3N,UAAD,EAAazD,OAAb,CAA3C;AACA,QAAI,CAACkJ,WAAL,EAAkB;AAElB,WAAOzE,QAAQ,CAACzE,OAAD,EAAUkJ,WAAV,CAAf;AACD,GALD;AAMD,CAfM;;ACgBA,MAAMsI,wBAAwB,GAAG,CAUtC/N,UAVsC,EAWtCgO,uBAXsC,EAgBtCC,UAhBsC,EAsBtCC,kBAtBsC,KA2BpB;AAClB,SAAOJ,iBAAiB,CAAC9N,UAAD,EAAa,OAAOzD,OAAP,EAAgBkJ,WAAhB,KAAgC;AACnE,UAAMzD,WAAqB,GAAGgM,uBAAuB,CACnDzR,OAAO,CAAC0D,OAD2C,EAEnD1D,OAFmD,EAGnDkJ,WAHmD,CAArD;AAKA,QAAIzD,WAAW,KAAK,IAApB,EAA0B;AAC1B,UAAMoB,OAAO,GAAG8K,kBAAkB,GAC9BA,kBAAkB,CAAClM,WAAD,EAAczF,OAAd,EAAuBkJ,WAAvB,CADY,GAE9B,EAFJ;AAIA,UAAMA,WAAW,CAAC+H,eAAZ,CAA4BxL,WAA5B,EAAyC,YAAY;AACzD;AACN;AACA;AACA;AACM,YAAM0D,mBAAmB,GAAGD,WAAW,CAACsG,YAAZ,GACxB,IADwB,GAExB,MAAM1B,sBAAsB,CAC1BrI,WAAW,CAAC6D,MADc,EAE1BtJ,OAF0B,EAG1BkJ,WAH0B,EAI1BrC,OAAO,CAACkH,wBAJkB,CAFhC;AASA,aAAO2D,UAAU,CAACjM,WAAD,EAAczF,OAAd,EAAuBkJ,WAAvB,EAAoCC,mBAApC,CAAjB;AACD,KAfK,CAAN;AAgBD,GA3BuB,CAAxB;AA4BD,CAxDM;AA0DA,MAAMyI,yBAAyB,GAAG,CAKvCnO,UALuC,EAMvCoO,MANuC,EAUvCH,UAVuC,KAerB;AAClB,SAAOH,iBAAiB,CAAC9N,UAAD,EAAa,OAAOzD,OAAP,EAAgBkJ,WAAhB,KAAgC;AACnE,UAAMiF,GAAG,GAAG0D,MAAM,CAAC7R,OAAO,CAAC0D,OAAT,EAAkBwF,WAAlB,CAAlB;AACA,QAAIiF,GAAG,CAACxQ,MAAJ,KAAe,CAAnB,EAAsB;AAEtB,UAAM/D,OAAO,CAACC,GAAR,CACJsU,GAAG,CAAC1b,GAAJ,CAASyV,EAAD,IACNgB,WAAW,CAACqH,MAAZ,CAAmBhG,MAAM,CAACrC,EAAE,CAACta,EAAJ,CAAzB,EAAkCsa,EAAE,CAACoB,MAArC,EAA6C,YAAY;AACvD,aAAOoI,UAAU,CAACxJ,EAAD,EAAKlI,OAAL,EAAckJ,WAAd,CAAjB;AACD,KAFD,CADF,CADI,CAAN;AAOD,GAXuB,CAAxB;AAYD,CA5BM;;ACzEQ,SAAS4I,iBAAT,CACbtT,GADa,EAEbiF,UAFa,EAGP;AACNjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,qBADF,EAEEH,yBAAyB,CACvBnO,UADuB,EAEvB,CAACC,OAAD,EAAUwF,WAAV,KAA0B;AACxB,QAAIA,WAAW,CAACsG,YAAhB,EAA8B,OAAO,EAAP;AAC9B,WAAO9L,OAAO,CAACsO,SAAR,CAAkBC,aAAzB;AACD,GALsB,EAMvB,OAAOxM,WAAP,EAAoBzF,OAApB,EAA6BkJ,WAA7B,KAA6C;AAC3C,UAAM,CAACgJ,SAAD,EAAY/I,mBAAZ,IAAmC,MAAMvP,OAAO,CAACC,GAAR,CAAY,CACzD0U,OAAO,CAACvO,OAAD,EAAUyF,WAAW,CAAC6D,MAAtB,CADkD,EAEzDwE,sBAAsB,CAACrI,WAAW,CAAC6D,MAAb,EAAqBtJ,OAArB,EAA8BkJ,WAA9B,CAFmC,CAAZ,CAA/C;AAKA,UAAMD,mBAAmB,CACvBiJ,SADuB,EAEvBlS,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,GAlBsB,CAF3B;AAuBD;;AC3Bc,SAASgJ,mBAAT,CACb3T,GADa,EAEbiF,UAFa,EAGP;AACNjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,uBADF,EAEEH,yBAAyB,CACvBnO,UADuB,EAEvB,CAACC,OAAD,EAAUwF,WAAV,KAA0B;AACxB,QAAIA,WAAW,CAACsG,YAAhB,EAA8B,OAAO,EAAP;AAC9B,WAAO9L,OAAO,CAAC0O,WAAR,CAAoBH,aAA3B;AACD,GALsB,EAMvB,OAAOxM,WAAP,EAAoBzF,OAApB,EAA6BkJ,WAA7B,KAA6C;AAC3C,UAAM,CAACgJ,SAAD,EAAY/I,mBAAZ,IAAmC,MAAMvP,OAAO,CAACC,GAAR,CAAY,CACzD0U,OAAO,CAACvO,OAAD,EAAUyF,WAAW,CAAC6D,MAAtB,CADkD,EAEzDwE,sBAAsB,CAACrI,WAAW,CAAC6D,MAAb,EAAqBtJ,OAArB,EAA8BkJ,WAA9B,CAFmC,CAAZ,CAA/C;AAKA,UAAMD,mBAAmB,CACvBiJ,SADuB,EAEvBlS,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,GAlBsB,CAF3B;AAuBD;;AC9BM,MAAMkJ,UAAU,GAAG,CAACpd,GAAD,EAAc0N,IAAd,KAAuC;AAC/D,SAAQ,IAAG1N,GAAI,IAAG0N,IAAK,GAAvB;AACD,CAFM;AAIA,MAAM2P,YAAY,GAAG,CAC1BpK,EAD0B,EAE1BgB,WAF0B,KAGf;AACX,SAAOmJ,UAAU,CACfnK,EAAE,CAACqK,QADY,EAEd,GAAErJ,WAAW,CAAC0G,SAAZ,GAAyB,GAAE1G,WAAW,CAAC0G,SAAU,GAAjD,GAAsD,EAAG,GAC1D1G,WAAW,CAACU,YACb,IAAG1B,EAAE,CAACoB,MAAO,EAJC,CAAjB;AAMD,CAVM;AAYA,MAAMkJ,eAAe,GAAG,CAC7BC,YAD6B,EAE7BhN,WAF6B,EAG7BiN,MAH6B,KAIlB;AACX,QAAMhV,KAAK,GAAG+H,WAAW,CAAChU,IAA1B;AAEA,MAAIiM,KAAK,IAAIA,KAAK,CAAC9P,EAAN,KAAa8kB,MAAM,CAAC9kB,EAAjC,EAAqC,OAAO,SAAP;AAErC,QAAM+kB,YAAqB,GACzB,CAAC,CAAClN,WAAW,CAACmN,SAAd,IACAnN,WAAW,CAACmN,SAAZ,CAAsB5M,IAAtB,CAA4B6M,CAAD,IAAYA,CAAC,IAAIA,CAAC,CAACjlB,EAAF,KAAS8kB,MAAM,CAAC9kB,EAA5D,CAFF;AAIA,SAAQ,GAAE6kB,YAAa,QAAOE,YAAY,GAAG,qBAAH,GAA2B,EAAG,EAAxE;AACD,CAdM;;ACjBQ,eAAeG,YAAf,CAGb9S,OAHa,EAIblM,IAJa,EAKbyU,GALa,EAMbtO,IANa,EAOb/C,WAPa,EAQbjC,GARa,EASE;AACf,QAAM+K,OAAO,CAAC9G,OAAR,CAAgBqE,KAAhB,CAAsBwV,kBAAtB,CACJ/S,OAAO,CAACvC,IAAR,CAAa;AACXuC,IAAAA,OAAO,EACLlM,IAAI,KAAK,EAAT,GACI1G,OAAO,CAACC,GAAR,CAAYgB,eADhB,GAEK,GAAEjB,OAAO,CAACC,GAAR,CAAYgB,eAAgB,IAAGyF,IAAK,EAJlC;AAKXyU,IAAAA,GALW;AAMXO,IAAAA,KAAK,EAAE7O,IANI;AAOX/C,IAAAA,WAPW;AAQX8b,IAAAA,UAAU,EAAE/d;AARD,GAAb,CADI,CAAN;AAYD;;ACdD,MAAMge,cAAc,GAAG,gBAGrBxN,WAHqB,EAIrBzF,OAJqB,EAKrB;AAAE8I,EAAAA,KAAF;AAAS5R,EAAAA;AAAT,CALqB,EAMrBgc,WANqB,EAON;AACf,QAAMC,UAAU,GAAG,CACjB,MAAMnT,OAAO,CAAC9G,OAAR,CAAgBiP,MAAhB,CAAuBC,UAAvB,CACJpI,OAAO,CAACvC,IAAR,CAAa;AACX4K,IAAAA,GAAG,EAAE5C,WAAW,CAAC6C,IAAZ,CAAiBC;AADX,GAAb,CADI,CADW,EAMjB3W,IANiB,CAMZ6W,UANY,CAMD7M,IANC,CAMK8M,KAAD,IAAWA,KAAK,CAAC5U,IAAN,KAAe1G,OAAO,CAACC,GAAR,CAAYgB,eAN1C,CAAnB;AAQA2R,EAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CAAkB;AAAE2Q,IAAAA,UAAF;AAAcrK,IAAAA,KAAd;AAAqB5R,IAAAA;AAArB,GAAlB,EAAsD,kBAAtD;;AAEA,MAAIic,UAAJ,EAAgB;AACd,UAAMnT,OAAO,CAAC9G,OAAR,CAAgBiP,MAAhB,CAAuBza,MAAvB,CACJsS,OAAO,CAACvC,IAAR,CAAa;AACX3J,MAAAA,IAAI,EAAE1G,OAAO,CAACC,GAAR,CAAYgB,eADP;AAEX+kB,MAAAA,QAAQ,EAAE3N,WAAW,CAAC6C,IAAZ,CAAiBC,GAFhB;AAGX8K,MAAAA,UAAU,EAAE5N,WAAW,CAAC6N,UAHb;AAIX1e,MAAAA,MAAM,EAAE,WAJG;AAKX+T,MAAAA,UAAU,EAAEG,KALD;AAMXyK,MAAAA,YAAY,EAAE,IAAIxhB,IAAJ,GAAWyhB,WAAX,EANH;AAOXC,MAAAA,MAAM,EAAE;AACNrlB,QAAAA,KAAK,EAAE8I,WADD;AAEN7D,QAAAA,OAAO,EAAE;AAFH;AAPG,KAAb,CADI,CAAN;AAcD,GAfD,MAeO,IAAI6f,WAAW,IAAIpK,KAAK,KAAK,SAA7B,EAAwC;AAC7C,UAAMlP,OAAO,CAACC,GAAR,CAAY,CAChBiZ,YAAY,CACV9S,OADU,EAEV,EAFU,EAGVkT,WAHU,EAIV,SAJU,EAKV,8BALU,CADI,EAQhBJ,YAAY,CAAC9S,OAAD,EAAU,EAAV,EAAcyF,WAAW,CAAC6C,IAAZ,CAAiBC,GAA/B,EAAoCO,KAApC,EAA2C5R,WAA3C,CARI,CAAZ,CAAN;AAUD,GAXM,MAWA;AACL,UAAM4b,YAAY,CAAC9S,OAAD,EAAU,EAAV,EAAcyF,WAAW,CAAC6C,IAAZ,CAAiBC,GAA/B,EAAoCO,KAApC,EAA2C5R,WAA3C,CAAlB;AACD;AACF,CA/CD;;AAiDO,MAAMwc,2BAA2B,GAAG,CAGzCjO,WAHyC,EAIzCzF,OAJyC,EAKzCkJ,WALyC,EAMzCtV,MAAyB,GAAG6R,WAAW,CAAC7R,MAAZ,IAAsB,EANT,EAOzCsf,WAPyC,KAQvB;AAClBlT,EAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CACE;AACE5O,IAAAA,MAAM,EAAEA,MAAM,CAACnB,GAAP,CAAYuV,CAAD,IAAOA,CAAP,aAAOA,CAAP,uBAAOA,CAAC,CAAElU,IAArB,CADV;AAEEqW,IAAAA,cAAc,EAAEjB,WAAW,CAACiB,cAAZ,CAA2BvW,MAA3B,CAFlB;AAGE+c,IAAAA,iBAAiB,EAAEzH,WAAW,CAACyH,iBAAZ,CAA8B/c,MAA9B;AAHrB,GADF,EAME,6BANF;;AASA,QAAM+f,uBAAuB,GAAIzc,WAAD,IAC9B+b,cAAc,CACZxN,WADY,EAEZzF,OAFY,EAGZ;AACE8I,IAAAA,KAAK,EAAE,SADT;AAEE5R,IAAAA;AAFF,GAHY,EAOZgc,WAPY,CADhB;;AAWA,MACEzN,WAAW,CAACG,mBAAZ,IACAH,WAAW,CAACG,mBAAZ,CAAgCjI,MAAhC,GAAyC,CAF3C,EAGE;AACA,WAAOgW,uBAAuB,CAC3B,yBAAyBlO,WAAW,CAACG,mBAAb,CACtB9K,MADsB,CACfT,aADe,EAEtB5H,GAFsB,CAEjBmhB,EAAD,IAAQA,EAAE,CAAC/hB,KAFO,EAGtB2a,IAHsB,CAGjB,IAHiB,CAGX,EAJc,CAA9B;AAMD;;AAED,MAAI/G,WAAW,CAACI,eAAZ,IAA+BJ,WAAW,CAACI,eAAZ,CAA4BlI,MAA5B,GAAqC,CAAxE,EAA2E;AACzE,WAAOgW,uBAAuB,CAC3B,yBAAyBlO,WAAW,CAACI,eAAb,CACtB/K,MADsB,CACfT,aADe,EAEtB5H,GAFsB,CAEjBohB,EAAD,IAAQA,EAAE,CAAC/f,IAFO,EAGtB0Y,IAHsB,CAGjB,IAHiB,CAGX,EAJc,CAA9B;AAMD;;AAED,MAAItD,WAAW,CAACwH,yBAAZ,CAAsC9c,MAAtC,CAAJ,EAAmD;AACjD,WAAO+f,uBAAuB,CAC5B,+EAD4B,CAA9B;AAGD;;AAED,QAAMG,qBAAqB,GAAG5K,WAAW,CAAC0H,wBAAZ,CAAqChd,MAArC,CAA9B;;AAEA,MAAIkgB,qBAAqB,CAACnW,MAAtB,GAA+B,CAAnC,EAAsC;AACpC,WAAOgW,uBAAuB,CAC3B,yBAAwBG,qBAAqB,CAACtH,IAAtB,CACvB,IADuB,CAEvB,6BAH0B,CAA9B;AAKD;;AAED,MAAI,CAACtD,WAAW,CAACyH,iBAAZ,CAA8B/c,MAA9B,CAAL,EAA4C;AAC1C,QAAIsV,WAAW,CAACvW,MAAZ,CAAmBG,qBAAvB,EAA8C;AAC5C,aAAO6gB,uBAAuB,CAC5B,8CAD4B,CAA9B;AAGD;AACF,GAhEiB;AAmElB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAAOV,cAAc,CACnBxN,WADmB,EAEnBzF,OAFmB,EAGnB;AACE8I,IAAAA,KAAK,EAAE,SADT;AAEE5R,IAAAA,WAAW,EAAE;AAFf,GAHmB,EAOnBgc,WAPmB,CAArB,CA/EkB;AAyFnB,CAjGM;;ACjDA,MAAMa,kBAAkB,GAAG,OAIhCtO,WAJgC,EAKhCzF,OALgC,EAMhCkJ,WANgC,EAOhC8K,WAPgC,EAQhC;AACE3Q,EAAAA,GAAG,EAAE4Q,WADP;AAEEC,EAAAA,MAAM,EAAEC;AAFV,CARgC,KAeD;AAC/BnU,EAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CACE;AACEwR,IAAAA,WADF;AAEEC,IAAAA,WAFF;AAGEE,IAAAA;AAHF,GADF,EAME,oBANF;AASA,MAAIrM,QAA2B,GAAGrC,WAAW,CAAC7R,MAAZ,IAAsB,EAAxD;AACA,MAAI,CAACogB,WAAL,EAAkB,OAAOlM,QAAP;AAElB,QAAMsM,aAAa,GAAG,IAAIlQ,GAAJ,CACpB4D,QAAQ,CAACrV,GAAT,CAAcsV,KAAD,IAAWA,KAAK,CAACjU,IAA9B,EAAoCgH,MAApC,CAA2CT,aAA3C,CADoB,CAAtB;AAIA,QAAMga,KAAK,GAAG,IAAInQ,GAAJ,EAAd;AACA,QAAMoQ,UAAU,GAAG,IAAIpQ,GAAJ,EAAnB;AACA,QAAMqQ,QAAQ,GAAG,IAAIrQ,GAAJ,EAAjB;AACA,QAAMsQ,aAAa,GAAG,IAAItQ,GAAJ,EAAtB;AACA,QAAMtQ,MAAM,GAAGsV,WAAW,CAACtV,MAA3B;;AAEA,QAAM6gB,eAAe,GACnBjY,GADsB,IAEoB;AAC1C,UAAMkY,YAAY,GAAGxL,WAAW,CAACvW,MAAZ,CAAmBiB,MAAnB,CAA0BI,MAA1B,CAAiCggB,WAAjC,CAArB;AACA,QAAI,CAACU,YAAL,EAAmB,OAAOzkB,SAAP;AAEnB,WAAOykB,YAAY,CAAClY,GAAD,CAAZ,IAAqB5I,MAAM,CAAC8gB,YAAY,CAAClY,GAAD,CAAb,CAA3B,GACH5I,MAAM,CAAC8gB,YAAY,CAAClY,GAAD,CAAb,CADH,GAEHvM,SAFJ;AAGD,GATD;;AAWA,MAAIgkB,WAAJ,EAAiB;AACfA,IAAAA,WAAW,CAACjT,OAAZ,CAAqBxE,GAAD,IAAS;AAC3B,UAAI,CAACA,GAAL,EAAU;AACV,YAAMuL,KAAK,GAAG0M,eAAe,CAACjY,GAAD,CAA7B;;AACA,UACE,CAACuL,KAAD,IACA,CAACA,KAAK,CAACjU,IADP,IAEAgU,QAAQ,CAAC9B,IAAT,CAAe2O,OAAD,IAAaA,OAAO,CAAC/mB,EAAR,KAAema,KAAK,CAACna,EAAhD,CAHF,EAIE;AACA;AACD;;AACDwmB,MAAAA,aAAa,CAAC/Q,GAAd,CAAkB0E,KAAK,CAACjU,IAAxB;AACAugB,MAAAA,KAAK,CAAChR,GAAN,CAAU7G,GAAV;AACA8X,MAAAA,UAAU,CAACjR,GAAX,CAAe0E,KAAK,CAACjU,IAArB;AACD,KAbD;AAcD;;AAED,MAAIqgB,cAAJ,EAAoB;AAClBA,IAAAA,cAAc,CAACnT,OAAf,CAAwBxE,GAAD,IAAS;AAC9B,UAAI,CAACA,GAAL,EAAU;AACV,YAAMuL,KAAK,GAAG0M,eAAe,CAACjY,GAAD,CAA7B;AACA,UAAI,CAACuL,KAAL,EAAY;AACZ,YAAMsG,QAAQ,GAAGvG,QAAQ,CAAClM,IAAT,CAAe+Y,OAAD,IAAaA,OAAO,CAAC/mB,EAAR,KAAema,KAAK,CAACna,EAAhD,CAAjB;;AACA,UAAIygB,QAAQ,IAAIA,QAAQ,CAACva,IAAzB,EAA+B;AAC7BsgB,QAAAA,aAAa,CAACjR,MAAd,CAAqBkL,QAAQ,CAACva,IAA9B;AACAygB,QAAAA,QAAQ,CAAClR,GAAT,CAAa7G,GAAb;AACAgY,QAAAA,aAAa,CAACnR,GAAd,CAAkBgL,QAAQ,CAACva,IAA3B;AACD;AACF,KAVD;AAWD,GA/D8B;;;AAkE/B,MAAI2R,WAAW,CAAChU,IAAhB,EAAsB;AACpByX,IAAAA,WAAW,CAACjE,gBAAZ,CAA6BQ,WAAW,CAAChU,IAAZ,CAAiBI,KAA9C,EAAqDmP,OAArD,CAA8D8C,QAAD,IAAc;AACzE,YAAMrJ,IAAI,GAAGyO,WAAW,CAACvW,MAAZ,CAAmBgB,KAAnB,CAAyBmQ,QAAzB,CAAb;;AACA,UAAIrJ,IAAI,CAAC7G,MAAT,EAAiB;AACf6G,QAAAA,IAAI,CAAC7G,MAAL,CAAYoN,OAAZ,CAAqBmG,QAAD,IAAc;AAChC,gBAAMY,KAAK,GAAGmB,WAAW,CAACtV,MAAZ,CAAmBuT,QAAnB,CAAd;;AACA,cAAIY,KAAK,IAAI,CAACD,QAAQ,CAAC9B,IAAT,CAAe2O,OAAD,IAAaA,OAAO,CAAC/mB,EAAR,KAAema,KAAK,CAACna,EAAhD,CAAd,EAAmE;AACjEwmB,YAAAA,aAAa,CAAC/Q,GAAd,CAAkB0E,KAAK,CAACjU,IAAxB;AACAugB,YAAAA,KAAK,CAAChR,GAAN,CAAU8D,QAAV;AACAmN,YAAAA,UAAU,CAACjR,GAAX,CAAe0E,KAAK,CAACjU,IAArB;AACD;AACF,SAPD;AAQD;AACF,KAZD;AAaD,GAhF8B;;;AAoF/B,MAAIugB,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;AAC5C5U,MAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CACE;AACEwR,QAAAA,WADF;AAEEK,QAAAA,KAAK,EAAE,CAAC,GAAGA,KAAJ,CAFT;AAGEE,QAAAA,QAAQ,EAAE,CAAC,GAAGA,QAAJ,CAHZ;AAIED,QAAAA,UAAU,EAAE,CAAC,GAAGA,UAAJ,CAJd;AAKEE,QAAAA,aAAa,EAAE,CAAC,GAAGA,aAAJ;AALjB,OADF,EAQE,oBARF;;AAWA,UAAIH,KAAK,CAACO,IAAN,KAAe,CAAnB,EAAsB;AACpB,cAAMvjB,MAAM,GAAG,MAAM2O,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuByJ,SAAvB,CACnB7U,OAAO,CAACjL,KAAR,CAAc;AACZnB,UAAAA,MAAM,EAAE,CAAC,GAAG0gB,UAAJ;AADI,SAAd,CADmB,CAArB;AAKAxM,QAAAA,QAAQ,GAAGzW,MAAM,CAACO,IAAlB;AACD;;AAED,UAAI2iB,QAAQ,CAACK,IAAT,KAAkB,CAAtB,EAAyB;AACvB,aAAK,MAAME,YAAX,IAA2B,CAAC,GAAGN,aAAJ,CAA3B,EAA+C;AAC7C,cAAI;AACF,kBAAMnjB,MAAM,GAAG,MAAM2O,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuB2J,WAAvB,CACnB/U,OAAO,CAACjL,KAAR,CAAc;AACZjB,cAAAA,IAAI,EAAEghB;AADM,aAAd,CADmB,CAArB;AAKAhN,YAAAA,QAAQ,GAAGzW,MAAM,CAACO,IAAlB;AACD,WAPD,CAOE,OAAOwK,GAAP,EAAY;AACZ4D,YAAAA,OAAO,CAACuC,GAAR,CAAY+O,IAAZ,CACE;AACElV,cAAAA,GAAG,EAAEA,GAAF,aAAEA,GAAF,uBAAEA,GAAG,CAAEkG;AADZ,aADF,EAIE,sBAJF;AAMD;AACF;AACF;AACF,KAxCD,MAwCO;AACL,YAAM0S,kBAAkB,GAAG,CAAC,GAAGZ,aAAJ,CAA3B;AAEApU,MAAAA,OAAO,CAACuC,GAAR,CAAYC,KAAZ,CACE;AACEwR,QAAAA,WADF;AAEEK,QAAAA,KAAK,EAAE,CAAC,GAAGA,KAAJ,CAFT;AAGEE,QAAAA,QAAQ,EAAE,CAAC,GAAGA,QAAJ,CAHZ;AAIEU,QAAAA,SAAS,EAAEnN,QAAQ,CAACrV,GAAT,CAAcuV,CAAD,IAAOA,CAAC,CAAClU,IAAtB,CAJb;AAKEsgB,QAAAA,aAAa,EAAEY;AALjB,OADF,EAQE,oBARF;AAWA,YAAM3jB,MAAM,GAAG,MAAM2O,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuB8J,SAAvB,CACnBlV,OAAO,CAACjL,KAAR,CAAc;AACZnB,QAAAA,MAAM,EAAEohB;AADI,OAAd,CADmB,CAArB;AAKAlN,MAAAA,QAAQ,GAAGzW,MAAM,CAACO,IAAlB;AACD;AACF,GAlJ8B;AAqJ/B;AACA;AACA;AACA;AACA;;;AACA,QAAM8hB,2BAA2B,CAC/BjO,WAD+B,EAE/BzF,OAF+B,EAG/BkJ,WAH+B,EAI/BpB,QAJ+B,CAAjC,CA1J+B;;AAkK/B,SAAOA,QAAP;AACD,CAlLM;;ACIA,MAAMqN,2BAA2B,GAAG,OACzCnV,OADyC,EAEzCkJ,WAFyC,KAMrC;AACJ,QAAMkM,OAAO,GAAG,IAAIlR,GAAJ,EAAhB;AACA,QAAMmR,SAAqB,GAAG,EAA9B;AACA,QAAMC,kBAAkB,GAAG,IAAItd,GAAJ,EAA3B;AAEA,QAAMgI,OAAO,CAAC9G,OAAR,CAAgBO,QAAhB,CACJuG,OAAO,CAAC9G,OAAR,CAAgB6R,KAAhB,CAAsBwK,WADlB,EAEJvV,OAAO,CAACyF,WAAR,EAFI,EAGJ,CAAC;AAAE7T,IAAAA,IAAI,EAAE4jB;AAAR,GAAD,KAAuB;AACrBA,IAAAA,OAAO,CAACxU,OAAR,CAAiBhN,MAAD,IAAY;AAC1B,UAAI,CAACA,MAAM,CAACvC,IAAZ,EAAkB;;AAClB,UAAI,CAAC2jB,OAAO,CAAC1T,GAAR,CAAY1N,MAAM,CAACvC,IAAP,CAAY7D,EAAxB,CAAL,EAAkC;AAChCwnB,QAAAA,OAAO,CAAC/R,GAAR,CAAYrP,MAAM,CAACvC,IAAP,CAAY7D,EAAxB;AACAynB,QAAAA,SAAS,CAACtb,IAAV,CAAe;AACbnM,UAAAA,EAAE,EAAEoG,MAAM,CAACvC,IAAP,CAAY7D,EADH;AAEbiE,UAAAA,KAAK,EAAEmC,MAAM,CAACvC,IAAP,CAAYI,KAFN;AAGboI,UAAAA,IAAI,EAAEjG,MAAM,CAACvC,IAAP,CAAYwI;AAHL,SAAf;AAKD;;AACD,YAAM6O,KAAK,GAAG9U,MAAM,CAAC8U,KAAP,CAAa2M,WAAb,EAAd;;AACA,UAAI3M,KAAK,KAAK,WAAd,EAA2B;AACzBwM,QAAAA,kBAAkB,CAAC9c,GAAnB,CAAuBxE,MAAM,CAACvC,IAAP,CAAY7D,EAAnC,EAAuCkb,KAAvC;AACD;AACF,KAdD;AAgBA,WAAO,EAAP;AACD,GArBG,CAAN;AAwBA,QAAM4M,YAA8C,GAAG,EAAvD;AAKA5W,EAAAA,OAAO,CAACoK,WAAW,CAACvW,MAAZ,CAAmBW,MAApB,CAAP,CAAmC0N,OAAnC,CAA4CV,SAAD,IAAe;AACxDoV,IAAAA,YAAY,CAACpV,SAAD,CAAZ,GAA0B;AACxB9L,MAAAA,QAAQ,EAAE,CADc;AAExBD,MAAAA,gBAAgB,EAAE,CAFM;AAGxBohB,MAAAA,SAAS,EAAE;AAHa,KAA1B;AAKD,GAND;AAQAN,EAAAA,SAAS,CAACrU,OAAV,CAAmB4U,QAAD,IAAc;AAC9B,UAAM3P,KAAK,GAAGiD,WAAW,CAACnE,gBAAZ,CAA6B6Q,QAAQ,CAAC/jB,KAAtC,CAAd;;AACA,QAAIoU,KAAJ,EAAW;AACT,YAAM6C,KAAK,GAAGwM,kBAAkB,CAAC7kB,GAAnB,CAAuBmlB,QAAQ,CAAChoB,EAAhC,CAAd;;AACA,cAAQkb,KAAR;AACE,aAAK,UAAL;AACE4M,UAAAA,YAAY,CAACzP,KAAD,CAAZ,CAAoBzR,QAApB;AACA;;AACF,aAAK,mBAAL;AACEkhB,UAAAA,YAAY,CAACzP,KAAD,CAAZ,CAAoB1R,gBAApB;AACA;;AACF,aAAK,WAAL;AACEmhB,UAAAA,YAAY,CAACzP,KAAD,CAAZ,CAAoB0P,SAApB;AACA;AATJ;AAWD;AACF,GAhBD;AAkBA,SAAO;AAAEN,IAAAA,SAAF;AAAaK,IAAAA;AAAb,GAAP;AACD,CAnEM;;ACNA,SAASG,mCAAT,CACLpQ,WADK,EAEL4P,SAFK,EASL;AACA,QAAM3X,KAAK,GAAG+H,WAAW,CAAChU,IAA1B;AACA,QAAMmhB,SAAS,GAAGnN,WAAW,CAACmN,SAA9B;AACA,QAAMkD,WAAW,GAAGlD,SAAS,CAACngB,GAAV,CAAeogB,CAAD,IAAOA,CAAC,CAACjlB,EAAvB,CAApB;AAEA,QAAMmoB,SAAS,GAAGV,SAAS,CAACva,MAAV,CAAkBrJ,IAAD,IAAU,CAACqkB,WAAW,CAACxU,QAAZ,CAAqB7P,IAAI,CAAC7D,EAA1B,CAA5B,CAAlB;AACA,QAAMooB,kBAAwC,GAAGvQ,WAAW,CAACG,mBAAZ,CAAgCnT,GAAhC,CAC9CmhB,EAAD,KAAS,EACP,GAAGA,EADI;AAEPqC,IAAAA,iBAAiB,EAAE,IAFZ;AAGPC,IAAAA,gBAAgB,EAAE;AAHX,GAAT,CAD+C,CAAjD;;AAQA,MAAIzQ,WAAW,CAACI,eAAhB,EAAiC;;AAKjC,MAAImQ,kBAAJ,EAAwB;AACtBD,IAAAA,SAAS,CAAChc,IAAV,CACE,GAAGic,kBAAkB,CAAClb,MAAnB,CAA2B8Y,EAAD,IAAQ;AACnC,aACE,CAACmC,SAAS,CAACna,IAAV,CAAgBua,CAAD,IAAOA,CAAC,CAACvoB,EAAF,KAASgmB,EAAE,CAAChmB,EAAlC,CAAD,IAA0C,CAACkoB,WAAW,CAACxU,QAAZ,CAAqBsS,EAAE,CAAChmB,EAAxB,CAD7C;AAGD,KAJE,CADL;AAOD;;AAED,SAAO;AACL8P,IAAAA,KADK;AAELkV,IAAAA,SAFK;AAGLyC,IAAAA,SAHK;AAILW,IAAAA,kBAJK;AAKLD,IAAAA;AALK,GAAP;AAOD;;AC5Cc,SAASK,MAAT,CAAgB5X,GAAhB,EAA6BiF,UAA7B,EAA2D;AACxEjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,qBADF,EAEEP,wBAAwB,CACtB/N,UADsB,EAErBC,OAAD,IAAaA,OAAO,CAAC2S,YAFC,EAGtB,OAAO5Q,WAAP,EAAoBzF,OAApB,EAA6BkJ,WAA7B,EAA0CC,mBAA1C,KAAkE;AAChE;AACA,QAAIA,mBAAJ,EAAyB;AACvB;AACA,YAAM1L,IAAI,GAAGuC,OAAO,CAAC0D,OAAR,CAAgBpG,UAA7B;;AAEA,UAAImI,WAAW,CAACwF,MAAhB,EAAwB;AACtB,cAAMqL,SAAS,GAAG7Q,WAAW,CAAC6C,IAAZ,CAAiB7K,IAAjB,CAAsB7P,EAAtB,KAA6B6P,IAAI,CAAC7P,EAApD;AACA,cAAMiZ,OAAO,GAAGQ,YAAY,CAC1B8B,mBAAmB,CAACsC,WADM,EAE1BvC,WAAW,CAACvW,MAAZ,CAAmBI,gBAFO,CAA5B;AAKA,cAAM6G,OAAO,CAACC,GAAR,CAAY,CAChBqP,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,WAHF,CADgB,EAMhBgN,SAAS,IAAIzP,OAAO,CAAC3T,gBAArB,GACI8M,OAAO,CAAC9G,OAAR,CAAgBqd,GAAhB,CACGC,SADH,CAEIxW,OAAO,CAACvC,IAAR,CAAa;AAAE4K,UAAAA,GAAG,EAAG,SAAQ5C,WAAW,CAAC6C,IAAZ,CAAiBD,GAAI;AAArC,SAAb,CAFJ,EAIGlM,KAJH,CAIS,MAAM,EAJf,CADJ,GAMIlM,SAZY,CAAZ,CAAN;AAcD,OArBD,MAqBO;AACL,cAAM2J,OAAO,CAACC,GAAR,CAAY,CAChBqP,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,WAHF,CADgB,EAMhByK,kBAAkB,CAACtO,WAAD,EAAczF,OAAd,EAAuBkJ,WAAvB,EAAoC,KAApC,EAA2C;AAC3DgL,UAAAA,MAAM,EAAE,CAAC,aAAD;AADmD,SAA3C,CANF,CAAZ,CAAN;AAUD;AACF;AAED;;;AACA,QAAIzO,WAAW,CAACG,mBAAhB,EAAqC;AACnCH,MAAAA,WAAW,CAACG,mBAAZ,CAAgC5E,OAAhC,CAAyCyV,iBAAD,IAAuB;AAC7DvN,QAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B4W,iBAAiB,CAAC5kB,KAA/C;AACD,OAFD;AAGD;;AAED,QAAI4T,WAAW,CAACI,eAAhB,EAAiC;AAC/B,YAAMjM,OAAO,CAACC,GAAR,CACJ4L,WAAW,CAACI,eAAZ,CAA4BpT,GAA5B,CAAgC,MAAOgI,IAAP,IAAgB;AAC9C,cAAMqG,OAAO,GAAG,MAAMoI,WAAW,CAAChE,iBAAZ,CAA8BzK,IAAI,CAAC7M,EAAnC,CAAtB;AACAkT,QAAAA,OAAO,CAACE,OAAR,CAAiBlH,MAAD,IAAY;AAC1BoP,UAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B/F,MAAM,CAACjI,KAApC;AACD,SAFD;AAGD,OALD,CADI,CAAN;AAQD;;AAED,QAAI4T,WAAW,CAACmN,SAAhB,EAA2B;AACzBnN,MAAAA,WAAW,CAACmN,SAAZ,CAAsB5R,OAAtB,CAA+B0V,QAAD,IAAc;AAC1CxN,QAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B6W,QAAQ,CAAC7kB,KAAtC;AACD,OAFD;AAGD;AAED;;;AACA,UAAM;AAAEwjB,MAAAA;AAAF,QAAgB,MAAMF,2BAA2B,CACrDnV,OADqD,EAErDkJ,WAFqD,CAAvD;AAIA,UAAM;AACJxL,MAAAA,KADI;AAEJkV,MAAAA,SAFI;AAGJmD,MAAAA;AAHI,QAIFF,mCAAmC,CAACpQ,WAAD,EAAc4P,SAAd,CAJvC;AAMA,UAAMsB,aAAa,GAAGzN,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CACpBS,OAAO,CAAC0D,OAAR,CAAgBkT,MAAhB,CAAuB/kB,KADH,CAAtB;AAGA,UAAM4gB,YAAY,GAAGvJ,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CAA0B7B,KAAK,CAAC7L,KAAhC,CAArB;AACA,UAAMglB,MAAM,GAAGC,YAAA,CAAwBrR,WAAxB,EAAqCyD,WAArC,CAAf;;AAEA,UAAM6N,aAAa,GAAIC,EAAD,IAA6B;AACjD,YAAMC,SAAS,GAAGH,eAAA,CAChBrE,YADgB,EAEhBhN,WAFgB,EAGhBuR,EAHgB,CAAlB;AAMA,aAAQ,GACNvR,WAAW,CAACwF,MAAZ,GACK,YAAW0L,aAAc,SAD9B,GAEK,iBAAgBA,aAAc,SACpC,IAAGM,SAAU,IAAGJ,MAAO,OAAMpR,WAAW,CAACrX,KAAM,EAJhD;AAKD,KAZD;;AAcAwkB,IAAAA,SAAS,CAACngB,GAAV,CAAeikB,QAAD,IAAc;AAC1B,UAAI1W,OAAO,CAAC0D,OAAR,CAAgBkT,MAAhB,CAAuBhpB,EAAvB,KAA8B8oB,QAAQ,CAAC9oB,EAA3C,EAA+C;AAC/C,aAAOsb,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACL,cADK,EAELkX,QAAQ,CAAC9oB,EAFJ,EAGL8oB,QAAQ,CAAC7kB,KAHJ,EAIL;AACE8Q,QAAAA,IAAI,EAAEoU,aAAa,CAACL,QAAD;AADrB,OAJK,CAAP;AAQD,KAVD;AAYAX,IAAAA,SAAS,CAACtjB,GAAV,CAAeykB,QAAD,IAAc;AAC1B,UAAIlX,OAAO,CAAC0D,OAAR,CAAgBkT,MAAhB,CAAuBhpB,EAAvB,KAA8BspB,QAAQ,CAACtpB,EAA3C,EAA+C;AAC/C,aAAOsb,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACL,qBADK,EAEL0X,QAAQ,CAACtpB,EAFJ,EAGLspB,QAAQ,CAACrlB,KAHJ,EAIL;AACE8Q,QAAAA,IAAI,EAAEoU,aAAa,CAACG,QAAD;AADrB,OAJK,CAAP;AAQD,KAVD;AAWD,GA1HqB,CAF1B;AA+HD;;ACvIM,MAAMC,wBAAwB,GAAIxU,IAAD,KAA+B;AACrE1I,EAAAA,IAAI,EAAE,SAD+D;AAErE0I,EAAAA,IAAI,EAAE;AACJ1I,IAAAA,IAAI,EAAE,QADF;AAEJ0I,IAAAA;AAFI;AAF+D,CAA/B,CAAjC;AAQA,MAAMyU,oCAAoC,GAAG,CAClD9U,OADkD,EAElD+U,kBAFkD,KAGjC;AACjB,SAAO;AACL1U,IAAAA,IAAI,EAAEL,OADD;AAELM,IAAAA,MAAM,EAAE,CACN;AACE3I,MAAAA,IAAI,EAAE,SADR;AAEE0I,MAAAA,IAAI,EAAE;AACJ1I,QAAAA,IAAI,EAAE,QADF;AAEJ0I,QAAAA,IAAI,EAAEL;AAFF;AAFR,KADM,CAFH;AAWLQ,IAAAA,eAAe,EAAE,CAACuU,kBAAD,GACbpnB,SADa,GAEb,CAACknB,wBAAwB,CAACE,kBAAD,CAAzB;AAbC,GAAP;AAeD,CAnBM;;ACaP;AACO,MAAMC,yBAAyB,GAGpC5T,OAHuC,IAIT;AAC9B,QAAM+B,WAAsB,GAAI/B,OAAD,CAAiB2S,YAAhD;;AACA,MAAI5Q,WAAJ,EAAiB;AACf,WAAOA,WAAP;AACD;;AAED,QAAM1Q,KAAK,GAAI2O,OAAD,CAAiB3O,KAA/B;;AACA,MAAIA,KAAJ,aAAIA,KAAJ,eAAIA,KAAK,CAAEshB,YAAX,EAAyB;AACvB,WAAO,EACL,GAAGthB,KADE;AAEL,SAAGA,KAAK,CAACshB;AAFJ,KAAP;AAID;;AAED,QAAM,IAAI9oB,KAAJ,CAAU,4BAAV,CAAN;AACD,CAnBM;;ACvBA,MAAMgqB,gBAAgB,GAAG,CAC9BrO,WAD8B,EAE9BzX,IAF8B,KAGlB;AACZ,MAAIA,IAAI,CAACwI,IAAL,KAAc,KAAlB,EAAyB,OAAO,IAAP;;AACzB,MAAIiP,WAAW,CAACvW,MAAZ,CAAmBuC,QAAvB,EAAiC;AAC/B,WAAOgU,WAAW,CAACvW,MAAZ,CAAmBuC,QAAnB,CAA4BoM,QAA5B,CAAqC7P,IAAI,CAACI,KAA1C,CAAP;AACD;;AACD,SAAO,KAAP;AACD,CATM;AAWA,MAAM2lB,gBAAgB,GAAI/lB,IAAD,IAGjB;AACb,SACEA,IAAI,CAACwI,IAAL,KAAc,KAAd,IAAuBxI,IAAI,CAACI,KAAL,KAAgB,GAAEzE,OAAO,CAACC,GAAR,CAAYgB,eAAgB,OADvE;AAGD,CAPM;;ACXP,MAAMopB,KAAK,GAAGC,oBAAW,CAAC,QAAD,EAAW;AAAEC,EAAAA,OAAO,EAAE,EAAX;AAAeC,EAAAA,aAAa,EAAE;AAA9B,CAAX,CAAzB;AAEO,MAAMC,aAAa,GAAIhb,IAAD,IAAqC;AAChE,SAAO4a,KAAK,CAAC5a,IAAD,CAAL,CAAYib,QAAZ,CAAqBrlB,GAArB,CAA0ByO,CAAD,IAAOA,CAAC,CAACzP,IAAlC,CAAP;AACD,CAFM;;ACFA,MAAMsmB,mBAAmB,GAAG,CACjClb,IADiC,EAEjCmb,aAFiC,KAGtB;AACX,SAAOC,yBAAgB,CACrBpb,IAAI,CACD6K,OADH,CACW,eADX,EAC4B,oCAD5B,EAEGA,OAFH,CAGI,sBAHJ,EAIK,6BAA4BsQ,aAAa,GAAG,GAAH,GAAS,EAAG,MAJ1D,CADqB,CAAvB;AAQD,CAZM;;ACkBP,MAAME,aAAa,GAAG,OACpBlY,OADoB,EAEpBiO,OAFoB,KAKjB;AACH,MAAI,CAACA,OAAO,CAACkK,cAAb,EAA6B,OAAO,CAAClK,OAAD,CAAP;AAC7B,SAAOjO,OAAO,CAAC9G,OAAR,CAAgBO,QAAhB,CACLuG,OAAO,CAAC9G,OAAR,CAAgB6R,KAAhB,CAAsBqN,kBADjB,EAELpY,OAAO,CAACyF,WAAR,EAFK,EAGL,CAAC;AAAE7T,IAAAA;AAAF,GAAD,KAAc;AACZ,WAAOA,IAAI,CAACkJ,MAAL,CACJud,CAAD,IACEA,CAAC,CAACF,cAAF,KAAqBlK,OAAO,CAACkK,cAA7B,IACAE,CAAC,CAACzqB,EAAF,KAASqgB,OAAO,CAACkK,cAHd,CAAP;AAKD,GATI,CAAP;AAWD,CAlBD;;AAoBA,MAAMG,WAAW,GACfC,UADkB,IAEL;AACb,QAAMT,QAAQ,GAAG,IAAI5T,GAAJ,EAAjB;AAEAqU,EAAAA,UAAU,CAACvX,OAAX,CAAoBqX,CAAD,IAAO;AACxBR,IAAAA,aAAa,CAACQ,CAAC,CAACxb,IAAH,CAAb,CAAsBmE,OAAtB,CAA+BE,CAAD,IAAO4W,QAAQ,CAACzU,GAAT,CAAanC,CAAb,CAArC;AACD,GAFD;AAIA,SAAO,CAAC,GAAG4W,QAAJ,CAAP;AACD,CAVD;;AAYA,MAAMU,gBAAgB,GACpBD,UADuB,IAEa;AACpC,QAAMnD,OAAO,GAAG,IAAIlR,GAAJ,EAAhB;AACA,QAAMxS,KAAsC,GAAG,EAA/C;AAEA6mB,EAAAA,UAAU,CAACvX,OAAX,CAAoBqX,CAAD,IAAO;AACxB,QAAI,CAACA,CAAC,CAAC5mB,IAAH,IAAW2jB,OAAO,CAAC1T,GAAR,CAAY2W,CAAC,CAAC5mB,IAAF,CAAO7D,EAAnB,CAAf,EAAuC;AACvCwnB,IAAAA,OAAO,CAAC/R,GAAR,CAAYgV,CAAC,CAAC5mB,IAAF,CAAO7D,EAAnB;AACA8D,IAAAA,KAAK,CAACqI,IAAN,CAAW;AAAEnM,MAAAA,EAAE,EAAEyqB,CAAC,CAAC5mB,IAAF,CAAO7D,EAAb;AAAiBiE,MAAAA,KAAK,EAAEwmB,CAAC,CAAC5mB,IAAF,CAAOI;AAA/B,KAAX;AACD,GAJD;AAMA,SAAOH,KAAP;AACD,CAbD;;AAee,SAAS+mB,gBAAT,CACbja,GADa,EAEbiF,UAFa,EAGP;AACN,QAAMiV,QAAQ,GAAG,OACfze,IADe,EAEf0T,SAFe,EAGfpJ,YAHe,EAIfoU,OAJe,EAKfrW,OALe,KAMG;AAClB,UAAMsW,QAAQ,GAAGD,OAAO,CAAC7d,MAAR,CAAeP,eAAf,CAAjB;AACA,QAAIqe,QAAQ,CAACjb,MAAT,KAAoB,CAAxB,EAA2B;AAE3B,UAAM8F,UAAU,CAAC/K,WAAX,CAAuBmgB,iBAAvB,CAAyC9O,SAAzC,CAAmD;AACvD9P,MAAAA,IADuD;AAEvD6e,MAAAA,MAAM,EAAEnL,SAF+C;AAGvDrL,MAAAA,OAHuD;AAIvDrC,MAAAA,OAAO,EAAEsE,YAJ8C;AAKvDwU,MAAAA,MAAM,EAAEH;AAL+C,KAAnD,CAAN;AAOD,GAjBD;;AAmBApa,EAAAA,GAAG,CAACuT,EAAJ,CACE,CACE,qCADF;AAGE;AACA,yBAJF,CADF,EAOEP,wBAAwB,CAStB/N,UATsB,EAUrBC,OAAD,IAAsB;AACpB,QAAI8T,gBAAgB,CAAC9T,OAAO,CAACuK,OAAR,CAAgBxc,IAAjB,CAApB,EAA4C;AAC1C;AACA,aAAO,IAAP;AACD;;AACD,WAAO6lB,yBAAyB,CAAC5T,OAAD,CAAhC;AACD,GAhBqB,EAiBtB,OACE+B,WADF,EAEEzF,OAFF,EAGEkJ,WAHF,KAKoB;AAClB,UAAMhB,EAAE,GAAG,MAAMqG,OAAO,CAACvO,OAAD,EAAUyF,WAAW,CAAC6D,MAAtB,CAAxB;AACA,UAAM0P,MAAM,GAAG9Q,EAAE,CAACzW,IAAlB;AACA,QAAI,CAACunB,MAAL,EAAa;AACb,UAAM;AAAE/K,MAAAA;AAAF,QAAcjO,OAAO,CAAC0D,OAA5B;AACA,UAAMzJ,IAAI,GAAIgU,OAAD,CAAiBgL,sBAAjB,GACT,gBADS,GAET,eAFJ;AAIA,UAAMpc,IAAI,GAAGoR,OAAO,CAACpR,IAArB;AACA,QAAI,CAACA,IAAL,EAAW;AAEX,UAAMqc,cAAc,GAAGF,MAAM,CAACnnB,KAAP,KAAiBoc,OAAO,CAACxc,IAAR,CAAaI,KAArD;AACA,UAAM,CAAC0mB,UAAD,EAAa;AAAElD,MAAAA;AAAF,KAAb,IAA8B,MAAMzb,OAAO,CAACC,GAAR,CAAY,CACpDqe,aAAa,CAAClY,OAAD,EAAUiO,OAAV,CADuC,EAEpDkH,2BAA2B,CAACnV,OAAD,EAAUkJ,WAAV,CAFyB,CAAZ,CAA1C;AAKA,UAAM6M,SAAwB,GAAGV,SAAS,CAACva,MAAV,CAC9BsD,CAAD,IAAOA,CAAC,CAACxQ,EAAF,KAASorB,MAAM,CAACprB,EAAhB,IAAsBwQ,CAAC,CAACxQ,EAAF,KAASqgB,OAAO,CAACxc,IAAR,CAAa7D,EADpB,CAAjC;;AAIA,QAAIsa,EAAE,CAACtC,mBAAP,EAA4B;AAC1BmQ,MAAAA,SAAS,CAAChc,IAAV,CACE,GAAGmO,EAAE,CAACtC,mBAAH,CACA9K,MADA,CACQ8Y,EAAD,IAAQ;AACd,eACEA,EAAE,IACF,CAACmC,SAAS,CAACna,IAAV,CAAgBua,CAAD,IAAOA,CAAC,CAACvoB,EAAF,KAASgmB,EAAE,CAAChmB,EAAlC,CADD,IAEAgmB,EAAE,CAAChmB,EAAH,MAAWqgB,OAAO,CAACxc,IAAR,IAAgBwc,OAAO,CAACxc,IAAR,CAAa7D,EAAxC,CAFA,IAGAgmB,EAAE,CAAChmB,EAAH,KAAUorB,MAAM,CAACprB,EAJnB;AAMD,OARA,EASAkN,MATA,CASOT,aATP,EAUA5H,GAVA,CAUkBmhB,EAAD,KAAS;AACzBhmB,QAAAA,EAAE,EAAEgmB,EAAE,CAAChmB,EADkB;AAEzBiE,QAAAA,KAAK,EAAE+hB,EAAE,CAAC/hB,KAFe;AAGzBoI,QAAAA,IAAI,EAAE2Z,EAAE,CAAC3Z;AAHgB,OAAT,CAVjB,CADL;AAiBD;;AAED,UAAMkf,aAAa,GAAGX,gBAAgB,CAACD,UAAD,CAAhB,CAA6Bzd,MAA7B,CACnBsD,CAAD,IACEA,CAAC,CAACxQ,EAAF,KAASorB,MAAM,CAACprB,EAAhB,IACAwQ,CAAC,CAACxQ,EAAF,KAASqgB,OAAO,CAACxc,IAAR,CAAa7D,EADtB,IAEA,CAACmoB,SAAS,CAACna,IAAV,CAAgBua,CAAD,IAAOA,CAAC,CAACvoB,EAAF,KAASwQ,CAAC,CAACxQ,EAAjC,CAJiB,CAAtB;AAMA,UAAMkqB,QAAQ,GAAGQ,WAAW,CAACC,UAAD,CAAX,CAAwBzd,MAAxB,CACdoG,CAAD,IACEA,CAAC,KAAK8X,MAAM,CAACnnB,KAAb,IACAqP,CAAC,KAAK+M,OAAO,CAACxc,IAAR,CAAaI,KADnB,IAEA,CAACkkB,SAAS,CAACna,IAAV,CAAgBua,CAAD,IAAOA,CAAC,CAACtkB,KAAF,KAAYqP,CAAlC,CAFD,IAGA,CAACiY,aAAa,CAACvd,IAAd,CAAoBwC,CAAD,IAAOA,CAAC,CAACvM,KAAF,KAAYqP,CAAtC,CALY,CAAjB;AAQA,UAAM3B,OAAO,GAAG2J,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CAA0B0O,OAAO,CAACxc,IAAR,CAAaI,KAAvC,CAAhB;AACA,UAAMunB,KAAK,GAAGtC,YAAA,CAAwB5O,EAAxB,EAA4BgB,WAA5B,CAAd;AACA,UAAMuJ,YAAY,GAAGvJ,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CAA0ByZ,MAAM,CAACnnB,KAAjC,CAArB;AACA,UAAMwnB,WAAW,GAAGvC,UAAA,CAClB7I,OAAO,CAACsE,QADU,EAEjBtE,OAAD,CAAiBkK,cAAjB,GAAkC,SAAlC,GAA8C,WAF5B,CAApB;;AAKA,UAAMpB,aAAa,GAAIuC,OAAD,IAA+B;AACnD,YAAMrC,SAAS,GAAGqC,OAAO,GACrB,SADqB,GAEpB,GACC,CAACN,MAAM,IAAIA,MAAM,CAACprB,EAAlB,MAA0BqgB,OAAO,CAACxc,IAAR,CAAa7D,EAAvC,GACI,KADJ,GAEK,GAAE6kB,YAAa,IACrB,KANL;AAOA,aAAQ,oBAAmBlT,OAAQ,IAAG8Z,WAAY,OAAMpC,SAAU,IAAGmC,KAAM,EAA3E;AACD,KATD;;AAWA,UAAMG,aAAa,GAAG,EAAtB;AACA,UAAMC,gBAAgB,GAAG,EAAzB;AACA,UAAMC,cAAc,GAAG1B,mBAAmB,CACxC9J,OAAO,CAACpR,IADgC,EAEvCoR,OAAD,CAAiByL,UAAjB,KAAgC,IAFQ,CAA1C;AAIA,UAAMC,SAAS,GAAGpC,gBAAgB,CAACrO,WAAD,EAAc+E,OAAO,CAACxc,IAAtB,CAAlC;;AAEA,QAAI,CAACynB,cAAL,EAAqB;AACnB,YAAMU,YAAY,GAAGxC,oCAAoC,CACvDL,aAAa,CAAC,IAAD,CAD0C,EAEvD0C,cAFuD,CAAzD;AAKAF,MAAAA,aAAa,CAACxf,IAAd,CACEmP,WAAW,CAAC/H,KAAZ,CACG3B,WADH,CAEIma,SAAS,GAAG,iBAAH,GAAuB,YAFpC,EAGIX,MAAM,CAACprB,EAHX,EAIIorB,MAAM,CAACnnB,KAJX,EAKI+nB,YALJ,EAOGpT,IAPH,CAOS1W,GAAD,IACJ4oB,QAAQ,CACNze,IADM,EAENgU,OAAO,CAACrgB,EAFF,EAGNsb,WAAW,CAAC3E,YAHN,EAIN,CAACzU,GAAD,CAJM,EAKN8pB,YALM,CARZ,CADF;AAkBD;;AAED,UAAMtX,OAAO,GAAG8U,oCAAoC,CAClDL,aAAa,CAAC,KAAD,CADqC,EAElD0C,cAFkD,CAApD;AAKAD,IAAAA,gBAAgB,CAACzf,IAAjB,CACE,GAAGgc,SAAS,CAACtjB,GAAV,CAAeykB,QAAD,IACfhO,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACEma,SAAS,GAAG,wBAAH,GAA8B,mBADzC,EAEEzC,QAAQ,CAACtpB,EAFX,EAGEspB,QAAQ,CAACrlB,KAHX,EAIEyQ,OAJF,CADC,CADL;AAWAkX,IAAAA,gBAAgB,CAACzf,IAAjB,CACE,GAAGof,aAAa,CAAC1mB,GAAd,CAAmBhB,IAAD,IACnByX,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACE,mBADF,EAEE/N,IAAI,CAAC7D,EAFP,EAGE6D,IAAI,CAACI,KAHP,EAIEyQ,OAJF,CADC,CADL;;AAWA,QAAIwV,QAAQ,CAACna,MAAT,GAAkB,CAAtB,EAAyB;AACvB,YAAM8F,UAAU,CAAC/K,WAAX,CAAuBhH,KAAvB,CACHmP,OADG,CACK;AAAEhP,QAAAA,KAAK,EAAE;AAAEuI,UAAAA,GAAG,EAAE0d;AAAP;AAAT,OADL,EAEHtR,IAFG,CAEG9U,KAAD,IAAW;AACf8nB,QAAAA,gBAAgB,CAACzf,IAAjB,CACE,GAAGrI,KAAK,CAACe,GAAN,CAAW2L,CAAD,IACX8K,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACE,oBADF,EAEEpB,CAAC,CAAC9E,GAFJ,EAGE8E,CAAC,CAACvM,KAHJ,EAIEyQ,OAJF,CADC,CADL;AAUD,OAbG,CAAN;AAcD;;AAED,UAAM1I,OAAO,CAACC,GAAR,CAAY,CAChBD,OAAO,CAACC,GAAR,CAAY0f,aAAZ,CADgB,EAEhB3f,OAAO,CAACC,GAAR,CAAY2f,gBAAZ,EAA8BhT,IAA9B,CAAoCmS,OAAD,IACjCD,QAAQ,CACNze,IADM,EAENgU,OAAO,CAACrgB,EAFF,EAGNsb,WAAW,CAAC3E,YAHN,EAINoU,OAJM,EAKNrW,OALM,CADV,CAFgB,CAAZ,CAAN;AAYD,GA3LqB,CAP1B;AAqMD;;ACxRD,MAAMuX,mBAAmB,GAAG,OAG1B7Z,OAH0B,EAI1BmJ,mBAJ0B,EAK1B2Q,OAL0B,KAMR;AAClB,QAAM9Z,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuB2O,aAAvB,CACJ/Z,OAAO,CAACvC,IAAR,CAAa;AACXoQ,IAAAA,UAAU,EAAE1E,mBAAmB,CAAC+E,YAApB,CAAiCP,SADlC;AAEX9Q,IAAAA,IAAI,EAAEid;AAFK,GAAb,CADI,CAAN;AAMA3Q,EAAAA,mBAAmB,CAACsC,WAApB,GAAkCqO,OAAlC;AACD,CAdD;;AAgBO,MAAME,2BAA2B,GAAG,OAGzCha,OAHyC,EAIzCmJ,mBAJyC,EAKzC2Q,OALyC,KAMvB;AAClB,MAAI3Q,mBAAmB,CAACsC,WAApB,KAAoCqO,OAAxC,EAAiD;AAC/C,UAAMD,mBAAmB,CAAC7Z,OAAD,EAAUmJ,mBAAV,EAA+B2Q,OAA/B,CAAzB;AACD;AACF,CAVM;AAYA,MAAMG,0BAA0B,GAAG,OAGxCja,OAHwC,EAIxCkJ,WAJwC,EAKxCC,mBALwC,EAMxCyD,aANwC,KAOtB;AAClB,QAAM;AAAEnB,IAAAA,WAAW,EAAEqO;AAAf,MAA2B7M,oBAAoB,CACnDjN,OAAO,CAAC0D,OAAR,CAAgBpG,UAAhB,CAA2BiV,QADwB,EAEnDrJ,WAAW,CAACvW,MAAZ,CAAmBiB,MAAnB,CAA0BC,IAFyB,EAGnDsV,mBAAmB,CAACsC,WAH+B,EAInDvC,WAAW,CAACvW,MAAZ,CAAmBI,gBAJgC,EAKnD6Z,aALmD,CAArD;AAQA,QAAMoN,2BAA2B,CAACha,OAAD,EAAUmJ,mBAAV,EAA+B2Q,OAA/B,CAAjC;AACD,CAjBM;;ACxBQ,eAAeI,SAAf,CAGbzU,WAHa,EAIbzF,OAJa,EAKbma,eALa,EAMbpS,KANa,EAObqS,UAAU,GAAGvS,YAAY,CAACpC,WAAW,CAAC7R,MAAb,EAAqBmU,KAArB,CAPZ,EAQb;AAAEsS,EAAAA,QAAF;AAAYC,EAAAA;AAAZ,IAAwC,EAR3B,EASE;AACf,MAAIF,UAAU,IAAI,CAACD,eAAnB,EAAoC;AAClC,UAAMna,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuB2J,WAAvB,CACJ/U,OAAO,CAACjL,KAAR,CAAc;AAAEjB,MAAAA,IAAI,EAAEiU,KAAK,CAACjU;AAAd,KAAd,CADI,CAAN;AAGA,QAAIumB,QAAJ,EAAc,MAAMA,QAAQ,EAAd;AACf;;AACD,MAAIF,eAAe,IAAI,CAACC,UAAxB,EAAoC;AAClC,UAAMG,QAAQ,GAAG,MAAMva,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuByJ,SAAvB,CACrB7U,OAAO,CAACjL,KAAR,CAAc;AAAEnB,MAAAA,MAAM,EAAE,CAACmU,KAAK,CAACjU,IAAP;AAAV,KAAd,CADqB,CAAvB;AAGA,QAAIwmB,KAAJ,EAAW,MAAMA,KAAK,CAACC,QAAQ,CAAC3oB,IAAV,CAAX;AACZ;AACF;;ACnBM,MAAM4oB,kBAAkB,GAAG,CAChCtR,WADgC,EAEhCzD,WAFgC,KAGpB;AACZ,QAAMgV,cAAc,GAAGvR,WAAW,CAACtV,MAAZ,CAAmB,iBAAnB,CAAvB;AACA,QAAM8mB,WAAW,GAAGxR,WAAW,CAACtV,MAAZ,CAAmB,eAAnB,CAApB;AAEA,QAAM+mB,gBAAgB,GAAG9S,YAAY,CAACpC,WAAW,CAAC7R,MAAb,EAAqB8mB,WAArB,CAArC;AACA,QAAME,mBAAmB,GAAG/S,YAAY,CAACpC,WAAW,CAAC7R,MAAb,EAAqB6mB,cAArB,CAAxC;AAEA,SAAO,EACL,GAAGvR,WAAW,CAACvW,MAAZ,CAAmBI,gBADjB;AAELE,IAAAA,mBAAmB,EAAE0nB,gBAFhB;AAGL3nB,IAAAA,SAAS,EAAE4nB;AAHN,GAAP;AAKD,CAfM;AAiBA,MAAMC,gCAAgC,GAAG,OAC9CpV,WAD8C,EAE9CzF,OAF8C,EAG9CkJ,WAH8C,EAI9CC,mBAJ8C,KAK5B;AAClB,QAAMsR,cAAc,GAAGvR,WAAW,CAACtV,MAAZ,CAAmB,iBAAnB,CAAvB;AACA,QAAM8mB,WAAW,GAAGxR,WAAW,CAACtV,MAAZ,CAAmB,eAAnB,CAApB;AAEA,QAAM+mB,gBAAgB,GAAG9S,YAAY,CAACpC,WAAW,CAAC7R,MAAb,EAAqB8mB,WAArB,CAArC;AACA,QAAME,mBAAmB,GAAG/S,YAAY,CAACpC,WAAW,CAAC7R,MAAb,EAAqB6mB,cAArB,CAAxC;AAEA,QAAM;AAAEhP,IAAAA,WAAF;AAAe5E,IAAAA;AAAf,MAA2BoG,oBAAoB,CACnDjN,OAAO,CAAC0D,OAAR,CAAgBpG,UAAhB,CAA2BiV,QADwB,EAEnDrJ,WAAW,CAACvW,MAAZ,CAAmBiB,MAAnB,CAA0BC,IAFyB,EAGnDsV,mBAAmB,CAACsC,WAH+B,EAInD+O,kBAAkB,CAACtR,WAAD,EAAczD,WAAd,CAJiC,CAArD;AAOA,QAAMuU,2BAA2B,CAACha,OAAD,EAAUmJ,mBAAV,EAA+BsC,WAA/B,CAAjC;;AAEA,MAAI5E,OAAO,IAAI4T,cAAf,EAA+B;AAC7B,UAAM7gB,OAAO,CAACC,GAAR,CAAY,CAChB6gB,WAAW,IACTR,SAAS,CACPzU,WADO,EAEPzF,OAFO,EAGP6G,OAAO,CAAC5T,mBAHD,EAIPynB,WAJO,EAKPC,gBALO,CAFK,EAShBF,cAAc,IACZP,SAAS,CACPzU,WADO,EAEPzF,OAFO,EAGP6G,OAAO,CAAC7T,SAHD,EAIPynB,cAJO,EAKPG,mBALO,EAMP;AACEN,MAAAA,KAAK,EAAE,MAAOxS,QAAP,IAAoB;AACzB,cAAMmB,mBAAmB,CACvBxD,WADuB,EAEvBzF,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,EAKvBrB,QALuB,CAAzB;AAOD,OATH;AAUEuS,MAAAA,QAAQ,EAAE,MAAM;AACdnR,QAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,eAHF;AAKD;AAhBH,KANO,CAVK,CAAZ,CAAN;AAoCD;AACF,CA3DM;;ACnBQ,SAASwR,wBAAT,CACbtc,GADa,EAEbiF,UAFa,EAGP;AACNjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,CACE,oCADF,EAEE,qCAFF;AAIE;AACA,wBALF,EAME,uBANF,CADF,EASEP,wBAAwB,CAStB/N,UATsB,EAUrBC,OAAD,IAAa;AACX,QAAI8T,gBAAgB,CAAC9T,OAAO,CAACkT,MAAT,CAApB,EAAsC;AACpC;AACA,aAAO,IAAP;AACD;;AACD,WAAOU,yBAAyB,CAAC5T,OAAD,CAAhC;AACD,GAhBqB,EAiBtB,OACE+B,WADF,EAEEzF,OAFF,EAGEkJ,WAHF,EAIEC,mBAJF,KAKoB;AAClB,UAAM;AAAE8E,MAAAA;AAAF,QAAcjO,OAAO,CAAC0D,OAA5B;;AAEA,QACEyF,mBAAmB,KAAK,IAAxB,IACAnJ,OAAO,CAAC0D,OAAR,CAAgBiG,MAAhB,KAA2B,QAD3B,IAEA6N,gBAAgB,CAACvJ,OAAO,CAACxc,IAAT,CAHlB,EAIE;AACA,YAAMygB,SAAS,GAAG,MAAM3D,OAAO,CAACvO,OAAD,EAAUyF,WAAW,CAAC6D,MAAtB,CAA/B;;AACA,UAAI,CAAC4I,SAAS,CAAC6I,SAAf,EAA0B;AACxB,cAAMF,gCAAgC,CACpC3I,SADoC,EAEpClS,OAFoC,EAGpCkJ,WAHoC,EAIpCC,mBAJoC,CAAtC;AAMD;;AACD;AACD;;AAED,UAAMlP,IAAI,GAAIgU,OAAD,CAAiBgL,sBAAjB,GACT,gBADS,GAET,eAFJ;AAIA,UAAM+B,QAAQ,GAAG;AACf,oBAAc9R,WAAW,CAACjJ,OAAZ,CAAoB3G,GADnB;AAEf,sBAAgB4P,WAAW,CAAC1E,WAFb;AAGfvK,MAAAA,IAHe;AAIf6e,MAAAA,MAAM,EAAE7K,OAAO,CAACrgB;AAJD,KAAjB;AAOA,UAAMqtB,YAAY,GAAG,MAAMxX,UAAU,CAAC/K,WAAX,CAAuBmgB,iBAAvB,CAAyChY,OAAzC,CACzBma,QADyB,CAA3B;AAIA,QAAIC,YAAY,CAACtd,MAAb,KAAwB,CAA5B,EAA+B;;AAE/B,QAAIqC,OAAO,CAAC0D,OAAR,CAAgBiG,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,YAAM/P,OAAO,CAACC,GAAR,CAAY,CAChBD,OAAO,CAACC,GAAR,CACEohB,YAAY,CAACxoB,GAAb,CAAkByoB,WAAD,IACfthB,OAAO,CAACC,GAAR,CACEqhB,WAAW,CAACnC,MAAZ,CAAmBtmB,GAAnB,CAAwBsmB,MAAD,IACrB7P,WAAW,CAAC/H,KAAZ,CAAkBxB,aAAlB,CAAgCoZ,MAAM,CAAC/V,EAAvC,EAA2C+V,MAAM,CAAClX,OAAlD,CADF,CADF,CADF,CADF,CADgB,EAUhB4B,UAAU,CAAC/K,WAAX,CAAuBmgB,iBAAvB,CAAyC3e,UAAzC,CAAoD8gB,QAApD,CAVgB,CAAZ,CAAN;AAYD,KAbD,MAaO;AACL,YAAMlY,eAAe,GAAG,CACtBqU,wBAAwB,CACtBY,mBAAmB,CACjB9J,OAAO,CAACpR,IADS,EAEhBoR,OAAD,CAAiByL,UAAjB,KAAgC,IAFf,CADG,CADF,CAAxB;AASA,YAAM9f,OAAO,CAACC,GAAR,CAAY,CAChBD,OAAO,CAACC,GAAR,CACEohB,YAAY,CAACxoB,GAAb,CAAkByoB,WAAD,IACfthB,OAAO,CAACC,GAAR,CACEqhB,WAAW,CAACnC,MAAZ,CAAmBtmB,GAAnB,CAAwBsmB,MAAD,IACrB7P,WAAW,CAAC/H,KAAZ,CAAkBzB,aAAlB,CAAgCqZ,MAAM,CAAC/V,EAAvC,EAA2C+V,MAAM,CAAClX,OAAlD,EAA2D,EACzD,GAAGqZ,WAAW,CAAC5Y,OAD0C;AAEzDQ,QAAAA;AAFyD,OAA3D,CADF,CADF,CADF,CADF,CADgB,EAahBW,UAAU,CAAC/K,WAAX,CAAuBmgB,iBAAvB,CAAyC9d,iBAAzC,CACEigB,QADF,EAEE;AAAEhe,QAAAA,IAAI,EAAE;AAAE,qCAA2B8F;AAA7B;AAAR,OAFF,CAbgB,CAAZ,CAAN;AAkBD;AACF,GArGqB,CAT1B;AAiHD;;AChHM,MAAMqY,yBAAyB,GAAG,OAGvC1V,WAHuC,EAIvCzF,OAJuC,EAKvCkJ,WALuC,EAMvCC,mBANuC,EAOvCsC,WAAW,GAAGtC,mBAAmB,CAACsC,WAPK,KAQrB;AAClB;AACA;AAEA,QAAM2P,OAAO,GAAG,MAAMpb,OAAO,CAAC9G,OAAR,CAAgBO,QAAhB,CACpBuG,OAAO,CAAC9G,OAAR,CAAgB6R,KAAhB,CAAsBsQ,WADF,EAEpBrb,OAAO,CAACyF,WAAR,CAAoB;AAClB;AACAjI,IAAAA,QAAQ,EAAE;AAFQ,GAApB,CAFoB,EAMnB1N,GAAD,IAASA,GAAG,CAAC8B,IANO,CAAtB;AASA,QAAM0pB,mBAAmB,GAAG,MAAM1hB,OAAO,CAACC,GAAR,CAChCuhB,OAAO,CAAC3oB,GAAR,CAAa4lB,CAAD,IAAOZ,cAAK,CAACY,CAAC,CAACkD,MAAF,CAASjZ,OAAV,CAAxB,CADgC,CAAlC;AAIA,QAAMkZ,sBAAgD,GAAG,EAAzD;AACAF,EAAAA,mBAAmB,CAACta,OAApB,CAA4B,CAACqX,CAAD,EAAIoD,KAAJ,KAAc;AACxC,UAAMC,oBAAoB,GAAGrD,CAAC,CAACsD,KAAF,CAAQ7gB,MAAR,CAC1B8gB,IAAD,IAAUA,IAAI,CAACxtB,KAAL,KAAe,iBADE,CAA7B;;AAGA,QAAIstB,oBAAoB,CAAC/d,MAArB,GAA8B,CAAlC,EAAqC;AACnC6d,MAAAA,sBAAsB,CAACzhB,IAAvB,CAA4B;AAC1BwhB,QAAAA,MAAM,EAAEH,OAAO,CAACK,KAAD,CADW;AAE1BC,QAAAA;AAF0B,OAA5B;AAID;AACF,GAVD;AAYA,QAAMG,oBAAoB,GAAG3S,WAAW,CAACtV,MAAZ,CAAmB,kBAAnB,CAA7B;AACA,QAAMkoB,cAAc,GAAG1O,6BAA6B,CAClD3B,WADkD,EAElD+P,sBAAsB,CAAC7d,MAAvB,KAAkC,CAAlC,GACI,EADJ,GAEK,sBAAqB6d,sBAAsB,CACzC/oB,GADmB,CACf,CAAC;AAAE8oB,IAAAA,MAAF;AAAUG,IAAAA;AAAV,GAAD,KACHA,oBAAoB,CAACjpB,GAArB,CACGmpB,IAAD,IAAW,KAAIA,IAAI,CAACjZ,IAAL,CAAU+E,OAAV,CAAkB,IAAlB,EAAwB,GAAxB,CAA6B,KAAI6T,MAAM,CAAChT,GAAI,GAD7D,CAFkB,EAMnBiE,IANmB,CAMd,EANc,CAMV,EAVkC,CAApD;AAaA,QAAM5S,OAAO,CAACC,GAAR,CAAY,CAChBqgB,SAAS,CACPzU,WADO,EAEPzF,OAFO,EAGPwb,sBAAsB,CAAC7d,MAAvB,KAAkC,CAH3B,EAIPke,oBAJO,CADO,EAOhB7B,2BAA2B,CAACha,OAAD,EAAUmJ,mBAAV,EAA+B2S,cAA/B,CAPX,CAAZ,CAAN,CA5CkB;AAuDnB,CA/DM;;ACRP,MAAMC,aAAa,GAAIpZ,IAAD,IACpB,CAACA,IAAD,GAAQ,EAAR,GAAaA,IAAI,CAAC+E,OAAL,CAAa,OAAb,EAAsB,IAAtB,CADf;;AAEA,MAAMsU,cAAc,GAAG,CAACC,KAAD,EAAuBC,KAAvB,KACrBH,aAAa,CAACE,KAAD,CAAb,KAAyBF,aAAa,CAACG,KAAD,CADxC;;AAGO,MAAMC,gBAAgB,GAAG,OAG9B1W,WAH8B,EAI9BzF,OAJ8B,EAK9BkD,MAL8B,KAMZ;AAClB,QAAMkZ,cAAc,GAAGlZ,MAAM,CAAC9U,KAAP,IAAgBqX,WAAW,CAACrX,KAAZ,KAAsB8U,MAAM,CAAC9U,KAApE;AACA,QAAMiuB,aAAa,GACjBnZ,MAAM,CAACrG,IAAP,IAAemf,cAAc,CAACvW,WAAW,CAAC5I,IAAb,EAAmBqG,MAAM,CAACrG,IAA1B,CAD/B;;AAGA,MAAIuf,cAAc,IAAIC,aAAtB,EAAqC;AACnC,UAAMC,IAA+C,GAAG,EAAxD;;AACA,QAAIF,cAAJ,EAAoB;AAClBE,MAAAA,IAAI,CAACluB,KAAL,GAAa8U,MAAM,CAAC9U,KAApB;AACAqX,MAAAA,WAAW,CAACrX,KAAZ,GAAoB8U,MAAM,CAAC9U,KAA3B;AACD;;AACD,QAAIiuB,aAAJ,EAAmB;AACjBC,MAAAA,IAAI,CAACzf,IAAL,GAAYqG,MAAM,CAACrG,IAAnB;AACA4I,MAAAA,WAAW,CAAC5I,IAAZ,GAAmBqG,MAAM,CAACrG,IAA1B;AACD;;AAED,UAAMmD,OAAO,CAAC9G,OAAR,CAAgB6R,KAAhB,CAAsB7H,MAAtB,CACJlD,OAAO,CAACvC,IAAR,CAAa;AACXuN,MAAAA,WAAW,EAAEvF,WAAW,CAAC6D,MADd;AAEX,SAAGgT;AAFQ,KAAb,CADI,CAAN;AAMD;AACF,CA7BM;;ACdA,MAAMC,UAAU,GAAInuB,KAAD,IACxBA,KAAK,CACFuZ,IADH,GAEGD,OAFH,CAGI,qDAHJ,EAII,CAAC8U,CAAD,EAAIC,IAAJ,EAAUC,IAAV,KAAoB,IAAGD,IAAI,CAAChH,WAAL,EAAmB,IAAGiH,IAAK,EAJtD,EAMGhV,OANH,CAMW,qBANX,EAMkC,CAAC8U,CAAD,EAAIC,IAAJ,KAAc,GAAEA,IAAI,CAACE,WAAL,EAAmB,IANrE,EAOGjV,OAPH,CAOW,oBAPX,EAOiC,YAPjC,EAQGA,OARH,CAQW,iCARX,EAQ8C,aAR9C,EASGA,OATH,CASW,4BATX,EASyC,IATzC,CADK;;ACkCA,MAAMkV,YAAY,GAAG,OAG1BnX,WAH0B,EAI1BzF,OAJ0B,EAK1BkJ,WAL0B,EAM1BC,mBAN0B,EAO1B0T,4BAP0B,EAQ1B3J,WAR0B,KASR;AAClB,QAAM9kB,KAAK,GAAG8a,WAAW,CAACvW,MAAZ,CAAmBE,SAAnB,GACV0pB,UAAU,CAAC9W,WAAW,CAACrX,KAAb,CADA,GAEVqX,WAAW,CAACrX,KAFhB;AAIA,QAAM0uB,WAAW,GAAGrX,WAAW,CAAChU,IAAZ,IAAoBgU,WAAW,CAAChU,IAAZ,CAAiBwI,IAAjB,KAA0B,KAAlE;AAEA,QAAM+O,QAAkB,GAAG,EAA3B;AAEA,QAAM+T,SAAS,GAAG7T,WAAW,CAACvW,MAAZ,CAAmBQ,OAAnB,CAA2B/E,KAA3B,CAAiCwN,IAAjC,CAAuCohB,IAAD,IAAU;AAChE,QAAIA,IAAI,CAACroB,GAAL,KAAa,KAAb,IAAsBmoB,WAA1B,EAAuC,OAAO,KAAP;AAEvC,UAAMhoB,KAAK,GAAGkoB,IAAI,CAAC5pB,MAAL,CAAYiM,IAAZ,CAAiBjR,KAAjB,CAAd;;AACA,QAAI0G,KAAK,KAAK,IAAd,EAAoB;AAClB,UAAIkoB,IAAI,CAACpoB,MAAT,EAAiB;AACfoU,QAAAA,QAAQ,CAACjP,IAAT,CAAc;AAAEjG,UAAAA,IAAI,EAAEkpB,IAAI,CAACpoB,MAAb;AAAqB3D,UAAAA,KAAK,EAAE+rB,IAAI,CAAC/rB;AAAjC,SAAd;AACD;;AACD,aAAO,IAAP;AACD;;AAED,QAAI+rB,IAAI,CAACpoB,MAAL,IAAeooB,IAAI,CAACnoB,mBAAxB,EAA6C;AAC3CmU,MAAAA,QAAQ,CAACjP,IAAT,CAAc;AACZjG,QAAAA,IAAI,EAAEkpB,IAAI,CAACpoB,MADC;AAEZgQ,QAAAA,IAAI,EAAEoY,IAAI,CAACnoB,mBAAL,CAAyBC,KAAzB;AAFM,OAAd;AAIA,aAAO,KAAP;AACD;;AAED,WAAO,KAAP;AACD,GApBiB,CAAlB;AAsBA,QAAMmoB,IAAI,GAAG,IAAIlrB,IAAJ,GAAWyhB,WAAX,EAAb;AAEA,QAAM0J,cAAc,GAAG,CACrB,MAAMld,OAAO,CAAC9G,OAAR,CAAgBiP,MAAhB,CAAuBC,UAAvB,CACJpI,OAAO,CAACvC,IAAR,CAAa;AACX4K,IAAAA,GAAG,EAAE5C,WAAW,CAAC6C,IAAZ,CAAiBC;AADX,GAAb,CADI,CADe,EAMrB3W,IANqB,CAMhB6W,UANgB,CAML7M,IANK,CAOpB8M,KAAD,IAAoBA,KAAK,CAAC5U,IAAN,KAAgB,GAAE1G,OAAO,CAACC,GAAR,CAAYgB,eAAgB,UAP7C,CAAvB;AAUA,QAAM8uB,QAA4B,GAAG,CACnC,GAAGnU,QAAQ,CAACvW,GAAT,CACD,CAAC;AAAEqB,IAAAA,IAAF;AAAQ7C,IAAAA,KAAR;AAAe2T,IAAAA;AAAf,GAAD,KACEkO,YAAY,CACV9S,OADU,EAEVlM,IAFU,EAGV2R,WAAW,CAAC6C,IAAZ,CAAiBC,GAHP,EAIVtX,KAAK,GAAG,SAAH,GAAe,SAJV,EAKVA,KAAK,GAAGA,KAAK,CAAC7C,KAAT,GAAkBwW,IAAD,CAAqBxW,KALjC,EAMV6C,KAAK,GAAGhB,SAAH,GAAgB2U,IAAD,CAAqB3P,GAN/B,CAFb,CADgC,EAYnC,IAAIie,WAAW,GACXlK,QAAQ,CACLvW,GADH,CACO,CAAC;AAAEqB,IAAAA,IAAF;AAAQ7C,IAAAA,KAAR;AAAe2T,IAAAA;AAAf,GAAD,KACH3T,KAAK,GACD6hB,YAAY,CACV9S,OADU,EAEVlM,IAFU,EAGVof,WAHU,EAIV,SAJU,EAKV,8BALU,CADX,GAQDjjB,SAVR,EAYG6K,MAZH,CAYUT,aAZV,CADW,GAcX,EAdJ,CAZmC,EA2BnC6iB,cAAc,IACZld,OAAO,CAAC9G,OAAR,CAAgBiP,MAAhB,CAAuBza,MAAvB,CACEsS,OAAO,CAACvC,IAAR,CAAa;AACX3J,IAAAA,IAAI,EAAG,GAAE1G,OAAO,CAACC,GAAR,CAAYgB,eAAgB,UAD1B;AAEX+kB,IAAAA,QAAQ,EAAE3N,WAAW,CAAC6C,IAAZ,CAAiBC,GAFhB;AAGX3T,IAAAA,MAAM,EAAE,WAHG;AAIX+T,IAAAA,UAAU,EAAGoU,SAAS,GAAG,SAAH,GAAe,SAJ1B;AAOX1J,IAAAA,UAAU,EAAE4J,IAPD;AAQX1J,IAAAA,YAAY,EAAE0J,IARH;AASXxJ,IAAAA,MAAM,EAAEsJ,SAAS,GACbA,SAAS,CAAC9rB,KADG,GAEb;AACE7C,MAAAA,KAAK,EAAE,oBADT;AAEEiF,MAAAA,OAAO,EAAE;AAFX;AAXO,GAAb,CADF,CA5BiC,EA8CnC,CAAC6pB,cAAD,IAAmBhK,WAAnB,IAAkC6J,SAAlC,GACIjK,YAAY,CACV9S,OADU,EAEV,SAFU,EAGVkT,WAHU,EAIV,SAJU,EAKV,8BALU,CADhB,GAQIjjB,SAtD+B,EAuDnC,CAACitB,cAAD,IACEpK,YAAY,CACV9S,OADU,EAEV,SAFU,EAGVyF,WAAW,CAAC6C,IAAZ,CAAiBC,GAHP,EAIVwU,SAAS,GAAG,SAAH,GAAe,SAJd,EAKVA,SAAS,GAAGA,SAAS,CAAC9rB,KAAV,CAAgB7C,KAAnB,GAA2B,oBAL1B,CAxDqB,EA+DnC0M,MA/DmC,CA+D5BT,aA/D4B,CAArC;AAiEA,QAAMwC,IAAI,GAAGwQ,kCAAkC,CAAC5H,WAAW,CAAC5I,IAAb,CAA/C;AACAsgB,EAAAA,QAAQ,CAACpjB,IAAT,CAAcoiB,gBAAgB,CAAC1W,WAAD,EAAczF,OAAd,EAAuB;AAAE5R,IAAAA,KAAF;AAASyO,IAAAA;AAAT,GAAvB,CAA9B;AAEA,QAAMugB,gBAAgB,GAAGpU,QAAQ,CAC9BlO,MADsB,CACdlG,MAAD;AAAA;;AAAA,2BAAYA,MAAM,CAACgQ,IAAnB,iDAAY,aAAa5P,MAAzB;AAAA,GADe,EAEtBvC,GAFsB,CAEjBmC,MAAD,IAAYA,MAAM,CAACgQ,IAFD,CAAzB;AAIA,QAAMyY,uBAAuB,GAC3BlU,mBAAmB,CAACsC,WAApB,KAAoCM,kBADtC;AAGA,QAAM+N,OAAO,GAAGuD,uBAAuB,GACnCrQ,iBAAiB,CACfhN,OAAO,CAAC0D,OAAR,CAAgBpG,UAAhB,CAA2BiV,QADZ,EAEfrJ,WAAW,CAACvW,MAAZ,CAAmBiB,MAAnB,CAA0BC,IAFX,EAGf2mB,kBAAkB,CAACtR,WAAD,EAAczD,WAAd,CAHH,EAIf2X,gBAJe,CADkB,GAOnCjQ,sBAAsB,CAAChE,mBAAmB,CAACsC,WAArB,EAAkC2R,gBAAlC,CAP1B;;AASA,MAAIC,uBAAuB,IAAIR,4BAA/B,EAA6D;AAC3DM,IAAAA,QAAQ,CAACpjB,IAAT,CACEohB,yBAAyB,CACvB1V,WADuB,EAEvBzF,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,EAKvB2Q,OALuB,CAD3B;AASD,GAVD,MAUO;AACLqD,IAAAA,QAAQ,CAACpjB,IAAT,CACEigB,2BAA2B,CAACha,OAAD,EAAUmJ,mBAAV,EAA+B2Q,OAA/B,CAD7B;AAGD;;AAED,QAAMlgB,OAAO,CAACC,GAAR,CAAYsjB,QAAZ,CAAN;AACD,CAzJM;;AC1BQ,SAASG,MAAT,CAAgB9e,GAAhB,EAA6BiF,UAA7B,EAA2D;AACxEjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,qBADF,EAEEP,wBAAwB,CACtB/N,UADsB,EAEtB,CAACC,OAAD,EAAU1D,OAAV,EAAmBkJ,WAAnB,KAAmC;AACjC,QAAIA,WAAW,CAACsG,YAAhB,EAA8B,OAAO,IAAP;AAC9B,WAAO9L,OAAO,CAAC2S,YAAf;AACD,GALqB,EAMtB,OACE5Q,WADF,EAEEzF,OAFF,EAGEkJ,WAHF,EAIEC,mBAJF,KAKoB;AAClB,QAAIA,mBAAmB,IAAI,IAA3B,EAAiC;AAEjC,UAAMyN,MAAM,GAAG5W,OAAO,CAAC0D,OAAR,CAAgBkT,MAA/B;;AACA,QAAIY,gBAAgB,CAACZ,MAAD,CAApB,EAA8B;AAC5B;AACD;;AAED,UAAM2G,kBAAkB,GAAG,MAAMhP,OAAO,CACtCvO,OADsC,EAEtCA,OAAO,CAAC0D,OAAR,CAAgB2S,YAAhB,CAA6B/M,MAFS,CAAxC;AAKA,UAAMsT,YAAY,CAChBW,kBADgB,EAEhBvd,OAFgB,EAGhBkJ,WAHgB,EAIhBC,mBAJgB,EAKhB,KALgB,CAAlB;AAOA,UAAMF,mBAAmB,CACvBsU,kBADuB,EAEvBvd,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,GArCqB,CAF1B;AA0CD;;AChDM,MAAMqU,YAAY,GAAG,OAC1B/X,WAD0B,EAE1BzF,OAF0B,EAG1BnO,KAH0B,KAIR;AAAA;;AAClBmO,EAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CAAiB,eAAjB,EAAkC;AAChC0D,IAAAA,IAAI,EAAE7C,WAAW,CAAC6C,IAAZ,CAAiBD,GADS;AAEhCiD,IAAAA,IAAI,EAAE7F,WAAW,CAAC6F,IAAZ,CAAiBjD;AAFS,GAAlC;AAKA,QAAMhX,MAAM,GAAG,MAAM2O,OAAO,CAAC9G,OAAR,CAAgBqE,KAAhB,CAClBgO,KADkB,CACZ;AACL7N,IAAAA,KAAK,EAAE+H,WAAW,CAAC6C,IAAZ,CAAiB7K,IAAjB,CAAsBC,KAAtB,CAA4B7L,KAD9B;AAEL4L,IAAAA,IAAI,EAAEgI,WAAW,CAAC6C,IAAZ,CAAiB7K,IAAjB,CAAsB3J,IAFvB;AAGLwU,IAAAA,IAAI,EAAE7C,WAAW,CAAC6F,IAAZ,CAAiBjD,GAHlB;AAILiD,IAAAA,IAAI,EAAE7F,WAAW,CAAC6C,IAAZ,CAAiBD;AAJlB,GADY,EAOlBlM,KAPkB,CAOXC,GAAD,KAAU;AAAEnL,IAAAA,KAAK,EAAEmL;AAAT,GAAV,CAPY,CAArB;AASA4D,EAAAA,OAAO,CAACuC,GAAR,CAAYqC,IAAZ,CACE;AACEhQ,IAAAA,MAAM,EAAEvD,MAAM,CAACuD,MADjB;AAEE2T,IAAAA,GAAG,kBAAElX,MAAM,CAACO,IAAT,iDAAE,aAAa2W,GAFpB;AAGEtX,IAAAA,KAAK,EAAEI,MAAM,CAACJ;AAHhB,GADF,EAME,sBANF;;AASA,MAAII,MAAM,CAACuD,MAAP,KAAkB,GAAtB,EAA2B;AACzBoL,IAAAA,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuBqC,aAAvB,CACEzN,OAAO,CAACvC,IAAR,CAAa;AACX4N,MAAAA,YAAY,EAAE5F,WAAW,CAAC6D,MADf;AAEXzM,MAAAA,IAAI,EAAG,IAAGhL,KAAM;AAFL,KAAb,CADF;AAMD,GAPD,MAOO,IAAIR,MAAM,CAACuD,MAAP,KAAkB,GAAtB,EAA2B;AAChCoL,IAAAA,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuBqC,aAAvB,CACEzN,OAAO,CAACvC,IAAR,CAAa;AACX4N,MAAAA,YAAY,EAAE5F,WAAW,CAAC6D,MADf;AAEXzM,MAAAA,IAAI,EAAG,IAAGhL,KAAM;AAFL,KAAb,CADF;AAMD,GAPM,MAOA,IAAI,CAACR,MAAD,IAAW,CAACA,MAAM,CAACO,IAAnB,IAA2B,CAACP,MAAM,CAACO,IAAP,CAAY2W,GAA5C,EAAiD;AACtDvI,IAAAA,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuBqC,aAAvB,CACEzN,OAAO,CAACvC,IAAR,CAAa;AACX4N,MAAAA,YAAY,EAAE5F,WAAW,CAAC6D,MADf;AAEXzM,MAAAA,IAAI,EAAG,IAAGhL,KAAM;AAFL,KAAb,CADF;AAMD,GAPM,MAOA;AACLmO,IAAAA,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuBqC,aAAvB,CACEzN,OAAO,CAACvC,IAAR,CAAa;AACX4N,MAAAA,YAAY,EAAE5F,WAAW,CAAC6D,MADf;AAEXzM,MAAAA,IAAI,EAAG,IAAGhL,KAAM,oBAAmBR,MAAM,CAACO,IAAP,CAAY2W,GAAI;AAFxC,KAAb,CADF;AAMD;AACF,CAzDM;;ACSP,MAAMkV,cAAc,GAClB/Z,OADqB,IAET;AACZ,QAAMkT,MAAM,GAAGlT,OAAO,CAACkT,MAAvB;AACA,SACEA,MAAM,CAAC3c,IAAP,KAAgB,KAAhB,IACA2c,MAAM,CAAC/kB,KAAP,KAAiB,eADjB,IAEA6R,OAAO,CAAC2S,YAAR,CAAqB/N,IAArB,CAA0BD,GAA1B,CAA8BlJ,UAA9B,CAAyC,WAAzC,CAHF;AAKD,CATD;;AAWe,SAASue,aAAT,CACblf,GADa,EAEbiF,UAFa,EAGP;AACNjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,CAAC,sBAAD,EAAyB,wBAAzB,CADF,EAEEP,wBAAwB,CAItB/N,UAJsB,EAKtB,CAACC,OAAD,EAAU1D,OAAV,EAAmBkJ,WAAnB,KAAmC;AACjC,QAAIxF,OAAO,CAACkT,MAAR,CAAe3c,IAAf,KAAwB,KAAxB,IAAiC,CAACwjB,cAAc,CAAC/Z,OAAD,CAApD,EAA+D;AAC7D,aAAO,IAAP;AACD;;AAED,QAAIwF,WAAW,CAACsG,YAAhB,EAA8B,OAAO,IAAP;AAE9B,WAAO9L,OAAO,CAAC2S,YAAf;AACD,GAbqB,EActB,OAAO5Q,WAAP,EAAoBzF,OAApB,EAA6BkJ,WAA7B,EAA0CC,mBAA1C,KAAkE;AAChE,QAAIA,mBAAmB,KAAK,IAA5B,EAAkC;AAElC,UAAMwU,YAAY,GAAGF,cAAc,CAACzd,OAAO,CAAC0D,OAAT,CAAnC;AACA,UAAMwO,SAAS,GAAG,MAAM3D,OAAO,CAACvO,OAAD,EAAUyF,WAAW,CAAC6D,MAAtB,CAA/B;AAEA,UAAMvB,KAAK,GAAI/H,OAAO,CAAC0D,OAAT,CAAyBqE,KAAvC;;AACA,QAAI4V,YAAJ,EAAkB;AAChB,YAAMC,iBAAiB,GAAG1U,WAAW,CAACtV,MAAZ,CAAmB,eAAnB,CAA1B;AACA,YAAMiqB,oBAAoB,GAAG3U,WAAW,CAACtV,MAAZ,CAAmB,mBAAnB,CAA7B;AACA,YAAMwV,cAAc,GAAGF,WAAW,CAACtV,MAAZ,CAAmB,iBAAnB,CAAvB;AACA,YAAMkqB,oBAAoB,GAAG5U,WAAW,CAACtV,MAAZ,CAAmB,eAAnB,CAA7B;;AACA,UAAIoM,OAAO,CAAC0D,OAAR,CAAgBiG,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,YAAIiU,iBAAiB,IAAI7V,KAAK,CAACna,EAAN,KAAagwB,iBAAiB,CAAChwB,EAAxD,EAA4D;AAC1D;AACA;AACA;AACA;AACA,gBAAMoS,OAAO,CAAC9G,OAAR,CAAgB6R,KAAhB,CAAsBgT,YAAtB,CACJ/d,OAAO,CAACyF,WAAR,CAAoB;AAAEuY,YAAAA,KAAK,EAAE;AAAT,WAApB,CADI,CAAN;AAIA,cAAIpqB,MAAM,GAAGse,SAAS,CAACte,MAAvB;AACA,gBAAMX,mBAAmB,GACvB6qB,oBAAoB,IACpB5U,WAAW,CAACvW,MAAZ,CAAmB+B,2BAFrB;;AAGA,cAAIzB,mBAAJ,EAAyB;AACvB,kBAAM5B,MAAM,GAAG,MAAM2O,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuByJ,SAAvB,CACnB7U,OAAO,CAACjL,KAAR,CAAc;AACZnB,cAAAA,MAAM,EAAE,CAACkqB,oBAAoB,CAAChqB,IAAtB;AADI,aAAd,CADmB,CAArB;AAKAF,YAAAA,MAAM,GAAGvC,MAAM,CAACO,IAAhB;AACD;;AACD,cAAIiW,YAAY,CAACjU,MAAD,EAASiqB,oBAAT,CAAhB,EAAgD;AAC9C,kBAAM9J,kBAAkB,CACtB7B,SADsB,EAEtBlS,OAFsB,EAGtBkJ,WAHsB,EAItB,KAJsB,EAKtB;AACEgL,cAAAA,MAAM,EAAE,CAAC,aAAD;AADV,aALsB,CAAxB;AASD,WAVD,MAUO;AACL,kBAAMR,2BAA2B,CAC/BxB,SAD+B,EAE/BlS,OAF+B,EAG/BkJ,WAH+B,EAI/BtV,MAJ+B,CAAjC;AAMD;;AAED,gBAAMqmB,0BAA0B,CAC9Bja,OAD8B,EAE9BkJ,WAF8B,EAG9BC,mBAH8B,EAI9B;AACElW,YAAAA,mBADF;AAEE;AACAD,YAAAA,SAAS,EAAE6U,YAAY,CAACjU,MAAD,EAASwV,cAAT,CAAZ,GACP,IADO,GAEPF,WAAW,CAACvW,MAAZ,CAAmBI,gBAAnB,CAAoCC;AAL1C,WAJ8B,CAAhC,CAxC0D;AAqD3D,SArDD,MAqDO,IAAIoW,cAAc,IAAIrB,KAAK,CAACna,EAAN,KAAawb,cAAc,CAACxb,EAAlD,EAAsD;AAC3D,gBAAMqsB,0BAA0B,CAC9Bja,OAD8B,EAE9BkJ,WAF8B,EAG9BC,mBAH8B,EAI9B;AACEnW,YAAAA,SAAS,EAAE,IADb;AAEE;AACA;AACAC,YAAAA,mBAAmB,EAAE4U,YAAY,CAC/BpC,WAAW,CAAC7R,MADmB,EAE/BkqB,oBAF+B,CAAZ,GAIjB,IAJiB,GAKjB5U,WAAW,CAACvW,MAAZ,CAAmBI,gBAAnB,CAAoCE;AAT1C,WAJ8B,CAAhC;AAgBD;;AACD,cAAMgW,mBAAmB,CACvBiJ,SADuB,EAEvBlS,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD;;AACD;AACD;;AAED,QAAID,WAAW,CAACgH,iBAAZ,CAA8B5O,QAA9B,CAAuCyG,KAAK,CAACna,EAA7C,CAAJ,EAAsD;AACpD,UAAIoS,OAAO,CAAC0D,OAAR,CAAgBiG,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,cAAM3J,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuB2J,WAAvB,CACJ/U,OAAO,CAACjL,KAAR,CAAc;AAAEjB,UAAAA,IAAI,EAAEiU,KAAK,CAACjU;AAAd,SAAd,CADI,CAAN;AAGD,OAJD,MAIO;AACL,cAAMkM,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuByJ,SAAvB,CACJ7U,OAAO,CAACjL,KAAR,CAAc;AAAEnB,UAAAA,MAAM,EAAE,CAACmU,KAAK,CAACjU,IAAP;AAAV,SAAd,CADI,CAAN;AAGD;;AACD;AACD;;AAED,UAAM4f,2BAA2B,CAACxB,SAAD,EAAYlS,OAAZ,EAAqBkJ,WAArB,CAAjC;AAEA,UAAM+U,iBAAiB,GAAG/U,WAAW,CAACtV,MAAZ,CAAmB,qBAAnB,CAA1B;AACA,UAAM6mB,cAAc,GAAGvR,WAAW,CAACtV,MAAZ,CAAmB,iBAAnB,CAAvB;AACA,UAAM8mB,WAAW,GAAGxR,WAAW,CAACtV,MAAZ,CAAmB,eAAnB,CAApB;;AAEA,UAAMmT,MAAM,GAAG,CAAC,MAAM;AACpB,UAAI0T,cAAc,IAAI1S,KAAK,CAACna,EAAN,KAAa6sB,cAAc,CAAC7sB,EAAlD,EAAsD;AACpD,eAAO,WAAP;AACD;;AACD,UAAI8sB,WAAW,IAAI3S,KAAK,CAACna,EAAN,KAAa8sB,WAAW,CAAC9sB,EAA5C,EAAgD;AAC9C,eAAO,qBAAP;AACD;;AACD,aAAO,IAAP;AACD,KARc,GAAf;;AAUA,QAAImZ,MAAJ,EAAY;AACV,YAAMkT,0BAA0B,CAC9Bja,OAD8B,EAE9BkJ,WAF8B,EAG9BC,mBAH8B,EAI9B;AACE,SAACpC,MAAD,GAAU/G,OAAO,CAAC0D,OAAR,CAAgBiG,MAAhB,KAA2B;AADvC,OAJ8B,CAAhC;AAQD,KApI+D;;;AAqIhE,QAAI8Q,cAAc,IAAI1S,KAAK,CAACna,EAAN,KAAa6sB,cAAc,CAAC7sB,EAAlD,EAAsD;AACpD,UAAIoS,OAAO,CAAC0D,OAAR,CAAgBiG,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,cAAMV,mBAAmB,CACvBiJ,SADuB,EAEvBlS,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,OAPD,MAOO;AACLD,QAAAA,WAAW,CAACG,0BAAZ,CACErJ,OADF,EAEEyF,WAAW,CAAC6D,MAFd,EAGE,yBAHF;AAKD;AACF;;AACD,QAAI2U,iBAAiB,IAAIlW,KAAK,CAACna,EAAN,KAAaqwB,iBAAiB,CAACrwB,EAAxD,EAA4D;AAC1D,UAAIoS,OAAO,CAAC0D,OAAR,CAAgBiG,MAAhB,KAA2B,SAA/B,EAA0C;AACxC,cAAM6T,YAAY,CAChBtL,SADgB,EAEhBlS,OAFgB,EAGhBA,OAAO,CAAC0D,OAAR,CAAgBkT,MAAhB,CAAuB/kB,KAHP,CAAlB;AAKA,cAAMmO,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuB2J,WAAvB,CACJ/U,OAAO,CAACjL,KAAR,CAAc;AAAEjB,UAAAA,IAAI,EAAEiU,KAAK,CAACjU;AAAd,SAAd,CADI,CAAN;AAGD;AACF;AACF,GA/KqB,CAF1B;AAoLD;;ACxMM,MAAMoqB,uBAAuB,GAAG,OACrCzY,WADqC,EAErCzF,OAFqC,EAGrCkJ,WAHqC,EAIrCC,mBAJqC,KAKhB;AACrB;AACA,QAAMyU,iBAAiB,GAAG1U,WAAW,CAACtV,MAAZ,CAAmB,eAAnB,CAA1B;;AACA,MAAIiU,YAAY,CAACpC,WAAW,CAAC7R,MAAb,EAAqBgqB,iBAArB,CAAhB,EAAyD;AACvD,UAAM5d,OAAO,CAAC9G,OAAR,CAAgB6R,KAAhB,CAAsBgT,YAAtB,CACJ/d,OAAO,CAACyF,WAAR,CAAoB;AAAEuY,MAAAA,KAAK,EAAE;AAAT,KAApB,CADI,CAAN;AAGA,UAAM/U,mBAAmB,CACvBxD,WADuB,EAEvBzF,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMA,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD,CAtBM;;ACFA,MAAMgV,qBAAqB,GAAG,OAGnC1Y,WAHmC,EAInCzF,OAJmC,EAKnCkJ,WALmC,KAMjB;AAClB,MAAI,CAACA,WAAW,CAACvW,MAAZ,CAAmBC,mBAAxB,EAA6C;AAC7C,MAAI,CAAC6S,WAAW,CAACmN,SAAb,IAA0BnN,WAAW,CAACmN,SAAZ,CAAsBjV,MAAtB,GAA+B,CAA7D,EAAgE;AAChE,MAAI,CAAC8H,WAAW,CAAChU,IAAb,IAAqBgU,WAAW,CAAChU,IAAZ,CAAiBwI,IAAjB,KAA0B,KAAnD,EAA0D;AAE1D,QAAM+F,OAAO,CAAC9G,OAAR,CAAgBkS,MAAhB,CAAuBgT,YAAvB,CACJpe,OAAO,CAACjL,KAAR,CAAc;AACZ6d,IAAAA,SAAS,EAAE,CAACnN,WAAW,CAAChU,IAAZ,CAAiBI,KAAlB;AADC,GAAd,CADI,CAAN;AAKD,CAhBM;;ACIQ,SAASwsB,MAAT,CAAgB7f,GAAhB,EAA6BiF,UAA7B,EAA2D;AACxEjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,qBADF,EAEEP,wBAAwB,CACtB/N,UADsB,EAEtB,CAACC,OAAD,EAAU1D,OAAV,EAAmBkJ,WAAnB,KAAmC;AACjC,QAAIA,WAAW,CAACsG,YAAhB,EAA8B,OAAO,IAAP;AAC9B,WAAO9L,OAAO,CAAC2S,YAAf;AACD,GALqB,EAMtB,OAAO5Q,WAAP,EAAoBzF,OAApB,EAA6BkJ,WAA7B,EAA0CC,mBAA1C,KAAkE;AAChE,QAAIA,mBAAmB,KAAK,IAA5B,EAAkC;AAClC,UAAMwU,YAAY,GAAGlY,WAAW,CAAC6C,IAAZ,CAAiBD,GAAjB,CAAqBlJ,UAArB,CAAgC,WAAhC,CAArB;AAEA,UAAMvF,OAAO,CAACC,GAAR,CAAqB,CACzBskB,qBAAqB,CAAC1Y,WAAD,EAAczF,OAAd,EAAuBkJ,WAAvB,CADI,EAEzB0T,YAAY,CACVnX,WADU,EAEVzF,OAFU,EAGVkJ,WAHU,EAIVC,mBAJU,EAKV,IALU,CAFa,EASzBwU,YAAY,GACRpP,OAAO,CAACvO,OAAD,EAAUyF,WAAW,CAAC6D,MAAtB,CAAP,CAAqC9C,IAArC,CAA2C0L,SAAD,IACxCgM,uBAAuB,CACrBhM,SADqB,EAErBlS,OAFqB,EAGrBkJ,WAHqB,EAIrBC,mBAJqB,CAAvB,CAKE3C,IALF,CAME,MAAOhS,QAAP,IAA4C;AAC1C,UAAI,CAACA,QAAL,EAAe;AACb,cAAMuf,kBAAkB,CACtBtO,WADsB,EAEtBzF,OAFsB,EAGtBkJ,WAHsB,EAItB,KAJsB,EAKtB;AACE7F,UAAAA,GAAG,EAAE,CAAC,aAAD;AADP,SALsB,CAAxB;AASD;AACF,KAlBH,CADF,CADQ,GAuBR0Q,kBAAkB,CAACtO,WAAD,EAAczF,OAAd,EAAuBkJ,WAAvB,EAAoC,KAApC,EAA2C;AAC3D7F,MAAAA,GAAG,EAAE6F,WAAW,CAACvW,MAAZ,CAAmBG,qBAAnB,GACD,CAAC,aAAD,CADC,GAED,EAHuD;AAI3DohB,MAAAA,MAAM,EAAE,CAAC,UAAD,EAAa,kBAAb;AAJmD,KAA3C,CAhCG,CAArB,CAAN;AAuCD,GAjDqB,CAF1B;AAsDD;;ACtDc,SAASoK,QAAT,CAAkB9f,GAAlB,EAA+BiF,UAA/B,EAA6D;AAC1EjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,uBADF,EAEEP,wBAAwB,CACtB/N,UADsB,EAErBC,OAAD,IAAmC;AACjC,WAAOA,OAAO,CAAC2S,YAAf;AACD,GAJqB,EAKtB,OACE5Q,WADF,EAEEzF,OAFF,EAGEkJ,WAHF,EAIEC,mBAJF,KAKoB;AAClB;AACA,QAAIA,mBAAJ,EAAyB;AACvB,YAAMvP,OAAO,CAACC,GAAR,CAAY,CAChBka,kBAAkB,CAACtO,WAAD,EAAczF,OAAd,EAAuBkJ,WAAvB,EAAoC,KAApC,EAA2C;AAC3D7F,QAAAA,GAAG,EAAE,CAAC,aAAD,CADsD;AAE3D6Q,QAAAA,MAAM,EAAE,CAAC,UAAD;AAFmD,OAA3C,CADF,EAKhB0I,YAAY,CACVnX,WADU,EAEVzF,OAFU,EAGVkJ,WAHU,EAIVC,mBAJU,EAKV,IALU,CALI,CAAZ,CAAN;AAaD;AAED;;;AACA,QAAI1D,WAAW,CAACG,mBAAhB,EAAqC;AACnCH,MAAAA,WAAW,CAACG,mBAAZ,CAAgC5E,OAAhC,CAAyCyV,iBAAD,IAAuB;AAC7DvN,QAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B4W,iBAAiB,CAAC5kB,KAA/C;AACD,OAFD;AAGD;;AAED,QAAI4T,WAAW,CAACI,eAAhB,EAAiC;AAC/B,YAAMjM,OAAO,CAACC,GAAR,CACJ4L,WAAW,CAACI,eAAZ,CAA4BpT,GAA5B,CAAgC,MAAOgI,IAAP,IAAgB;AAC9C,cAAMqG,OAAO,GAAG,MAAMoI,WAAW,CAAChE,iBAAZ,CAA8BzK,IAAI,CAAC7M,EAAnC,CAAtB;AACAkT,QAAAA,OAAO,CAACE,OAAR,CAAiBlH,MAAD,IAAY;AAC1BoP,UAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B/F,MAAM,CAACjI,KAApC;AACD,SAFD;AAGD,OALD,CADI,CAAN;AAQD;;AAED,QAAI4T,WAAW,CAACmN,SAAhB,EAA2B;AACzBnN,MAAAA,WAAW,CAACmN,SAAZ,CAAsB5R,OAAtB,CAA+B0V,QAAD,IAAc;AAC1CxN,QAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B6W,QAAQ,CAAC7kB,KAAtC;AACD,OAFD;AAGD;AAED;;;AACA,UAAM;AAAEwjB,MAAAA;AAAF,QAAgB,MAAMF,2BAA2B,CACrDnV,OADqD,EAErDkJ,WAFqD,CAAvD;AAIA,UAAM;AACJxL,MAAAA,KADI;AAEJkV,MAAAA,SAFI;AAGJmD,MAAAA;AAHI,QAIFF,mCAAmC,CAACpQ,WAAD,EAAc4P,SAAd,CAJvC;AAMA,UAAMsB,aAAa,GAAGzN,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CACpBS,OAAO,CAAC0D,OAAR,CAAgBkT,MAAhB,CAAuB/kB,KADH,CAAtB;AAGA,UAAM4gB,YAAY,GAAGvJ,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CAA0B7B,KAAK,CAAC7L,KAAhC,CAArB;AACA,UAAMglB,MAAM,GAAGC,YAAA,CAAwBrR,WAAxB,EAAqCyD,WAArC,CAAf;;AAEA,UAAM6N,aAAa,GAAIC,EAAD,IAA6B;AACjD,YAAMC,SAAS,GAAGH,eAAA,CAChBrE,YADgB,EAEhBhN,WAFgB,EAGhBuR,EAHgB,CAAlB;AAMA,aAAQ,aAAYL,aAAc,aAAYM,SAAU,IAAGJ,MAAO,OAAMpR,WAAW,CAACrX,KAAM,EAA1F;AACD,KARD;;AAUAwkB,IAAAA,SAAS,CAACngB,GAAV,CAAeikB,QAAD,IAAc;AAC1B,UAAI1W,OAAO,CAAC0D,OAAR,CAAgBkT,MAAhB,CAAuBhpB,EAAvB,KAA8B8oB,QAAQ,CAAC9oB,EAA3C,EAA+C;AAC/C,aAAOsb,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACL,cADK,EAELkX,QAAQ,CAAC9oB,EAFJ,EAGL8oB,QAAQ,CAAC7kB,KAHJ,EAIL;AACE8Q,QAAAA,IAAI,EAAEoU,aAAa,CAACL,QAAD;AADrB,OAJK,CAAP;AAQD,KAVD;AAYAX,IAAAA,SAAS,CAACtjB,GAAV,CAAeykB,QAAD,IAAc;AAC1B,UAAIlX,OAAO,CAAC0D,OAAR,CAAgBkT,MAAhB,CAAuBhpB,EAAvB,KAA8BspB,QAAQ,CAACtpB,EAA3C,EAA+C;AAC/C,aAAOsb,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACL,qBADK,EAEL0X,QAAQ,CAACtpB,EAFJ,EAGLspB,QAAQ,CAACrlB,KAHJ,EAIL;AACE8Q,QAAAA,IAAI,EAAEoU,aAAa,CAACG,QAAD;AADrB,OAJK,CAAP;AAQD,KAVD;AAWD,GAtGqB,CAF1B;AA2GD;;AC9Gc,SAASqH,eAAT,CACb/f,GADa,EAEbiF,UAFa,EAGP;AACNjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,+BADF,EAEEP,wBAAwB,CACtB/N,UADsB,EAErBC,OAAD,IAAaA,OAAO,CAAC2S,YAFC,EAGtB,OACE5Q,WADF,EAEEzF,OAFF,EAGEkJ,WAHF,KAKoB;AAClB,UAAM0N,MAAM,GAAG5W,OAAO,CAAC0D,OAAR,CAAgBkT,MAA/B;AACA,UAAMhB,QAAQ,GAAG5V,OAAO,CAAC0D,OAAR,CAAgB1P,MAAhB,CAAuBvC,IAAxC;AACA,UAAM+T,aAAa,GAAG0D,WAAW,CAACnE,gBAAZ,CAA6B6Q,QAAQ,CAAC/jB,KAAtC,CAAtB;;AAEA,QACE,CAACqX,WAAW,CAACsG,YAAb,IACAhK,aADA,IAEA0D,WAAW,CAACvW,MAAZ,CAAmBiB,MAAnB,CAA0BI,MAA1B,CAAiCwR,aAAjC,CAHF,EAIE;AACA,YAAM0M,SAAS,GAAG,MAAM3D,OAAO,CAACvO,OAAD,EAAUyF,WAAW,CAAC6D,MAAtB,CAA/B;AAEA,YAAM;AAAEoM,QAAAA;AAAF,UAAmB,MAAMP,2BAA2B,CACxDnV,OADwD,EAExDkJ,WAFwD,CAA1D;AAKA,YAAMsV,4BAA4B,GAChC9I,YAAY,CAAClQ,aAAD,CAAZ,CAA4BjR,gBAA5B,KAAiD,CADnD;AAEA,YAAMkqB,YAAY,GAAG/I,YAAY,CAAClQ,aAAD,CAAZ,CAA4BhR,QAA5B,KAAyC,CAA9D;AACA,YAAMkqB,2BAA2B,GAAGxV,WAAW,CAAC3D,iBAAZ,CAClCC,aADkC,EAElC0M,SAFkC,EAGlC;AAAExM,QAAAA,qBAAqB,EAAE;AAAzB,OAHkC,CAApC;AAMA,YAAMqO,kBAAkB,CACtB7B,SADsB,EAEtBlS,OAFsB,EAGtBkJ,WAHsB,EAItB1D,aAJsB,EAKtB;AACEnC,QAAAA,GAAG,EAAE,CACH,CAACob,YAAD,IAAiB,aADd,EAEHA,YAAY,IACV,CAACC,2BADH,IAEE,CAACF,4BAFH,IAGE,UALC,CADP;AAQEtK,QAAAA,MAAM,EAAE,CACN,CAACwK,2BAAD,IACE,CAACF,4BADH,IAEE,WAHI,EAIN,CAACA,4BAAD,IAAiC,kBAJ3B,EAKN,CAACC,YAAD,IAAiB,UALX;AARV,OALsB,CAAxB;;AAuBA,UAAIvM,SAAS,CAACU,SAAd,EAAyB;AACvBV,QAAAA,SAAS,CAACU,SAAV,CAAoB5R,OAApB,CAA6B0V,QAAD,IAAc;AACxC,cAAIA,QAAJ,EAAc;AACZxN,YAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B6W,QAAQ,CAAC7kB,KAAtC;AACD;AACF,SAJD;AAKD;;AACD,UACE,CAACqgB,SAAS,CAACU,SAAX,IACA,CAACV,SAAS,CAACU,SAAV,CAAoBhX,IAApB,CACE8a,QAAD,IAAcA,QAAQ,IAAIA,QAAQ,CAAC7kB,KAAT,KAAmB+jB,QAAQ,CAAC/jB,KADvD,CAFH,EAKE;AACAqX,QAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B+V,QAAQ,CAAC/jB,KAAtC;AACD;AACF;;AAED,QAAIqX,WAAW,CAAC/H,KAAhB,EAAuB;AACrB,UAAIyV,MAAM,CAAC/kB,KAAP,KAAiB+jB,QAAQ,CAAC/jB,KAA9B,EAAqC;AACnC4T,QAAAA,WAAW,CAACmN,SAAZ,CAAsB5R,OAAtB,CAA+B0V,QAAD,IAAc;AAC1CxN,UAAAA,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACE,WADF,EAEEkX,QAAQ,CAAC9oB,EAFX,EAGE8oB,QAAQ,CAAC7kB,KAHX,EAIE;AACE8Q,YAAAA,IAAI,EAAG,aAAYuG,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CACjBqW,QAAQ,CAAC/jB,KADQ,CAEjB,4BAA2BilB,YAAA,CAC3BrR,WAD2B,EAE3ByD,WAF2B,CAG3B;AANJ,WAJF;AAaD,SAdD;AAeD,OAhBD,MAgBO;AACLA,QAAAA,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACE,WADF,EAEEoW,QAAQ,CAAChoB,EAFX,EAGEgoB,QAAQ,CAAC/jB,KAHX,EAIE;AACE8Q,UAAAA,IAAI,EAAG,aAAYuG,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CACjBqX,MAAM,CAAC/kB,KADU,CAEjB,6BAA4BilB,YAAA,CAC5BrR,WAD4B,EAE5ByD,WAF4B,CAG5B;AANJ,SAJF;AAaD;AACF;AACF,GA3GqB,CAF1B;AAgHD;;ACrHc,SAASyV,oBAAT,CACbngB,GADa,EAEbiF,UAFa,EAGP;AACNjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,qCADF,EAEEP,wBAAwB,CACtB/N,UADsB,EAErBC,OAAD,IAAaA,OAAO,CAAC2S,YAFC,EAGtB,OACE5Q,WADF,EAEEzF,OAFF,EAGEkJ,WAHF,KAKoB;AAClB,UAAM0N,MAAM,GAAG5W,OAAO,CAAC0D,OAAR,CAAgBkT,MAA/B;AACA,UAAMH,iBAAiB,GAAIzW,OAAO,CAAC0D,OAAT,CAAyBkb,kBAAnD;AACA,UAAMC,aAAa,GAAI7e,OAAO,CAAC0D,OAAT,CAAyBob,cAA/C;AACA,UAAM9I,kBAAkB,GAAGS,iBAAiB,GACxC,CAACA,iBAAD,CADwC,GAExC,MAAMvN,WAAW,CAAChE,iBAAZ,CAA8B2Z,aAAa,CAACjxB,EAA5C,CAFV;AAIA,UAAM4X,aAAa,GAAGiR,iBAAiB,GACnCvN,WAAW,CAACnE,gBAAZ,CAA6B0R,iBAAiB,CAAC5kB,KAA/C,CADmC,GAEnCqX,WAAW,CAAClE,YAAZ,CAAyB6Z,aAAa,CAAC/qB,IAAvC,CAFJ;;AAIA,QACE,CAACoV,WAAW,CAACsG,YAAb,IACAhK,aADA,IAEA0D,WAAW,CAACvW,MAAZ,CAAmBiB,MAAnB,CAA0BI,MAA1B,CAAiCwR,aAAjC,CAHF,EAIE;AACA,YAAMkZ,2BAA2B,GAAGxV,WAAW,CAAC3D,iBAAZ,CAClCC,aADkC,EAElCC,WAFkC,EAGlC;AACEC,QAAAA,qBAAqB,EAAE;AADzB,OAHkC,CAApC;AAQA,YAAM;AAAEgQ,QAAAA;AAAF,UAAmB,MAAMP,2BAA2B,CACxDnV,OADwD,EAExDkJ,WAFwD,CAA1D;AAKA,YAAMsV,4BAA4B,GAChC9I,YAAY,CAAClQ,aAAD,CAAZ,CAA4BjR,gBAA5B,KAAiD,CADnD;AAGA,YAAMwqB,oBAAoB,GACxBrJ,YAAY,CAAClQ,aAAD,CAAZ,CAA4BhR,QAA5B,KAAyC,CAD3C;AAGA,YAAMA,QAAQ,GACZ,CAACkqB,2BAAD,IACA,CAACF,4BADD,IAEAO,oBAHF;AAKA,YAAMhL,kBAAkB,CACtBtO,WADsB,EAEtBzF,OAFsB,EAGtBkJ,WAHsB,EAItB1D,aAJsB,EAKtB;AACEnC,QAAAA,GAAG,EAAE;AAEHmb,QAAAA,4BAA4B,IAAI,kBAF7B;AAIHhqB,QAAAA,QAAQ,IAAI,UAJT,CADP;AAOE;AACA0f,QAAAA,MAAM,EAAE,CACN1f,QAAQ,IAAI,aADN,EAEN,CAACkqB,2BAAD,IAAgC,WAF1B;AARV,OALsB,CAAxB;AAoBA,YAAMM,eAAyB,GAAG,EAAlC;;AACA,UAAIvZ,WAAW,CAACmN,SAAhB,EAA2B;AACzBnN,QAAAA,WAAW,CAACmN,SAAZ,CAAsB5R,OAAtB,CAA+B0V,QAAD,IAAc;AAC1CsI,UAAAA,eAAe,CAACjlB,IAAhB,CAAqB2c,QAAQ,CAAC7kB,KAA9B;AACAqX,UAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B6W,QAAQ,CAAC7kB,KAAtC;AACD,SAHD;AAID;;AAEDmkB,MAAAA,kBAAkB,CAAChV,OAAnB,CAA4Bie,iBAAD,IAAuB;AAChD,YAAID,eAAe,CAAC1d,QAAhB,CAAyB2d,iBAAzB,CAAJ,EAAiD;AACjD/V,QAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6Bof,iBAAiB,CAACptB,KAA/C;AACD,OAHD;AAID;;AAED,QAAIqX,WAAW,CAAC/H,KAAhB,EAAuB;AACrB,UAAI6U,kBAAkB,CAAChQ,IAAnB,CAAyB4N,EAAD,IAAQA,EAAE,CAAC/hB,KAAH,KAAa+kB,MAAM,CAAC/kB,KAApD,CAAJ,EAAgE;AAC9DmkB,QAAAA,kBAAkB,CAAChV,OAAnB,CAA4Bie,iBAAD,IAAuB;AAChD,cAAIA,iBAAiB,CAACptB,KAAlB,KAA4B+kB,MAAM,CAAC/kB,KAAvC,EAA8C;AAC9CqX,UAAAA,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACE,WADF,EAEEyf,iBAAiB,CAACrxB,EAFpB,EAGEqxB,iBAAiB,CAACptB,KAHpB,EAIE;AACE8Q,YAAAA,IAAI,EAAG,0BAAyBuG,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CAC9BqX,MAAM,CAAC/kB,KADuB,CAE9B,uCACAgtB,aAAa,CAAC/qB,IACf,eAAcgjB,YAAA,CACbrR,WADa,EAEbyD,WAFa,CAGb;AARJ,WAJF;AAeD,SAjBD;AAkBD,OAnBD,MAmBO;AACL8M,QAAAA,kBAAkB,CAAChV,OAAnB,CAA4Bie,iBAAD,IAAuB;AAChD/V,UAAAA,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACE,WADF,EAEEyf,iBAAiB,CAACrxB,EAFpB,EAGEqxB,iBAAiB,CAACptB,KAHpB,EAIE;AACE8Q,YAAAA,IAAI,EAAG,0BAAyBuG,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CAC9BqX,MAAM,CAAC/kB,KADuB,CAE9B,6BACAgtB,aAAa,GAAI,cAAaA,aAAa,CAAC/qB,IAAK,GAApC,GAAyC,MACvD,cAAagjB,YAAA,CACZrR,WADY,EAEZyD,WAFY,CAGZ;AARJ,WAJF;AAeD,SAhBD;AAiBD;;AAED,YAAMtP,OAAO,CAACC,GAAR,CACJmc,kBAAkB,CAACvjB,GAAnB,CAAuB,MAAOwsB,iBAAP,IAA6B;AAClD,cAAMC,0BAA0B,GAAG,MAAMzb,UAAU,CAAC/K,WAAX,CAAuBmgB,iBAAvB,CAAyC9f,OAAzC,CACvC;AACE,wBAAcmQ,WAAW,CAACjJ,OAAZ,CAAoB3G,GADpC;AAEE,0BAAgB4P,WAAW,CAAC1E,WAF9B;AAGEvK,UAAAA,IAAI,EAAE,kBAHR;AAIE6e,UAAAA,MAAM,EAAG,GAAErT,WAAW,CAAC7X,EAAG,IACxBixB,aAAa,GAAI,GAAEA,aAAa,CAACjxB,EAAG,GAAvB,GAA4B,EAC1C,GAAEqxB,iBAAiB,CAACrxB,EAAG;AAN1B,SADuC,CAAzC;;AAWA,YAAIsxB,0BAAJ,EAAgC;AAC9B,gBAAMnG,MAAM,GAAGmG,0BAA0B,CAACnG,MAA3B,CAAkC,CAAlC,CAAf;AACA,gBAAMzW,OAAO,GAAG4c,0BAA0B,CAAC5c,OAA3C;AACA,gBAAM1I,OAAO,CAACC,GAAR,CAAY,CAChBqP,WAAW,CAAC/H,KAAZ,CAAkBzB,aAAlB,CAAgCqZ,MAAM,CAAC/V,EAAvC,EAA2C+V,MAAM,CAAClX,OAAlD,EAA2D,EACzD,GAAGS,OADsD;AAEzDK,YAAAA,IAAI,EAAEL,OAAO,CAACK,IAAR,CACHwc,KADG,CACG,IADH,EAEH1sB,GAFG,CAEEuV,CAAD,IAAQ,IAAGA,CAAE,GAFd,EAGHwE,IAHG,CAGE,IAHF;AAFmD,WAA3D,CADgB,EAQhBtD,WAAW,CAAC/H,KAAZ,CAAkBvB,WAAlB,CACEmZ,MAAM,CAAC/V,EADT,EAEE+V,MAAM,CAAClX,OAFT,EAGE,sBAHF,CARgB,EAahB4B,UAAU,CAAC/K,WAAX,CAAuBmgB,iBAAvB,CAAyCuG,SAAzC,CACEF,0BADF,CAbgB,CAAZ,CAAN;AAiBD;AACF,OAjCD,CADI,CAAN;AAoCD;AACF,GAhKqB,CAF1B;AAqKD;;AC1Kc,SAASG,eAAT,CACb7gB,GADa,EAEbiF,UAFa,EAGP;AACNjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,+BADF,EAEEP,wBAAwB,CACtB/N,UADsB,EAErBC,OAAD,IAAaA,OAAO,CAAC2S,YAFC,EAGtB,OACE5Q,WADF,EAEEzF,OAFF,EAGEkJ,WAHF,KAKoB;AAClB,UAAM0N,MAAM,GAAG5W,OAAO,CAAC0D,OAAR,CAAgBkT,MAA/B;AAEA,UAAMH,iBAAiB,GAAIzW,OAAO,CAAC0D,OAAT,CAAyBkb,kBAAnD;AACA,UAAMC,aAAa,GAAI7e,OAAO,CAAC0D,OAAT,CAAyBob,cAA/C;AACA,UAAM9I,kBAAkB,GAAGS,iBAAiB,GACxC,CAACA,iBAAD,CADwC,GAExC,MAAMvN,WAAW,CAAChE,iBAAZ,CAA8B2Z,aAAa,CAACjxB,EAA5C,CAFV;AAIA,UAAM4X,aAAa,GAAGiR,iBAAiB,GACnCvN,WAAW,CAACnE,gBAAZ,CAA6B0R,iBAAiB,CAAC5kB,KAA/C,CADmC,GAEnCqX,WAAW,CAAClE,YAAZ,CAAyB6Z,aAAa,CAAC/qB,IAAvC,CAFJ;;AAIA;AAEA,QACE,CAACoV,WAAW,CAACsG,YAAb,IACAhK,aADA,IAEA0D,WAAW,CAACvW,MAAZ,CAAmBiB,MAAnB,CAA0BI,MAA1B,CAAiCwR,aAAjC,CAHF,EAIE;AACA,YAAMuO,kBAAkB,CACtBtO,WADsB,EAEtBzF,OAFsB,EAGtBkJ,WAHsB,EAItB1D,aAJsB,EAKtB;AACEnC,QAAAA,GAAG,EAAE,CAAC,aAAD,cADP;AAEE6Q,QAAAA,MAAM,EAAE,CAAC,UAAD;AAFV,OALsB,CAAxB;AAWA,YAAM8K,eAAyB,GAAG,EAAlC;;AACA,UAAIvZ,WAAW,CAACmN,SAAhB,EAA2B;AACzBnN,QAAAA,WAAW,CAACmN,SAAZ,CAAsB5R,OAAtB,CAA+B0V,QAAD,IAAc;AAC1CsI,UAAAA,eAAe,CAACjlB,IAAhB,CAAqB2c,QAAQ,CAAC7kB,KAA9B;AACAqX,UAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B6W,QAAQ,CAAC7kB,KAAtC;AACD,SAHD;AAID;;AAEDmkB,MAAAA,kBAAkB,CAAChV,OAAnB,CAA4Bie,iBAAD,IAAuB;AAChD,YAAID,eAAe,CAAC1d,QAAhB,CAAyB2d,iBAAzB,CAAJ,EAAiD;AACjD/V,QAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6Bof,iBAAiB,CAACptB,KAA/C;AACD,OAHD;AAID;;AAED,QAAmBqX,WAAW,CAAC/H,KAA/B,EAAsC;AACpC,YAAMwB,IAAI,GAAI,UAASuG,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CACrBqX,MAAM,CAAC/kB,KADc,CAErB,aACA4kB,iBAAiB,GAAG,MAAH,GAAa,cAAaoI,aAAa,CAAC/qB,IAAK,GAC/D,cAAagjB,YAAA,CACZrR,WADY,EAEZyD,WAFY,CAGZ,SAAQzD,WAAW,CAACrX,KAAM,EAP5B;AAQA,YAAMkU,OAAO,GAAG;AAAEK,QAAAA;AAAF,OAAhB;AAEA,YAAM/I,OAAO,CAACC,GAAR,CACJmc,kBAAkB,CAACvjB,GAAnB,CAAuB,MAAOwsB,iBAAP,IAA6B;AAClD,YAAIrI,MAAM,CAAC/kB,KAAP,KAAiBotB,iBAAiB,CAACptB,KAAvC,EAA8C;AAE9C,cAAMR,MAAM,GAAG,MAAM6X,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACnB,WADmB,EAEnByf,iBAAiB,CAACrxB,EAFC,EAGnBqxB,iBAAiB,CAACptB,KAHC,EAInByQ,OAJmB,CAArB;;AAMA,YAAIjR,MAAJ,EAAY;AACV,gBAAMoS,UAAU,CAAC/K,WAAX,CAAuBmgB,iBAAvB,CAAyC9O,SAAzC,CAAmD;AACvD9P,YAAAA,IAAI,EAAE,kBADiD;AAEvD6e,YAAAA,MAAM,EAAG,GAAErT,WAAW,CAAC7X,EAAG,IACxBixB,aAAa,GAAI,GAAEA,aAAa,CAACjxB,EAAG,GAAvB,GAA4B,EAC1C,GAAEqxB,iBAAiB,CAACrxB,EAAG,EAJ+B;AAKvD0U,YAAAA,OALuD;AAMvDrC,YAAAA,OAAO,EAAEiJ,WAAW,CAAC3E,YANkC;AAOvDwU,YAAAA,MAAM,EAAE,CAAC1nB,MAAD;AAP+C,WAAnD,CAAN;AASD;AACF,OApBD,CADI,CAAN;AAuBD;AACF,GAxFqB,CAF1B;AA6FD;;AC3FD,MAAMiuB,iBAAiB,GAAIxW,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,SAASyW,eAAT,CACb/gB,GADa,EAEbiF,UAFa,EAGP;AACNjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,+BADF,EAEEP,wBAAwB,CACtB/N,UADsB,EAErBC,OAAD,IAAaA,OAAO,CAAC2S,YAFC,EAGtB,OACE5Q,WADF,EAEEzF,OAFF,EAGEkJ,WAHF,EAIEC,mBAJF,KAKoB;AAClB,UAAM;AAAEzF,MAAAA;AAAF,QAAc1D,OAApB;AAEA,UAAM;AACJvO,MAAAA,IAAI,EAAEmkB,QADF;AAEJ9M,MAAAA,KAFI;AAGJjM,MAAAA,IAHI;AAIJ0V,MAAAA,QAAQ,EAAEiN;AAJN,QAKF9b,OAAO,CAAC1P,MALZ;AAOA,UAAM;AAAEqhB,MAAAA,SAAF;AAAaK,MAAAA;AAAb,QAA8B,MAAMP,2BAA2B,CACnEnV,OADmE,EAEnEkJ,WAFmE,CAArE;AAIA,UAAM;AACJxL,MAAAA,KADI;AAEJkV,MAAAA,SAFI;AAGJmD,MAAAA;AAHI,QAIFF,mCAAmC,CAACpQ,WAAD,EAAc4P,SAAd,CAJvC;AAKA,UAAMoK,eAAe,GAAG/hB,KAAK,CAAC7L,KAAN,KAAgB+jB,QAAQ,CAAC/jB,KAAjD;AAEA,UAAM6tB,iBAAiB,GAAG3J,SAAS,CAACjb,MAAV,CACvBoc,QAAD,IAAcA,QAAQ,CAACtpB,EAAT,KAAgBgoB,QAAQ,CAAChoB,EADf,CAA1B;;AAIA,QAAI,CAAC6xB,eAAL,EAAsB;AACpB,YAAMja,aAAa,GAAG0D,WAAW,CAACnE,gBAAZ,CAA6B6Q,QAAQ,CAAC/jB,KAAtC,CAAtB;AACA,UAAIoZ,MAAJ;;AAEA,UACE9B,mBAAmB,IACnB,CAACD,WAAW,CAACsG,YADb,IAEAhK,aAFA,IAGA0D,WAAW,CAACvW,MAAZ,CAAmBiB,MAAnB,CAA0BI,MAA1B,CAAiCwR,aAAjC,CAJF,EAKE;AACA,cAAMkZ,2BAA2B,GAAGxV,WAAW,CAAC3D,iBAAZ,CAClCC,aADkC,EAElCC,WAFkC,EAGlC;AACEC,UAAAA,qBAAqB,EAAE,IADzB;AAGE;;AAHF,SAHkC,CAApC;AAUA,cAAM8Y,4BAA4B,GAChC9I,YAAY,CAAClQ,aAAD,CAAZ,CAA4BjR,gBAA5B,KAAiD,CADnD;AAGA,cAAMC,QAAQ,GACZ,CAACkqB,2BAAD,IACA,CAACF,4BADD,IAEA1V,KAAK,KAAK,UAHZ;AAKA,cAAMoJ,SAAS,GAAG,MAAM3D,OAAO,CAACvO,OAAD,EAAUyF,WAAW,CAAC6D,MAAtB,CAA/B;AAEA,cAAMqW,SAAS,GAAG,MAAM5L,kBAAkB,CACxC7B,SADwC,EAExClS,OAFwC,EAGxCkJ,WAHwC,EAIxC1D,aAJwC,EAKxC;AACEnC,UAAAA,GAAG,EAAE,CACH7O,QAAQ,IAAI,UADT,EAEHsU,KAAK,KAAK,mBAAV,IAAiC,aAF9B,EAGHA,KAAK,KAAK,mBAAV,IAAiC,kBAH9B,CADP;AAMEoL,UAAAA,MAAM,EAAE,CACN1f,QAAQ,IAAI,aADN,EAEN,CAACkqB,2BAAD,IAAgC,WAF1B,EAGN5V,KAAK,KAAK,UAAV,IACE,CAAC0V,4BADH,IAEE,kBALI,EAMN1V,KAAK,KAAK,mBAAV,IAAiC,UAN3B;AANV,SALwC,CAA1C;;AAsBA,YAAItU,QAAQ,IAAI,CAACgqB,4BAAjB,EAA+C;AAC7CvT,UAAAA,MAAM,GAAG,MAAMhC,mBAAmB,CAChCiJ,SADgC,EAEhClS,OAFgC,EAGhCkJ,WAHgC,EAIhCC,mBAJgC,EAKhCwW,SALgC,CAAlC;AAOD;AACF;;AAED,UAAI/M,SAAJ,EAAe;AACbA,QAAAA,SAAS,CAAC5R,OAAV,CAAmB0V,QAAD,IAAc;AAC9BxN,UAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B6W,QAAQ,CAAC7kB,KAAtC;AACD,SAFD;AAGD;;AACD,UACE,CAAC+gB,SAAS,CAAChX,IAAV,CAAgB8a,QAAD,IAAcA,QAAQ,CAAC7kB,KAAT,KAAmB+jB,QAAQ,CAAC/jB,KAAzD,CADH,EAEE;AACAqX,QAAAA,WAAW,CAAC/H,KAAZ,CAAkBtB,UAAlB,CAA6B+V,QAAQ,CAAC/jB,KAAtC;AACD;;AAED,YAAMqtB,0BAA0B,GAAG,MAAMzb,UAAU,CAAC/K,WAAX,CAAuBmgB,iBAAvB,CAAyC9f,OAAzC,CACvC;AACE,sBAAcmQ,WAAW,CAACjJ,OAAZ,CAAoB3G,GADpC;AAEE,wBAAgB4P,WAAW,CAAC1E,WAF9B;AAGEvK,QAAAA,IAAI,EAAE,kBAHR;AAIE6e,QAAAA,MAAM,EAAG,GAAErT,WAAW,CAAC7X,EAAG,IAAGgoB,QAAQ,CAAChoB,EAAG;AAJ3C,OADuC,CAAzC;AASA,YAAMwR,KAAK,GAAGkgB,iBAAiB,CAACxW,KAAD,CAA/B;;AAEA,UAAIoW,0BAAJ,EAAgC;AAC9B,cAAMnG,MAAM,GAAGmG,0BAA0B,CAACnG,MAA3B,CAAkC,CAAlC,CAAf;AACA,cAAMzW,OAAO,GAAG4c,0BAA0B,CAAC5c,OAA3C;AACA,cAAM1I,OAAO,CAACC,GAAR,CAAY,CAChBqP,WAAW,CAAC/H,KAAZ,CAAkBzB,aAAlB,CAAgCqZ,MAAM,CAAC/V,EAAvC,EAA2C+V,MAAM,CAAClX,OAAlD,EAA2D,EACzD,GAAGS,OADsD;AAEzDK,UAAAA,IAAI,EAAEL,OAAO,CAACK,IAAR,CACHwc,KADG,CACG,IADH,EAEH1sB,GAFG,CAEEuV,CAAD,IAAQ,IAAGA,CAAE,GAFd,EAGHwE,IAHG,CAGE,IAHF;AAFmD,SAA3D,CADgB,EAQhBtD,WAAW,CAAC/H,KAAZ,CAAkBvB,WAAlB,CAA8BmZ,MAAM,CAAC/V,EAArC,EAAyC+V,MAAM,CAAClX,OAAhD,EAAyDzC,KAAzD,CARgB,EAShBqE,UAAU,CAAC/K,WAAX,CAAuBmgB,iBAAvB,CAAyCuG,SAAzC,CACEF,0BADF,CATgB,CAAZ,CAAN;AAaD;;AAED,UAAI,CAACriB,IAAD,IAASiM,KAAK,KAAK,mBAAnB,IAA0CA,KAAK,KAAK,UAAxD,EAAoE;AAClE;AACD;;AAED,YAAMvJ,OAAO,GAAG2J,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CAA0BqW,QAAQ,CAAC/jB,KAAnC,CAAhB;AACA,YAAMunB,KAAK,GAAGtC,YAAA,CAAwBrR,WAAxB,EAAqCyD,WAArC,CAAd;AACA,YAAMuJ,YAAY,GAAGvJ,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CAA0B7B,KAAK,CAAC7L,KAAhC,CAArB;;AAEA,YAAMklB,aAAa,GAAG,CACpBuC,OADoB,EAEpB3G,YAFoB,KAGT;AACX,cAAMsE,SAAS,GAAGqC,OAAO,GACrB,SADqB,GAEpB,GAAE7G,YAAa,QACdE,YAAY,GAAG,qBAAH,GAA2B,EACxC,EAJL;;AAMA,YAAI7J,KAAK,KAAK,mBAAd,EAAmC;AACjC,iBAAQ,IAAG1J,KAAM,KAAIG,OAAQ,wBAAuB0X,SAAU,IAAGmC,KAAM,EAAvE;AACD;;AACD,YAAItQ,KAAK,KAAK,UAAd,EAA0B;AACxB,iBAAQ,GACNwQ,OAAO,GAAG,SAAH,GAAe,EACvB,IAAGla,KAAM,KAAIG,OAAQ,aAAY0X,SAAU,IAAGmC,KAAM,GACnDnO,MAAM,GAAG,0BAAH,GAAgC,EACvC,EAJD;AAKD;;AAED,cAAMoO,WAAW,GAAGvC,UAAA,CAAsB0I,SAAtB,EAAiC,WAAjC,CAApB;AACA,eAAQ,IAAGpgB,KAAM,KAAIG,OAAQ,IAAG8Z,WAAY,OAAMpC,SAAU,IAAGmC,KAAM,EAArE;AACD,OAvBD;;AAyBA,YAAMK,cAAc,GAAGxB,yBAAgB,CAAEpb,IAAF,CAAvC;AAEA+V,MAAAA,SAAS,CAAC5R,OAAV,CAAmB0V,QAAD,IAAc;AAC9BxN,QAAAA,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACE,WADF,EAEEkX,QAAQ,CAAC9oB,EAFX,EAGE8oB,QAAQ,CAAC7kB,KAHX,EAIEulB,oCAAoC,CAClCL,aAAa,CAACL,QAAQ,CAAC9oB,EAAT,KAAgB8P,KAAK,CAAC9P,EAAvB,EAA2B,IAA3B,CADqB,EAElC6rB,cAFkC,CAJtC;AASD,OAVD;AAYA,YAAMnX,OAAO,GAAG8U,oCAAoC,CAClDL,aAAa,CAAC,KAAD,CADqC,EAElD0C,cAFkD,CAApD;AAKAiG,MAAAA,iBAAiB,CAAC1e,OAAlB,CAA2BkW,QAAD,IAAc;AACtChO,QAAAA,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACE,kBADF,EAEE0X,QAAQ,CAACtpB,EAFX,EAGEspB,QAAQ,CAACrlB,KAHX,EAIEyQ,OAJF;AAMD,OAPD;AAQD,KAnKD,MAmKO,IAAIzF,IAAJ,EAAU;AACf,YAAM0C,OAAO,GAAG2J,WAAW,CAAC/H,KAAZ,CAAkB5B,OAAlB,CAA0BqW,QAAQ,CAAC/jB,KAAnC,CAAhB;AACA,YAAMunB,KAAK,GAAGtC,YAAA,CAAwBrR,WAAxB,EAAqCyD,WAArC,CAAd;AACA,YAAMmQ,WAAW,GAAGvC,UAAA,CAAsB0I,SAAtB,EAAiC,WAAjC,CAApB;AAEA,YAAMld,OAAO,GAAG8U,oCAAoC,CACjD,oBAAmB7X,OAAQ,IAAG8Z,WAAY,cAAaD,KAAM,EADZ,EAElDvc,IAFkD,CAApD;AAKA6iB,MAAAA,iBAAiB,CAAC1e,OAAlB,CAA2BkW,QAAD,IAAc;AACtChO,QAAAA,WAAW,CAAC/H,KAAZ,CAAkB3B,WAAlB,CACE,kBADF,EAEE0X,QAAQ,CAACtpB,EAFX,EAGEspB,QAAQ,CAACrlB,KAHX,EAIEyQ,OAJF;AAMD,OAPD;AAQD;AACF,GAvNqB,CAF1B;AA4ND;;ACjPD,MAAMsd,YAAY,GAAG,CACnBlc,OADmB,EAEnB2G,QAFmB,KAGP;AACZ,MAAI,CAACA,QAAL,EAAe,OAAO,KAAP;AACf,SAAO,CAAC,CAAC3G,OAAO,CAACmc,QAAR,CAAiBjkB,IAAjB,CAAuBkkB,CAAD,IAAOA,CAAC,CAAChsB,IAAF,KAAWuW,QAAQ,CAACZ,MAAjD,CAAT;AACD,CAND;;AAQe,SAAS7U,MAAT,CAAgB4J,GAAhB,EAA6BiF,UAA7B,EAA2D;AACxEjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,QADF,EAEEH,yBAAyB,CACvBnO,UADuB,EAEvB,CAACC,OAAD,EAAUwF,WAAV,KAA2C;AACzC,QAAIA,WAAW,CAACsG,YAAhB,EAA8B,OAAO,EAAP;AAE9B,UAAMnF,QAAQ,GAAGnB,WAAW,CAACoB,gBAAZ,EAAjB;AACA,QAAI,CAACD,QAAL,EAAe,OAAO,EAAP;;AAEf,QAAI3G,OAAO,CAACoF,KAAR,KAAkB,SAAlB,IAA+B8W,YAAY,CAAClc,OAAD,EAAU2G,QAAV,CAA/C,EAAoE;AAClE,aAAO,CAACA,QAAD,CAAP;AACD;;AAED,WAAO,EAAP;AACD,GAbsB,EAcvB,CAACnC,EAAD,EAAKlI,OAAL,EAAckJ,WAAd,KAAoC;AAClC,UAAMmB,QAAQ,GAAGnB,WAAW,CAACoB,gBAAZ,EAAjB,CADkC;;AAGlC,QAAIsV,YAAY,CAAC5f,OAAO,CAAC0D,OAAT,EAAkB2G,QAAlB,CAAhB,EAA6C;AAC3CnB,MAAAA,WAAW,CAACgC,UAAZ,CAAuBlL,OAAvB,EAAgCqK,QAAhC;AACD;AACF,GApBsB,CAF3B;AAyBD;;AChCc,SAAS0V,WAAT,CAAqBvhB,GAArB,EAAkCiF,UAAlC,EAAgE;AAC7EjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,0BADF,EAEEP,wBAAwB,CACtB/N,UADsB,EAEtB,CAACC,OAAD,EAAU1D,OAAV,EAAmBkJ,WAAnB,KAAmC;AACjC,QAAIA,WAAW,CAACsG,YAAhB,EAA8B,OAAO,IAAP;AAC9B,WAAO9L,OAAO,CAAC2S,YAAf;AACD,GALqB,EAMtB,OACE5Q,WADF,EAEEzF,OAFF,EAGEkJ,WAHF,EAIEC,mBAJF,KAKoB;AAClB,QAAI,CAACA,mBAAL,EAA0B;AAE1B,UAAM+I,SAAS,GAAG,MAAM3D,OAAO,CAACvO,OAAD,EAAUyF,WAAW,CAAC6D,MAAtB,CAA/B,CAHkB;AAKlB;;AACA,UAAM4J,WAAW,GAAIlT,OAAO,CAAC0D,OAAT,CAAyBsc,MAA7C;AAEA,UAAMpmB,OAAO,CAACC,GAAR,CAAY,CAChB+iB,YAAY,CACV1K,SADU,EAEVlS,OAFU,EAGVkJ,WAHU,EAIVC,mBAJU,EAKV,IALU,EAMV+J,WANU,CADI;AAUhBQ,IAAAA,2BAA2B,CACzBxB,SADyB,EAEzBlS,OAFyB,EAGzBkJ,WAHyB,EAIzBgJ,SAAS,CAACte,MAJe,EAKzBsf,WALyB,CAVX,CAAZ,CAAN,CARkB;;AA4BlB,UAAMjK,mBAAmB,CACvBiJ,SADuB,EAEvBlS,OAFuB,EAGvBkJ,WAHuB,EAIvBC,mBAJuB,CAAzB;AAMD,GA7CqB,CAF1B;AAkDD;;ACrDc,SAAS8W,UAAT,CAAoBzhB,GAApB,EAAiCiF,UAAjC,EAA+D;AAC5EjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,mBADF,EAEEnL,sBAAsB,CACpBnD,UADoB,EAEpB,MAAOzD,OAAP,IAA8C;AAC5C,UAAMkJ,WAAW,GAAG,MAAMkI,iBAAiB,CAAC3N,UAAD,EAAazD,OAAb,CAA3C;AACA,QAAI,CAACkJ,WAAL,EAAkB;AAClB,UAAMzL,IAAI,GAAGuC,OAAO,CAAC0D,OAAR,CAAgBpG,UAA7B;AACA4L,IAAAA,WAAW,CAACU,YAAZ,GAA2BnM,IAAI,CAACoM,SAAhC;AACAX,IAAAA,WAAW,CAAC0G,SAAZ,GAAwB1Q,2BAA2B,CAACzB,IAAI,CAACvG,WAAN,CAAnD;AACD,GARmB,CAFxB;AAaD;;AClBD;AAyBe,SAASgpB,OAAT,CAAiB1hB,GAAjB,EAA8BiF,UAA9B,EAA4D;AACzE;AACAjF,EAAAA,GAAG,CAACuT,EAAJ,CACE,CAAC,2BAAD,EAA8B,6BAA9B,CADF,EAEEnL,sBAAsB,CACpBnD,UADoB,EAEpB,OAAOzD,OAAP,EAAgByG,cAAhB,KAAmC;AACjC,UAAMxN,OAAO,CACXwK,UAAU,CAAC/K,WADA,EAEXsH,OAAO,CAAC9G,OAFG,EAGXuN,cAAc,CAACxG,OAAf,CAAuB9G,cAHZ,EAIX6G,OAAO,CAAC0D,OAAR,CAAgBiD,YAJL,CAAb;AAMD,GATmB,CAFxB;AAeA;;AACAnI,EAAAA,GAAG,CAACuT,EAAJ,CACE,CAAC,cAAD,EAAiB,cAAjB,EAAiC,aAAjC,CADF,EAEEnL,sBAAsB,CACpBnD,UADoB,EAEpB,MAAOzD,OAAP,IAAmC;AACjC,UAAM5E,SAAS,CACbqI,UAAU,CAAC/K,WADE,EAEbsH,OAAO,CAAC9G,OAFK,EAGb8G,OAAO,CAAC0D,OAAR,CAAgBiD,YAHH,CAAf;AAKD,GARmB,CAFxB;AAcA;;AACAnI,EAAAA,GAAG,CAACuT,EAAJ,CACE,CAAC,kBAAD,EAAqB,oBAArB,CADF,EAEEnL,sBAAsB,CACpBnD,UADoB,EAEpB,MAAOzD,OAAP,IAAmC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAMxE,uBAAuB,CAC3BiI,UAAU,CAAC/K,WADgB,EAE3BsH,OAAO,CAAC9G,OAFmB,EAG3B8G,OAAO,CAAC0D,OAAR,CAAgBiD,YAHW,CAA7B;AAKD,GAnBmB,CAFxB,EAjCyE;;AA2DzE;;AACAsZ,EAAAA,UAAU,CAACzhB,GAAD,EAAMiF,UAAN,CAAV,CA5DyE;;AA+DzE;;AACA0c,EAAAA,MAAa,CAAC3hB,GAAD,EAAMiF,UAAN,CAAb;AACA2c,EAAAA,MAAa,CAAC5hB,GAAD,EAAMiF,UAAN,CAAb;AACA4c,EAAAA,MAAa,CAAC7hB,GAAD,EAAMiF,UAAN,CAAb;AACA6c,EAAAA,QAAe,CAAC9hB,GAAD,EAAMiF,UAAN,CAAf;AAEA8c,EAAAA,eAAsB,CAAC/hB,GAAD,EAAMiF,UAAN,CAAtB;AACA+c,EAAAA,oBAA2B,CAAChiB,GAAD,EAAMiF,UAAN,CAA3B;AACAgd,EAAAA,eAAsB,CAACjiB,GAAD,EAAMiF,UAAN,CAAtB;AACAid,EAAAA,eAAsB,CAACliB,GAAD,EAAMiF,UAAN,CAAtB;AACAia,EAAAA,aAAa,CAAClf,GAAD,EAAMiF,UAAN,CAAb;AACAkd,EAAAA,WAAkB,CAACniB,GAAD,EAAMiF,UAAN,CAAlB;AAEA;;AACA;;AACAmd,EAAAA,gBAAc,CAACpiB,GAAD,EAAMiF,UAAN,CAAd;AACAod,EAAAA,wBAAsB,CAACriB,GAAD,EAAMiF,UAAN,CAAtB;AAEA;;AACAqO,EAAAA,iBAAiB,CAACtT,GAAD,EAAMiF,UAAN,CAAjB;AAEA;;AACA0O,EAAAA,mBAAmB,CAAC3T,GAAD,EAAMiF,UAAN,CAAnB;AAEA;;AACA7O,EAAAA,MAAM,CAAC4J,GAAD,EAAMiF,UAAN,CAAN;AAEA;AACA;AACD;;ACvHD;;AAkIA,IAAI,CAACrW,OAAO,CAACC,GAAR,CAAYyzB,QAAjB,EAA2B;AACzB,QAAM,IAAIvzB,KAAJ,CAAU,oCAAV,CAAN;AACD;;AAEc,SAASwzB,IAAT,GAA6B;AAC1C,QAAMpuB,MAAM,GAAG,IAAIqF,GAAJ,CAAQ,CACrB,CAAC,MAAD,EAAS5K,OAAO,CAACC,GAAR,CAAY2zB,UAAZ,IAA0B,WAAnC,CADqB,EAErB,CAAC,MAAD,EAAS5zB,OAAO,CAACC,GAAR,CAAY4zB,UAAZ,IAA0B,OAAnC,CAFqB,EAGrB,CAAC,UAAD,EAAa7zB,OAAO,CAACC,GAAR,CAAYyzB,QAAzB,CAHqB,CAAR,CAAf;;AAKA,MAAI1zB,OAAO,CAACC,GAAR,CAAY6zB,UAAhB,EAA4B;AAC1BvuB,IAAAA,MAAM,CAAC6F,GAAP,CAAW,MAAX,EAAmBpL,OAAO,CAACC,GAAR,CAAY6zB,UAA/B;AACAvuB,IAAAA,MAAM,CAAC6F,GAAP,CAAW,UAAX,EAAuBpL,OAAO,CAACC,GAAR,CAAY8zB,cAAnC;AACD;;AACD,QAAMC,UAAU,GAAG,IAAIC,yBAAJ,CAAoB1uB,MAApB,CAAnB,CAV0C;AAa1C;AACA;AACA;;AAEA,QAAMmG,cAAc,GAAG,IAAIwoB,oBAAJ,CACrBF,UADqB,EAErB,gBAFqB,CAAvB;AAIAtoB,EAAAA,cAAc,CAACgE,UAAf,CAA0B0J,IAA1B,CAAgC+a,IAAD,IAAU;AACvCA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAEnpB,MAAAA,MAAM,EAAE,CAAV;AAAaM,MAAAA,KAAK,EAAE;AAApB,KAAjB,EAA0C;AAAE8oB,MAAAA,MAAM,EAAE;AAAV,KAA1C;AACD,GAFD;AAIA,QAAM/vB,KAAK,GAAG,IAAI4vB,oBAAJ,CAAqBF,UAArB,EAAiC,OAAjC,CAAd;AACA1vB,EAAAA,KAAK,CAACoL,UAAN,CAAiB0J,IAAjB,CAAuB+a,IAAD,IAAU;AAC9BA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAE3vB,MAAAA,KAAK,EAAE;AAAT,KAAjB,EAA+B;AAAE4vB,MAAAA,MAAM,EAAE;AAAV,KAA/B;AACD,GAFD;AAIA,QAAMpvB,IAAI,GAAG,IAAIivB,oBAAJ,CAAoBF,UAApB,EAAgC,MAAhC,CAAb;AACA/uB,EAAAA,IAAI,CAACyK,UAAL,CAAgB0J,IAAhB,CAAsB+a,IAAD,IAAU;AAC7BA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAE3vB,MAAAA,KAAK,EAAE;AAAT,KAAjB,EAA+B;AAAE4vB,MAAAA,MAAM,EAAE;AAAV,KAA/B;AACD,GAFD;AAIA,QAAMznB,UAAU,GAAG,IAAIsnB,oBAAJ,CAA0BF,UAA1B,EAAsC,YAAtC,CAAnB;AACApnB,EAAAA,UAAU,CAAC8C,UAAX,CAAsB0J,IAAtB,CAA4B+a,IAAD,IAAU;AACnCA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAE,iBAAW,CAAb;AAAgB,gBAAU;AAA1B,KAAjB,EAAgD;AAAEC,MAAAA,MAAM,EAAE;AAAV,KAAhD;AACAF,IAAAA,IAAI,CAACC,WAAL,CACE;AAAE,gBAAU,CAAZ;AAAe,iBAAW,CAA1B;AAA6B,kBAAY;AAAzC,KADF,EAEE;AAAEC,MAAAA,MAAM,EAAE;AAAV,KAFF;AAIAF,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAE,gBAAU,CAAZ;AAAe,kBAAY;AAA3B,KAAjB;AACD,GAPD;AASA,QAAMjmB,QAAQ,GAAG,IAAI+lB,oBAAJ,CAAwBF,UAAxB,EAAoC,UAApC,CAAjB;AACA7lB,EAAAA,QAAQ,CAACuB,UAAT,CAAoB0J,IAApB,CAA0B+a,IAAD,IAAU;AACjCA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AAAE,gBAAU;AAAZ,KAAjB;AACD,GAFD;AAIA,QAAM3I,iBAAiB,GAAG,IAAIyI,oBAAJ,CACxBF,UADwB,EAExB,mBAFwB,CAA1B;AAIAvI,EAAAA,iBAAiB,CAAC/b,UAAlB,CAA6B0J,IAA7B,CAAmC+a,IAAD,IAAU;AAC1CA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AACf,oBAAc,CADC;AAEf,sBAAgB,CAFD;AAGfvnB,MAAAA,IAAI,EAAE,CAHS;AAIf6e,MAAAA,MAAM,EAAE;AAJO,KAAjB,EAD0C;;AAQ1CyI,IAAAA,IAAI,CAACrnB,UAAL,CAAgB;AACdkD,MAAAA,OAAO,EAAE;AAAEskB,QAAAA,GAAG,EAAE,IAAI3vB,IAAJ,CAASA,IAAI,CAACC,GAAL,eAAT;AAAP;AADK,KAAhB;AAGD,GAXD;AAaA,QAAM8X,aAAa,GAAG,IAAIwX,oBAAJ,CACpBF,UADoB,EAEpB,eAFoB,CAAtB;AAIAtX,EAAAA,aAAa,CAAChN,UAAd,CAAyB0J,IAAzB,CAA+B+a,IAAD,IAAU;AACtCA,IAAAA,IAAI,CAACC,WAAL,CAAiB;AACf5X,MAAAA,YAAY,EAAE,CADC;AAEf3P,MAAAA,IAAI,EAAE;AAFS,KAAjB;AAIAsnB,IAAAA,IAAI,CAACC,WAAL,CAAiB;AACf5X,MAAAA,YAAY,EAAE,CADC;AAEf,mBAAa;AAFE,KAAjB,EALsC;;AAUtC2X,IAAAA,IAAI,CAACrnB,UAAL,CAAgB;AACdkD,MAAAA,OAAO,EAAE;AAAEskB,QAAAA,GAAG,EAAE,IAAI3vB,IAAJ,CAASA,IAAI,CAACC,GAAL,eAAT;AAAP;AADK,KAAhB;AAGD,GAbD;AAeA,QAAMmc,GAAG,GAAG,IAAImT,oBAAJ,CAA6BF,UAA7B,EAAyC,KAAzC,CAAZ;AACAjT,EAAAA,GAAG,CAACrR,UAAJ,CAAe0J,IAAf,CAAqB+a,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,CAACrnB,UAAL,CAAgB;AACdkD,MAAAA,OAAO,EAAE;AAAEskB,QAAAA,GAAG,EAAE,IAAI3vB,IAAJ,CAASA,IAAI,CAACC,GAAL,gBAAT;AAAP;AADK,KAAhB;AAGD,GAbD,EAvF0C;;AAuG1C,SAAO;AACLovB,IAAAA,UADK;AAELtoB,IAAAA,cAFK;AAGLpH,IAAAA,KAHK;AAILW,IAAAA,IAJK;AAKL2H,IAAAA,UALK;AAMLuB,IAAAA,QANK;AAOLsd,IAAAA,iBAPK;AAQL/O,IAAAA,aARK;AASLqE,IAAAA;AATK,GAAP;AAWD;;AC7OM,MAAMwT,qBAAqB,GAAIjpB,WAAD,IAA8B;AACjE,QAAMkpB,YAAY,GAAG,OACnB1oB,OADmB,EAEnBwH,WAFmB,EAGnB5G,MAHmB,KAID;AAAA;;AAClB,QAAI,mBAACA,MAAM,CAACqH,KAAR,0CAAC,cAAcvT,EAAf,CAAJ,EAAuB,OADL;;AAIlB;;AACA,UAAM,CACJi0B,uBADI,EAEJC,UAFI,EAGJC,uBAHI,EAIJC,UAJI,IAKF,MAAMpoB,OAAO,CAACC,GAAR,CAAY,CACpBX,OAAO,CAAC+oB,MAAR,CAAeC,qBAAf,CAAqC;AACnCC,MAAAA,CAAC,EAAG,cAAaroB,MAAM,CAACpH,GAAP,CAAWb,KAAM,6BAA4BiI,MAAM,CAACrI,IAAP,CAAYI,KAAM,GAD7C;AAEnCuwB,MAAAA,IAAI,EAAE,SAF6B;AAGnCC,MAAAA,KAAK,EAAE;AAH4B,KAArC,CADoB,EAMpBnpB,OAAO,CAAC+oB,MAAR,CAAeC,qBAAf,CAAqC;AACnCC,MAAAA,CAAC,EAAG,cAAaroB,MAAM,CAACpH,GAAP,CAAWb,KAAM,qBAAoBiI,MAAM,CAACrI,IAAP,CAAYI,KAAM,kCADrC;AAEnCuwB,MAAAA,IAAI,EAAE,SAF6B;AAGnCC,MAAAA,KAAK,EAAE;AAH4B,KAArC,CANoB,EAWpBnpB,OAAO,CAAC+oB,MAAR,CAAeC,qBAAf,CAAqC;AACnCC,MAAAA,CAAC,EAAG,cAAaroB,MAAM,CAACpH,GAAP,CAAWb,KAAM,qBAAoBiI,MAAM,CAACrI,IAAP,CAAYI,KAAM,2CADrC;AAEnCuwB,MAAAA,IAAI,EAAE,SAF6B;AAGnCC,MAAAA,KAAK,EAAE;AAH4B,KAArC,CAXoB,EAgBpBnpB,OAAO,CAAC+oB,MAAR,CAAeC,qBAAf,CAAqC;AACnCC,MAAAA,CAAC,EAAG,cAAaroB,MAAM,CAACpH,GAAP,CAAWb,KAAM,qBAAoBiI,MAAM,CAACrI,IAAP,CAAYI,KAAM,aADrC;AAEnCuwB,MAAAA,IAAI,EAAE,SAF6B;AAGnCC,MAAAA,KAAK,EAAE,MAH4B;AAInC7kB,MAAAA,QAAQ,EAAE;AAJyB,KAArC,CAhBoB,CAAZ,CALV;AA6BA,UAAMoF,MAAa,GAAG,EAAtB;;AAEA,UAAM0f,WAAW,GAAG,CAACl0B,KAAD,EAAgBuqB,OAAhB,KAAiC;AACnD,UAAI,CAACA,OAAO,CAAC4J,WAAb,EAA0B;AAE1B3f,MAAAA,MAAM,CAAC7I,IAAP,CACE;AACEE,QAAAA,IAAI,EAAE,SADR;AAEE0I,QAAAA,IAAI,EAAE;AACJ1I,UAAAA,IAAI,EAAE,QADF;AAEJ0I,UAAAA,IAAI,EAAG,IAAGvU,KAAM;AAFZ;AAFR,OADF,EAQE;AACE6L,QAAAA,IAAI,EAAE;AADR,OARF,EAWE,GAAG0e,OAAO,CAAC6J,KAAR,CACA/vB,GADA,CACKyV,EAAD,IAAa;AAChB,cAAMkH,QAAQ,GAAGlH,EAAE,CAACua,cAAH,CAAkBtgB,KAAlB,IAAjB;AAGA,cAAMugB,UAAU,GAAI,GAAEtT,QAAS,IAAGlH,EAAE,CAACoB,MAAO,EAA5C;AAEA,eAAO,CACL;AACErP,UAAAA,IAAI,EAAE,SADR;AAEE0I,UAAAA,IAAI,EAAE;AACJ1I,YAAAA,IAAI,EAAE,QADF;AAEJ0I,YAAAA,IAAI,EAAG,IAAG0P,UAAU,CAACnK,EAAE,CAACqK,QAAJ,EAAcrK,EAAE,CAAC9Z,KAAjB,CAAwB,GAFxC;;AAAA;AAFR,SADK,EASL;AACE6L,UAAAA,IAAI,EAAE,SADR;AAEE0oB,UAAAA,QAAQ,EAAE,CACR;AACE1oB,YAAAA,IAAI,EAAE,QADR;AAEE0I,YAAAA,IAAI,EAAG,GAAE0P,UAAU,CAACnK,EAAE,CAACqK,QAAJ,EAAcmQ,UAAd,CAA0B,IAC3Cxa,EAAE,CAAC0a,KAAH,GAAW,WAAX,GAAyB,EAC1B;AAJH,WADQ,EAOR;AACE3oB,YAAAA,IAAI,EAAE,OADR;AAEE4oB,YAAAA,SAAS,EAAE3a,EAAE,CAACzW,IAAH,CAAQqxB,UAFrB;AAGEC,YAAAA,QAAQ,EAAE7a,EAAE,CAACzW,IAAH,CAAQI;AAHpB,WAPQ,EAYR;AACEoI,YAAAA,IAAI,EAAE,QADR;AAEE0I,YAAAA,IAAI,EAAG,GAAEuF,EAAE,CAACzW,IAAH,CAAQI,KAAM;AAFzB,WAZQ;AAFZ,SATK,CAAP;AA8BD,OArCA,EAsCAmxB,IAtCA,EAXL,EAkDE;AACE/oB,QAAAA,IAAI,EAAE,SADR;AAEE0oB,QAAAA,QAAQ,EAAE,CACR;AACE1oB,UAAAA,IAAI,EAAE,OADR;AAEE4oB,UAAAA,SAAS,EACP,sEAHJ;AAIEE,UAAAA,QAAQ,EAAE;AAJZ,SADQ;AAFZ,OAlDF;AA8DD,KAjED;;AAmEAT,IAAAA,WAAW,CAAC,0BAAD,EAA6BT,uBAAuB,CAACjwB,IAArD,CAAX;AACA0wB,IAAAA,WAAW,CAAC,mCAAD,EAAsCR,UAAU,CAAClwB,IAAjD,CAAX;AACA0wB,IAAAA,WAAW,CAAC,uBAAD,EAA0BP,uBAAuB,CAACnwB,IAAlD,CAAX;AACA0wB,IAAAA,WAAW,CAAC,uBAAD,EAA0BN,UAAU,CAACpwB,IAArC,CAAX;;AAEA,QAAIgR,MAAM,CAACjF,MAAP,KAAkB,CAAtB,EAAyB;AACvBiF,MAAAA,MAAM,CAAC7I,IAAP,CAAY;AACVE,QAAAA,IAAI,EAAE,SADI;AAEV0I,QAAAA,IAAI,EAAE;AACJ1I,UAAAA,IAAI,EAAE,QADF;AAEJ0I,UAAAA,IAAI,EAAE;AAFF;AAFI,OAAZ;AAOD;;AAEDjC,IAAAA,WAAW,CAACuiB,KAAZ,CAAkBC,OAAlB,CAA0B;AACxBC,MAAAA,OAAO,EAAErpB,MAAM,CAACqH,KAAP,CAAavT,EADE;AAExBw1B,MAAAA,IAAI,EAAE;AACJnpB,QAAAA,IAAI,EAAE,MADF;AAEJ2I,QAAAA;AAFI;AAFkB,KAA1B;AAOD,GAjID;;AAmIA,MAAIygB,cAAJ;AACA,QAAMC,SAAS,GAAG,IAAIpf,GAAJ,EAAlB;AACA,QAAMqf,KAAkB,GAAG,EAA3B;;AAEA,QAAMC,IAAI,GAAG,MAAY;AACvB,QAAIH,cAAc,KAAKpzB,SAAvB,EAAkC;AAChCwzB,MAAAA,aAAa,CAACJ,cAAD,CAAb;AACAA,MAAAA,cAAc,GAAGpzB,SAAjB;AACD;AACF,GALD;;AAOA,QAAMyzB,KAAK,GAAG,MAAY;AACxB,QAAIL,cAAc,KAAKpzB,SAAvB,EAAkC;AAClCozB,IAAAA,cAAc,GAAGM,WAAW,CAAC,MAAM;AAAA;;AACjC,YAAMC,IAAI,GAAGL,KAAK,CAACzS,KAAN,EAAb;;AACA,UAAI,CAAC8S,IAAL,EAAW;AACTJ,QAAAA,IAAI;AACJ;AACD;;AAED,YAAM;AAAEvlB,QAAAA,MAAF;AAAUyC,QAAAA,WAAV;AAAuB5G,QAAAA;AAAvB,UAAkC8pB,IAAxC;AACA,YAAM5oB,QAAQ,qBAAGlB,MAAM,CAACqH,KAAV,mDAAG,eAAcvT,EAA/B;AAEA,YAAM4O,GAAG,GAAI,GAAE1C,MAAM,CAACpH,GAAP,CAAW9E,EAAG,IAAGoN,QAAS,EAAzC;AACAsoB,MAAAA,SAAS,CAACngB,MAAV,CAAiB3G,GAAjB;AAEAolB,MAAAA,YAAY,CAAC3jB,MAAD,EAASyC,WAAT,EAAsB5G,MAAtB,CAAZ;AACD,KAd2B,EAczB,IAdyB,CAA5B,CAFwB;AAiBzB,GAjBD;;AAmBA,QAAMyJ,oBAAoB,GAAG,CAC3BtF,MAD2B,EAE3ByC,WAF2B,EAG3B5G,MAH2B,KAIlB;AAAA;;AACT,UAAMkB,QAAQ,qBAAGlB,MAAM,CAACqH,KAAV,mDAAG,eAAcvT,EAA/B;AACA,QAAI,CAACoN,QAAL,EAAe;AAEf,UAAMwB,GAAG,GAAI,GAAE1C,MAAM,CAACpH,GAAP,CAAW9E,EAAG,IAAGoN,QAAS,EAAzC;;AAEA,QAAI,CAACsoB,SAAS,CAAC5hB,GAAV,CAAclF,GAAd,CAAL,EAAyB;AACvB8mB,MAAAA,SAAS,CAACjgB,GAAV,CAAc7G,GAAd;AACA+mB,MAAAA,KAAK,CAACxpB,IAAN,CAAW;AACTkE,QAAAA,MADS;AAETyC,QAAAA,WAFS;AAGT5G,QAAAA;AAHS,OAAX;AAKA4pB,MAAAA,KAAK;AACN;AACF,GAnBD;;AAqBA,QAAMG,iBAAiB,GAAG,OACxB5lB,MADwB,EAExBvL,GAFwB,EAGxBgO,WAAW,GAAG,IAAIC,gBAAJ,CAAcjO,GAAG,CAACwN,UAAlB,CAHU,KAIN;AAClB,UAAMkF,MAAM,GAAG,MAAM1M,WAAW,CAACsB,UAAZ,CAAuBoL,MAAvB,EAArB;AACAA,IAAAA,MAAM,CAACpE,OAAP,CAAgBlH,MAAD,IAAY;AACzByJ,MAAAA,oBAAoB,CAACtF,MAAD,EAASyC,WAAT,EAAsB5G,MAAtB,CAApB;AACD,KAFD;AAGD,GATD;;AAsBA,SAAO;AACLyJ,IAAAA,oBADK;AAELsgB,IAAAA,iBAFK;AAGLC,IAAAA,qBAAqB,EAdO,OAC5Bh2B,IAD4B,KAEV;AAClB,YAAMsX,MAAM,GAAG,MAAM1M,WAAW,CAACrG,IAAZ,CAAiB+S,MAAjB,EAArB;AACAA,MAAAA,MAAM,CAACpE,OAAP,CAAe,MAAOtO,GAAP,IAAe;AAC5B,YAAI,CAACA,GAAG,CAACwN,UAAL,IAAmB,CAACxN,GAAG,CAACyG,cAA5B,EAA4C;AAC5C,cAAM8E,MAAM,GAAG,MAAMnQ,IAAI,CAAC4E,GAAG,CAACyG,cAAL,CAAzB;AACA,cAAM0qB,iBAAiB,CAAC5lB,MAAD,EAASvL,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;AAClCyT,OAAO,CAACS,GAAR,CAAY;AAAEzO,EAAAA,IAAI,EAAE1G,OAAO,CAACC,GAAR,CAAYgB;AAApB,CAAZ;AAGA;AAEA;AACA;AAEA;;AAEA01B,UAAG,CAAC,CAACvlB,GAAD,EAAM;AAAEC,EAAAA;AAAF,CAAN,KAAwB;AAC1B,QAAM/F,WAAW,GAAGsrB,IAAS,EAA7B;AACA,QAAMjkB,SAAS,GAAG4hB,qBAAqB,CAACjpB,WAAD,CAAvC;AACA,QAAM+K,UAAsB,GAAG;AAAE/K,IAAAA,WAAF;AAAeqH,IAAAA;AAAf,GAA/B;AACAxB,EAAAA,SAAS,CAACC,GAAD,EAAMC,SAAN,EAAiBgF,UAAjB,CAAT;AACAyc,EAAAA,OAAO,CAAC1hB,GAAD,EAAMiF,UAAN,CAAP;AACA1D,EAAAA,SAAS,CAAC+jB,qBAAV,CAAiCl2B,EAAD,IAAgB4Q,GAAG,CAAC1Q,IAAJ,CAASF,EAAT,CAAhD;AACD,CAPE,CAAH;;"} \ No newline at end of file +{"version":3,"file":"index-node12-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/utils/Excludes.ts","../src/events/account-handlers/actions/syncTeamMembers.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/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/slack/utils.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/utils/getReviewersAndReviewStates.ts","../src/events/pr-handlers/utils/getRolesFromPullRequestAndReviewers.ts","../src/events/pr-handlers/closed.ts","../src/events/pr-handlers/utils/createSlackMessageWithSecondaryBlock.ts","../src/events/pr-handlers/utils/getPullRequestFromPayload.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 || 3000}` : ''\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 try {\n const authInfo = await readAuthCookie(req, strategy);\n\n if (authInfo?.id) {\n return authInfo;\n }\n } catch {}\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(\n '/login',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (req: Request, res: Response) => {\n if (await getAuthInfoFromCookie(req, res)) {\n res.redirect('/app');\n return;\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\n router.get(\n '/login-response',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\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(\n '/',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\n","import type { Config } from './types';\n\nconst config: Config<'dev', never> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prDefaultOptions: {\n autoMerge: false,\n autoMergeWithSkipCi: 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)|(?=!:\\s)))?(?!)?(?:\\s.*)$/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://www.npmjs.com/package/@commitlint/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: ':vertical_traffic_light: automerge',\n color: '#64DD17',\n },\n 'merge/skip-ci': {\n name: ':vertical_traffic_light: 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 autoMerge: false,\n autoMergeWithSkipCi: 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 { regexConventionalCommit } from '../utils/conventionalCommit';\nimport 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 autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\n title: [\n {\n // eslint-disable-next-line unicorn/no-unsafe-regex\n regExp: /^(?revert: )?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\\([/A-Za-z-]+\\)?((?=:\\s)|(?=!:\\s)))?(?!)?(?:\\s.*)$/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://www.npmjs.com/package/@commitlint/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 head: [\n {\n bot: false,\n // eslint-disable-next-line unicorn/no-unsafe-regex\n regExp: /^(?revert-\\d+-)?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\\/[a-z-]+)?\\/(?!)?(?.*)-(?[A-Z][\\dA-Z]+-(\\d+))$/,\n warning: true,\n error: {\n title: 'Branch name does not match commitlint conventional',\n summary: '',\n },\n },\n ],\n base: [\n {\n regExp: /^(master|main)$/,\n error: {\n title: 'PR to branches other than main is not recommended',\n summary:\n 'https://ornikar.atlassian.net/wiki/spaces/TECH/pages/2221900272/Should+I+make+a+feature-branch+or+not',\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 AymenBac: `aymen${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 camillebaronnet: `camille.baronnet${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'olivier-martinez': `olivier.martinez${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 GaelFerrand: 'gael.ferrand@othrys.dev',\n aenario: `romain.foucault${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\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: `loic.leser${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n carlbouville: `carl.bouville${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n },\n\n groupsGithubTeams: {\n dev: ['ops', 'backend', 'frontend', 'frontend-architects'],\n design: ['design'],\n },\n\n teams: {\n ops: {\n githubTeamName: 'ops',\n logins: ['JulienBreux', 'TheR3aLp3nGuinJM', 'AymenBac'],\n labels: ['teams/ops'],\n },\n\n backends: {\n githubTeamName: 'backend',\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n 'machartier',\n 'camillebaronnet',\n 'olivier-martinez',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n githubTeamName: 'frontend',\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'vlbr',\n 'budet-b',\n 'mdcarter',\n 'ChibiBlasphem',\n 'PSniezak',\n 'aenario',\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: ':vertical_traffic_light: 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-lifecycle': true,\n 'pr-lifecycle-follow': true,\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 { MongoStores, Org } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\n\ninterface OrgInfo {\n login: string;\n id: number;\n}\n\nexport const syncOrg = async (\n mongoStores: MongoStores,\n octokit: T,\n installationId: number,\n org: OrgInfo,\n): Promise => {\n const orgInStore = await mongoStores.orgs.upsertOne({\n _id: org.id,\n login: org.login,\n installationId,\n });\n\n const orgEmbed = { id: org.id, login: org.login };\n\n const memberIds: number[] = [];\n\n for await (const { data } of octokit.paginate.iterator(\n octokit.orgs.listMembers,\n { org: org.login },\n )) {\n await Promise.all(\n data.map(async (member) => {\n if (!member) return;\n memberIds.push(member.id);\n return Promise.all([\n mongoStores.orgMembers.upsertOne<'teams'>(\n {\n _id: `${org.id}_${member.id}`,\n org: orgEmbed,\n user: {\n id: member.id,\n login: member.login,\n },\n },\n {\n teams: [], // teams is synced in syncTeamMembers\n },\n ),\n mongoStores.users.upsertOne({\n _id: member.id,\n login: member.login,\n type: member.type,\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","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 { MongoStores, OrgTeamEmbed } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\nimport { ExcludesFalsy } from '../../../utils/Excludes';\n\nexport const syncTeamMembers = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n team: OrgTeamEmbed,\n): Promise => {\n const memberIds: number[] = [];\n for await (const { data } of octokit.paginate.iterator(\n octokit.teams.listMembersInOrg,\n {\n org: org.login,\n team_slug: team.slug,\n },\n )) {\n const currentIterationMemberIds = data\n .filter(ExcludesFalsy)\n .map((member) => member.id);\n memberIds.push(...currentIterationMemberIds);\n\n await mongoStores.orgMembers.partialUpdateMany(\n {\n _id: {\n $in: currentIterationMemberIds.map(\n (memberId) => `${org.id}_${memberId}`,\n ),\n },\n 'org.id': org.id,\n 'teams.id': { $ne: team.id },\n },\n { $push: { teams: team } },\n );\n }\n\n await mongoStores.orgMembers.partialUpdateMany(\n {\n 'org.id': org.id,\n 'user.id': { $not: { $in: memberIds } },\n },\n { $pull: { teams: { id: team.id } } },\n );\n};\n\nexport const syncTeamMembersWithTeamParents = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n team: OrgTeamEmbed,\n): Promise => {};\n","import type { MongoStores, OrgTeamEmbed } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\nimport { syncTeamMembers } from './syncTeamMembers';\n\nexport const syncTeams = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const orgEmbed = { id: org.id, login: org.login };\n\n const teamEmbeds: OrgTeamEmbed[] = [];\n const teamIds: number[] = [];\n\n for await (const { data } of octokit.paginate.iterator(octokit.teams.list, {\n org: org.login,\n })) {\n await Promise.all(\n data.map(async (team) => {\n teamIds.push(team.id);\n teamEmbeds.push({\n id: team.id,\n name: team.name,\n slug: team.slug,\n });\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 await Promise.all([\n mongoStores.orgTeams.deleteMany({\n 'org.id': org.id,\n _id: { $not: { $in: teamIds } },\n }),\n\n mongoStores.orgMembers.partialUpdateMany(\n {\n 'org.id': org.id,\n },\n { $pull: { teams: { id: { $not: { $in: teamIds } } } } },\n ),\n ]);\n\n return teamEmbeds;\n};\n\nexport const syncTeamsAndTeamMembers = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const teams = await syncTeams(mongoStores, octokit, org);\n for (const team of teams) {\n await syncTeamMembers(mongoStores, octokit, org, team);\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 { syncTeamsAndTeamMembers } 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-lifecycle': 'Your PR is closed, merged, reopened',\n 'pr-lifecycle-follow':\n \"Someone closed, merged, reopened a PR you're reviewing\",\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(\n '/org/:org/force-sync',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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 syncTeamsAndTeamMembers(mongoStores, user.api, org);\n\n res.redirect(`/app/org/${req.params.org}`);\n },\n );\n\n router.get(\n '/org/:org',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\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(\n '/repositories',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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 {data.map((repo: any) => (\n
  • \n \n {repo.name}\n \n
  • \n ))}\n
\n\n {data.length === 100 && (\n
We currently have a limit to 100 repositories
\n )}\n
\n
,\n ),\n );\n },\n );\n\n router.get(\n '/repository/:owner/:repository',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\n 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}\n","import type { MongoStores, User } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\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(\n '/user/force-sync',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\n router.get(\n '/user',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\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 >[1]['getRouter'],\n { mongoStores }: AppContext,\n): Promise {\n const router = (getRouter as NonNullable)('/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","import { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeamsAndTeamMembers } from '../events/account-handlers/actions/syncTeams';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { Org, User } from '../mongo';\nimport type { Octokit } from '../octokit';\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 syncTeamsAndTeamMembers(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 = (o: T): (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 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 // TODO pass AccountInfo instead\n if (githubLogin.endsWith('[bot]')) {\n return `:robot_face: ${githubLogin.slice(0, -'[bot]'.length)}`;\n }\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 account.login,\n account._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 {\n PullRequestWithDecentData,\n PullRequestWithDecentDataFromWebhook,\n} from 'events/pr-handlers/utils/PullRequestData';\nimport type { Config } from '../accountConfigs';\nimport type {\n Org,\n User,\n AccountEmbed,\n AccountType,\n AccountEmbedWithoutType,\n OrgMember,\n} 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 getTeamGroup: (teamName: string) => GroupNames | undefined;\n getGithubTeamsGroups: (teamNames: string[]) => GroupNames[];\n getMembersForTeam: (teamId: string) => Promise;\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\n approveShouldWait: (\n reviewerGroup: GroupNames | undefined,\n pullRequest: PullRequestWithDecentData,\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 for (const groupName of getKeys(config.groups)) {\n Object.keys(config.groups[groupName]).forEach((login) => {\n githubLoginToGroup.set(login, groupName);\n });\n }\n\n const githubTeamNameToGroup = new Map();\n if (config.groupsGithubTeams) {\n for (const groupName of getKeys(config.groupsGithubTeams)) {\n config.groupsGithubTeams[groupName].forEach((teamName) => {\n githubTeamNameToGroup.set(teamName, groupName);\n });\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 const getGithubTeamsGroups = (githubTeamNames: string[]): string[] => [\n ...new Set(\n githubTeamNames\n .map((teamName) => githubTeamNameToGroup.get(teamName))\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 getTeamGroup: (githubTeamName): string | undefined =>\n githubTeamNameToGroup.get(githubTeamName),\n getGithubTeamsGroups,\n\n getTeamsForLogin: (githubLogin): string[] =>\n githubLoginToTeams.get(githubLogin) || [],\n\n getMembersForTeam: async (teamId): Promise => {\n if (accountInfo.type !== 'Organization') {\n throw new Error(\n `Invalid account type \"${accountInfo.type}\" for getMembersForTeam`,\n );\n }\n const cursor = await appContext.mongoStores.orgMembers.cursor<\n Pick\n >({\n 'org.id': account._id,\n 'teams.id': teamId,\n });\n await cursor.limit(100);\n const orgMembers = await cursor.toArray();\n return orgMembers.map((member) => member.user);\n },\n\n approveShouldWait: (\n reviewerGroup,\n pullRequest,\n { includesReviewerGroup, includesWaitForGroups },\n ): boolean => {\n if (\n !reviewerGroup ||\n !pullRequest.requested_reviewers ||\n !pullRequest.requested_teams\n ) {\n return false;\n }\n\n const requestedReviewerGroups = [\n ...new Set([\n ...getReviewerGroups(\n (pullRequest.requested_reviewers as PullRequestWithDecentDataFromWebhook['requested_reviewers']).map(\n (request) => request.login,\n ),\n ),\n ...(!pullRequest.requested_teams\n ? []\n : getGithubTeamsGroups(\n (pullRequest.requested_teams as PullRequestWithDecentDataFromWebhook['requested_teams']).map(\n (team) => team.name,\n ),\n )),\n ]),\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 | 'autoMerge'\n | 'autoMergeWithSkipCi'\n | 'deleteAfterMerge';\n\nexport type Options = Record;\n\nexport const options: OptionsKeys[] = [\n 'autoMerge',\n 'autoMergeWithSkipCi',\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\ninterface OptionDisplay {\n key: OptionsKeys;\n labelKey?: string;\n icon?: string;\n description: string;\n}\n\nexport const optionsDescriptions: OptionDisplay[] = [\n {\n key: 'autoMerge',\n labelKey: 'merge/automerge',\n description:\n 'Automatically merge when this PR is ready and has no failed statuses. When the repository requires _branches to be up to date before merging_, it merges default branch, with a queue per repo to prevent multiple merges when several PRs are ready. A fail job prevents the merge.',\n },\n {\n key: 'autoMergeWithSkipCi',\n labelKey: 'merge/skip-ci',\n description:\n 'Add `[skip ci]` on merge commit when merge is done with autoMerge.',\n },\n {\n key: 'deleteAfterMerge',\n icon: ':recycle:',\n description: 'Automatically delete the branch 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 return false;\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 (\n pullRequest.requested_reviewers &&\n pullRequest.requested_reviewers.length > 0\n ) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested reviewers',\n );\n return false;\n }\n\n if (pullRequest.requested_teams && pullRequest.requested_teams.length > 0) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested teams',\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 lockedPrNumber: lockedPr.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 (\n pullRequest.body &&\n pullRequest.body.includes('')\n ) {\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 const isFeatureBranch = false; // options.featureBranch;\n\n const mergeResult = await context.octokit.pulls.merge({\n merge_method: isFeatureBranch ? 'merge' : 'squash',\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n pull_number: pullRequest.number,\n commit_title: isFeatureBranch\n ? undefined\n : `${pullRequest.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pullRequest.number})`,\n commit_message: isFeatureBranch ? 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 { LabelList, StatusInfo } from 'accountConfigs/types';\nimport type { Options } from './parseBody';\nimport { parseOptions } from './parseBody';\nimport { optionsDescriptions } from './prOptions';\n\nexport const defaultCommentBody = 'This will be auto filled by reviewflow.';\n\nconst toMarkdownOptions = (\n repoLink: string,\n labelsConfig: LabelList,\n options: Options,\n): string => {\n return optionsDescriptions\n .map(({ key, labelKey, description, icon: iconValue }) => {\n const checkboxWithId = `[${\n options[key] ? 'x' : ' '\n }] `;\n\n const labelDescription = labelKey && labelsConfig[labelKey];\n const labelLink = labelDescription\n ? `[${labelDescription.name}](${repoLink}/labels/${encodeURIComponent(\n labelDescription.name,\n )}): `\n : '';\n const icon = labelLink || !iconValue ? '' : `${iconValue} `;\n\n return `- ${checkboxWithId}${icon}${labelLink}${description}`;\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 repoLink: string,\n labelsConfig: LabelList,\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 repoLink,\n labelsConfig,\n options,\n )}`;\n};\n\nexport const createCommentBody = (\n repoLink: string,\n labelsConfig: LabelList,\n defaultOptions: Options,\n infos?: StatusInfo[],\n): string => {\n return internalUpdateBodyOptionsAndInfos(\n repoLink,\n labelsConfig,\n '',\n defaultOptions,\n infos,\n );\n};\n\nexport const updateCommentOptions = (\n repoLink: string,\n labelsConfig: LabelList,\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(\n repoLink,\n labelsConfig,\n commentBody,\n updatedOptions,\n ),\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 !commitNotes ? '$1' : `#### Commits Notes:\\n\\n${commitNotes}\\n\\n$1`,\n );\n};\n\nexport const removeDeprecatedReviewflowInPrBody = (\n prBody: string | null,\n): string => {\n if (!prBody) return '';\n return prBody.replace(\n /^(.*)(.*)(.*)$/is,\n '$1$3',\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/rest';\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 as string };\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 as string };\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 as string };\n};\n","import type { RestEndpointMethodTypes } from '@octokit/rest';\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/rest';\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 | null;\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 if (labelKey === 'merge/skip-ci') {\n existingLabel = labels.find(\n (label) => label.name === 'automerge/skip-ci',\n );\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 name: existingLabel.name,\n new_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';\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<\n GroupNames extends string = any\n> = AccountContext & 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 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) => label.id && needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && requestedReviewLabelIds.includes(label.id),\n );\n const hasChangesRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && changesRequestedLabelIds.includes(label.id),\n );\n const hasApprovesReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && approvedReviewLabelIds.includes(label.id),\n );\n\n const getNeedsReviewGroupNames = (labels: PullRequestLabels): GroupNames[] =>\n labels\n .filter((label) => label.id && needsReviewLabelIds.includes(label.id))\n .map((label) =>\n labelIdToGroupName.get(label.id as NonNullable),\n )\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 { 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): ((context: Context) => Promise) => {\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 { 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\ntype OnCallback = (context: Context) => Promise;\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 GroupNames extends string = string\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 GroupNames extends string\n>(\n appContext: AppContext,\n getPrs: (\n payload: Context['payload'],\n repoContext: RepoContext,\n ) => 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 { AccountInfo } from 'context/getOrCreateAccount';\nimport type { PullRequestWithDecentData } from 'events/pr-handlers/utils/PullRequestData';\nimport 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\nexport const createOwnerPart = (\n ownerMention: string,\n pullRequest: PullRequestWithDecentData,\n sendTo: AccountInfo,\n): string => {\n const owner = pullRequest.user;\n\n if (owner && owner.id === sendTo.id) return 'your PR';\n\n const isAssignedTo: boolean =\n !!pullRequest.assignees &&\n pullRequest.assignees.some((a: any) => a && a.id === sendTo.id);\n\n return `${ownerMention}'s PR${isAssignedTo ? \" you're assigned to\" : ''}`;\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 { ExcludesFalsy } from '../../../utils/Excludes';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n PullRequestWithDecentDataFromWebhook,\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 (\n pullRequest.requested_reviewers &&\n pullRequest.requested_reviewers.length > 0\n ) {\n return createFailedStatusCheck(\n `Awaiting review from: ${(pullRequest.requested_reviewers as PullRequestWithDecentDataFromWebhook['requested_reviewers'])\n .filter(ExcludesFalsy)\n .map((rr) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (pullRequest.requested_teams && pullRequest.requested_teams.length > 0) {\n return createFailedStatusCheck(\n `Awaiting review from: ${(pullRequest.requested_teams as PullRequestWithDecentDataFromWebhook['requested_teams'])\n .filter(ExcludesFalsy)\n .map((rt) => rt.name)\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 { ExcludesFalsy } from '../../../utils/Excludes';\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(\n prLabels.map((label) => label.name).filter(ExcludesFalsy),\n );\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 (\n !label ||\n !label.name ||\n prLabels.some((prLabel) => prLabel.id === label.id)\n ) {\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 && existing.name) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n toDeleteNames.add(existing.name);\n }\n });\n }\n\n // TODO move that elsewhere\n if (pullRequest.user) {\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\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 { Context } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\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}\n\nexport type Reviewer = AccountInfo;\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 ({ data: reviews }) => {\n reviews.forEach((review) => {\n if (!review.user) return;\n if (!userIds.has(review.user.id)) {\n userIds.add(review.user.id);\n reviewers.push({\n id: review.user.id,\n login: review.user.login,\n type: review.user.type,\n });\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 { AccountInfo } from 'context/getOrCreateAccount';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\nimport type { Reviewer } from './getReviewersAndReviewStates';\n\nexport interface RequestedReviewers extends AccountInfo {\n isRequestedByName: boolean;\n requestedByTeams: string[];\n}\n\nexport function getRolesFromPullRequestAndReviewers(\n pullRequest: PullRequestWithDecentDataFromWebhook,\n reviewers: Reviewer[],\n): {\n owner: PullRequestWithDecentDataFromWebhook['user'];\n assignees: PullRequestWithDecentDataFromWebhook['assignees'];\n reviewers: Reviewer[];\n requestedReviewers: RequestedReviewers[];\n followers: AccountInfo[];\n} {\n const owner = pullRequest.user;\n const assignees = pullRequest.assignees;\n const assigneeIds = assignees.map((a) => a.id);\n\n const followers = reviewers.filter((user) => !assigneeIds.includes(user.id));\n const requestedReviewers: RequestedReviewers[] = pullRequest.requested_reviewers.map(\n (rr) => ({\n ...rr,\n isRequestedByName: true,\n requestedByTeams: [],\n }),\n );\n\n if (pullRequest.requested_teams) {\n // TODO\n // requestedReviewers.push ...\n }\n\n if (requestedReviewers) {\n followers.push(\n ...requestedReviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) && !assigneeIds.includes(rr.id)\n );\n }),\n );\n }\n\n return {\n owner,\n assignees,\n reviewers,\n requestedReviewers,\n followers,\n };\n}\n","import type { Probot } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseOptions } from './actions/utils/body/parseBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\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 repo is not ignored */\n if (reviewflowPrContext) {\n /* update status, update automerge queue, delete branch */\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 /* update slack home */\n if (pullRequest.requested_reviewers) {\n pullRequest.requested_reviewers.forEach((requestedReviewer) => {\n repoContext.slack.updateHome(requestedReviewer.login);\n });\n }\n\n if (pullRequest.requested_teams) {\n await Promise.all(\n pullRequest.requested_teams.map(async (team) => {\n const members = await repoContext.getMembersForTeam(team.id);\n members.forEach((member) => {\n repoContext.slack.updateHome(member.login);\n });\n }),\n );\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n /* send notifications to assignees and followers */\n const { reviewers } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n\n const senderMention = repoContext.slack.mention(\n context.payload.sender.login,\n );\n const ownerMention = repoContext.slack.mention(owner.login);\n const prLink = slackUtils.createPrLink(pullRequest, repoContext);\n\n const createMessage = (to: AccountInfo): string => {\n const ownerPart = slackUtils.createOwnerPart(\n ownerMention,\n pullRequest,\n to,\n );\n\n return `${\n pullRequest.merged\n ? `:rocket: ${senderMention} merged`\n : `:wastebasket: ${senderMention} closed`\n } ${ownerPart} ${prLink}\\n> ${pullRequest.title}`;\n };\n\n assignees.map((assignee) => {\n if (context.payload.sender.id === assignee.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle',\n assignee.id,\n assignee.login,\n {\n text: createMessage(assignee),\n },\n );\n });\n\n followers.map((follower) => {\n if (context.payload.sender.id === follower.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle-follow',\n follower.id,\n follower.login,\n {\n text: createMessage(follower),\n },\n );\n });\n },\n ),\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 { 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/rest';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\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 { ExcludesFalsy, 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']['listReviewComments']['response']['data']\n> => {\n if (!comment.in_reply_to_id) return [comment];\n return context.octokit.paginate(\n context.octokit.pulls.listReviewComments,\n context.pullRequest() as any,\n ({ data }) => {\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']['listReviewComments']['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']['listReviewComments']['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 (!c.user || 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 prUser = pr.user;\n if (!prUser) return;\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 = prUser.login === comment.user.login;\n const [discussion, { reviewers }] = await Promise.all([\n getDiscussion(context, comment),\n getReviewersAndReviewStates(context, repoContext),\n ]);\n\n const followers: AccountInfo[] = reviewers.filter(\n (u) => u.id !== prUser.id && u.id !== comment.user.id,\n );\n\n if (pr.requested_reviewers) {\n followers.push(\n ...pr.requested_reviewers\n .filter((rr) => {\n return (\n rr &&\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== (comment.user && comment.user.id) &&\n rr.id !== prUser.id\n );\n })\n .filter(ExcludesFalsy)\n .map((rr) => ({\n id: rr.id,\n login: rr.login,\n type: rr.type,\n })),\n );\n }\n\n const usersInThread = getUsersInThread(discussion).filter(\n (u) =>\n u.id !== prUser.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 !== prUser.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(prUser.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 (prUser && prUser.id) === comment.user.id\n ? 'his'\n : `${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 prUser.id,\n prUser.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 context.payload.repository.html_url,\n repoContext.config.labels.list,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n return {\n ...repoContext.config.prDefaultOptions,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n const { commentBody, options } = updateCommentOptions(\n context.payload.repository.html_url,\n repoContext.config.labels.list,\n reviewflowPrContext.commentBody,\n calcDefaultOptions(repoContext, pullRequest),\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, commentBody);\n\n if (options && automergeLabel) {\n await Promise.all([\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 parse from '@commitlint/parse';\nimport type { CommitNote } from '@commitlint/types';\nimport type { RestEndpointMethodTypes } from '@octokit/rest';\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 | null): string =>\n !text ? '' : text.replace(/\\r\\n/g, '\\n');\nconst checkIfHasDiff = (text1: string | null, 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 .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 {\n ParsePRRule,\n StatusError,\n StatusInfo,\n} from '../../../accountConfigs/types';\nimport { getKeys } from '../../../context/utils';\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,\n shouldUpdateCommentBodyInfos: boolean,\n previousSha?: string,\n): Promise => {\n const title = repoContext.config.trimTitle\n ? cleanTitle(pullRequest.title)\n : pullRequest.title;\n\n const parsePRValue = {\n title,\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n };\n\n const isPrFromBot = pullRequest.user && pullRequest.user.type === 'Bot';\n\n const statuses: Status[] = [];\n const warnings: StatusError[] = [];\n\n let errorRule: ParsePRRule | undefined;\n getKeys(repoContext.config.parsePR).find((parsePRKey) => {\n const rules = repoContext.config.parsePR[parsePRKey];\n if (!rules) return false;\n\n const value = parsePRValue[parsePRKey];\n errorRule = rules.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(value);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n if (rule.warning) {\n warnings.push(rule.error);\n return false;\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 return errorRule;\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 console.log(warnings);\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:\n warnings.length === 0\n ? '✓ Your PR is valid'\n : `warnings: ${warnings\n .map((error) => error.title)\n .join(',')}`,\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\n ? errorRule.error.title\n : // eslint-disable-next-line unicorn/no-nested-ternary\n warnings.length === 0\n ? '✓ Your PR is valid'\n : `warning${warnings.length === 1 ? '' : 's'}: ${warnings\n .map((error) => error.title)\n .join(',')}`,\n errorRule ? errorRule.error.url : undefined,\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 context.payload.repository.html_url,\n repoContext.config.labels.list,\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 { updateReviewStatus } from './actions/updateReviewStatus';\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 codeNeedsReviewLabel = repoContext.labels['code/needs-review'];\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 if (hasLabelInPR(labels, codeNeedsReviewLabel)) {\n await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n 'dev',\n {\n remove: ['needsReview'],\n },\n );\n } else {\n await updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n labels,\n );\n }\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 autoMergeSkipCiLabel,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const option = (() => {\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 || pullRequest.assignees.length > 0) return;\n if (!pullRequest.user || 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 { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\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 if (reviewflowPrContext === null) return;\n const fromRenovate = pullRequest.head.ref.startsWith('renovate/');\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) {\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 ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\n\nexport default function reopened(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.reopened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n /* if repo is not ignored */\n if (reviewflowPrContext) {\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 /* update slack home */\n if (pullRequest.requested_reviewers) {\n pullRequest.requested_reviewers.forEach((requestedReviewer) => {\n repoContext.slack.updateHome(requestedReviewer.login);\n });\n }\n\n if (pullRequest.requested_teams) {\n await Promise.all(\n pullRequest.requested_teams.map(async (team) => {\n const members = await repoContext.getMembersForTeam(team.id);\n members.forEach((member) => {\n repoContext.slack.updateHome(member.login);\n });\n }),\n );\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n /* send notifications to assignees and followers */\n const { reviewers } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n\n const senderMention = repoContext.slack.mention(\n context.payload.sender.login,\n );\n const ownerMention = repoContext.slack.mention(owner.login);\n const prLink = slackUtils.createPrLink(pullRequest, repoContext);\n\n const createMessage = (to: AccountInfo): string => {\n const ownerPart = slackUtils.createOwnerPart(\n ownerMention,\n pullRequest,\n to,\n );\n\n return `:recycle: ${senderMention} reopened ${ownerPart} ${prLink}\\n> ${pullRequest.title}`;\n };\n\n assignees.map((assignee) => {\n if (context.payload.sender.id === assignee.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle',\n assignee.id,\n assignee.login,\n {\n text: createMessage(assignee),\n },\n );\n });\n\n followers.map((follower) => {\n if (context.payload.sender.id === follower.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle-follow',\n follower.id,\n follower.login,\n {\n text: createMessage(follower),\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 { 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.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\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n const hasApprovals = reviewStates[reviewerGroup].approved !== 0;\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n updatedPr,\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 if (assignee) {\n repoContext.slack.updateHome(assignee.login);\n }\n });\n }\n if (\n !updatedPr.assignees ||\n !updatedPr.assignees.find(\n (assignee) => 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: `:recycle: ${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: `:recycle: ${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 requestedReviewer = (context.payload as any).requested_reviewer;\n const requestedTeam = (context.payload as any).requested_team;\n const requestedReviewers = requestedReviewer\n ? [requestedReviewer]\n : await repoContext.getMembersForTeam(requestedTeam.id);\n\n const reviewerGroup = requestedReviewer\n ? repoContext.getReviewerGroup(requestedReviewer.login)\n : repoContext.getTeamGroup(requestedTeam.name);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest,\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 const assigneesLogins: string[] = [];\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n assigneesLogins.push(assignee.login);\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n requestedReviewers.forEach((potentialReviewer) => {\n if (assigneesLogins.includes(potentialReviewer)) return;\n repoContext.slack.updateHome(potentialReviewer.login);\n });\n }\n\n if (repoContext.slack) {\n if (requestedReviewers.some((rr) => rr.login === sender.login)) {\n requestedReviewers.forEach((potentialReviewer) => {\n if (potentialReviewer.login === sender.login) return;\n repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your team _${\n requestedTeam.name\n }_ review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n } else {\n requestedReviewers.forEach((potentialReviewer) => {\n repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for ${\n requestedTeam ? `your team _${requestedTeam.name}_` : 'your'\n } review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n }\n\n await Promise.all(\n requestedReviewers.map(async (potentialReviewer) => {\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}_${\n requestedTeam ? `${requestedTeam.id}_` : ''\n }${potentialReviewer.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 ),\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 requestedReviewer = (context.payload as any).requested_reviewer;\n const requestedTeam = (context.payload as any).requested_team;\n const requestedReviewers = requestedReviewer\n ? [requestedReviewer]\n : await repoContext.getMembersForTeam(requestedTeam.id);\n\n const reviewerGroup = requestedReviewer\n ? repoContext.getReviewerGroup(requestedReviewer.login)\n : repoContext.getTeamGroup(requestedTeam.name);\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 const assigneesLogins: string[] = [];\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n assigneesLogins.push(assignee.login);\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n requestedReviewers.forEach((potentialReviewer) => {\n if (assigneesLogins.includes(potentialReviewer)) return;\n repoContext.slack.updateHome(potentialReviewer.login);\n });\n }\n\n if (!shouldWait && repoContext.slack) {\n const text = `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests ${\n requestedReviewer ? 'your' : `your team _${requestedTeam.name}_`\n } review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )} !\\n> ${pullRequest.title}`;\n const message = { text };\n\n await Promise.all(\n requestedReviewers.map(async (potentialReviewer) => {\n if (sender.login === potentialReviewer.login) return;\n\n const result = await repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n message,\n );\n if (result) {\n await appContext.mongoStores.slackSentMessages.insertOne({\n type: 'review-requested',\n typeId: `${pullRequest.id}_${\n requestedTeam ? `${requestedTeam.id}_` : ''\n }${potentialReviewer.id}`,\n message,\n account: repoContext.accountEmbed,\n sentTo: [result],\n });\n }\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';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\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 { reviewers, reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n const isReviewByOwner = owner.login === reviewer.login;\n\n const filteredFollowers = followers.filter(\n (follower) => follower.id !== reviewer.id,\n );\n\n if (!isReviewByOwner) {\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,\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 (assignees) {\n assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !assignees.find((assignee) => assignee.login === reviewer.login)\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(owner.login);\n\n const createMessage = (\n toOwner?: boolean,\n isAssignedTo?: boolean,\n ): string => {\n const ownerPart = toOwner\n ? 'your PR'\n : `${ownerMention}'s PR${\n isAssignedTo ? \" you're assigned to\" : ''\n }`;\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 assignees.forEach((assignee) => {\n repoContext.slack.postMessage(\n 'pr-review',\n assignee.id,\n assignee.login,\n createSlackMessageWithSecondaryBlock(\n createMessage(assignee.id === owner.id, true),\n slackifiedBody,\n ),\n );\n });\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n filteredFollowers.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 filteredFollowers.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 {\n syncTeams,\n syncTeamsAndTeamMembers,\n} 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 appContext,\n async (context, accountContext) => {\n // TODO: only sync team members and team parents members\n // await syncTeamMembersWithTeamParents(\n // appContext.mongoStores,\n // context.octokit,\n // context.payload.organization,\n // {\n // id: context.payload.team.id,\n // name: context.payload.team.name,\n // slug: context.payload.team.slug,\n // },\n // );\n await syncTeamsAndTeamMembers(\n appContext.mongoStores,\n context.octokit,\n context.payload.organization,\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\nexport type 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 OrgTeam extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n name: string;\n slug: string;\n description: string | null;\n}\n\nexport interface OrgTeamEmbed {\n id: OrgTeam['_id'];\n name: OrgTeam['name'];\n slug: OrgTeam['slug'];\n}\n\nexport interface OrgMember extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n user: AccountEmbedWithoutType;\n slack?: { id: string };\n teams: OrgTeamEmbed[];\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 coll.createIndex(\n { 'org.id': 1, 'user.id': 1, 'teams.id': 1 },\n { unique: true },\n );\n coll.createIndex({ 'org.id': 1, 'teams.id': 1 });\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 { WebClient } from '@slack/web-api';\nimport type { MongoStores, Org, OrgMember } from '../mongo';\nimport type { Octokit } from '../octokit';\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 octokit: 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 octokit.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 octokit.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 octokit.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 octokit.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","autoMerge","autoMergeWithSkipCi","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","head","warning","base","botUsers","JulienBreux","ORNIKAR_EMAIL_DOMAIN","TheR3aLp3nGuinJM","AymenBac","abarreir","damienorny","darame07","Pixy","machartier","camillebaronnet","HugoGarrido","CorentinAndre","Mxime","vlbr","mdcarter","ChibiBlasphem","PSniezak","GaelFerrand","aenario","design","jperriere","CoralineColasse","Lenamari","loicleser","carlbouville","groupsGithubTeams","ops","githubTeamName","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","octokit","installationId","orgInStore","upsertOne","_id","orgEmbed","memberIds","paginate","iterator","listMembers","Promise","all","member","push","orgMembers","type","deleteMany","$not","$in","ExcludesFalsy","Boolean","ExcludesNullish","syncTeamMembers","team","listMembersInOrg","team_slug","slug","currentIterationMemberIds","filter","partialUpdateMany","memberId","$ne","$push","$pull","syncTeams","teamEmbeds","teamIds","orgTeams","syncTeamsAndTeamMembers","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","github","userInfo","userSettings","u","getUserInstallation","username","appRouter","app","getRouter","use","cookieParser","getOrCreateAccount","accountInfo","getKeys","keys","emojiRegex","createEmojiRegex","getEmojiFromRepoDescription","startsWith","emoji","exec","voidTeamSlack","mention","postMessage","resolve","updateMessage","deleteMessage","addReaction","updateHome","initTeamSlack","slackHome","context","account","slackToken","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackEmails","values","slackClient","WebClient","membersInDb","findAll","members","foundEmailMembers","forEach","email","m","slack","im","missingEmails","includes","memberEmailToMemberId","page","profile","has","conversations","open","channel","console","membersMap","getUserFromGithubLogin","githubLogin","endsWith","slice","category","githubId","message","log","debug","DRY_RUN","chat","text","blocks","attachments","secondaryBlocks","thread_ts","ts","ok","update","delete","reactions","add","timestamp","scheduleUpdateMember","initAccountContext","appContext","payload","slackPromise","githubLoginToGroup","githubTeamNameToGroup","teamName","githubLoginToTeams","getReviewerGroups","githubLogins","Set","getGithubTeamsGroups","githubTeamNames","lock","Lock","accountEmbed","accountType","callback","reject","logInfos","info","createReleaseCallback","release","getReviewerGroup","getTeamGroup","getTeamsForLogin","getMembersForTeam","teamId","cursor","limit","toArray","approveShouldWait","reviewerGroup","pullRequest","includesReviewerGroup","includesWaitForGroups","requested_reviewers","requested_teams","requestedReviewerGroups","request","some","group","accountContextsPromise","accountContexts","obtainAccountContext","existingAccountContext","existingPromise","promise","then","accountContext","handlerOrgChange","organization","createHandlerOrgChange","options","optionsRegexps","option","regexp","RegExp","optionsDescriptions","labelKey","icon","parseOptions","content","defaultOptions","parseCommitNotes","commitNotes","replace","trim","parseBody","hasLabelInPR","prLabels","label","l","hasFailedStatusOrChecks","pr","checks","listForRef","ref","sha","failedChecks","check_runs","check","conclusion","combinedStatus","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","repoContext","reviewflowPrContext","autoMergeLabel","removePrFromAutomergeQueue","number","isRenovatePr","createMergeLockPrFromPr","branch","addLog","action","repoFullName","full_name","automergeLogs","insertOne","isRenovate","mergeableState","mergeable_state","hasNeedsReview","hasRequestedReview","lockedPr","getMergeLockedPr","String","prId","prNumber","lockedPrNumber","pushAutomergeQueue","addMergeLockPr","mergeable","prResult","pulls","pull_number","merged","reschedule","renovateRebaseBody","issues","issue_number","merge","parsedBody","commentBody","mergeResult","merge_method","commit_title","commit_message","errorMessage","defaultCommentBody","toMarkdownOptions","repoLink","labelsConfig","iconValue","checkboxWithId","labelDescription","labelLink","encodeURIComponent","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","labelConfig","labelColor","existingLabel","createLabel","current_name","updateLabel","new_name","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","createLink","createPrLink","html_url","createOwnerPart","ownerMention","sendTo","isAssignedTo","assignees","a","createStatus","createCommitStatus","target_url","addStatusCheck","previousSha","hasPrCheck","head_sha","started_at","created_at","completed_at","toISOString","output","updateStatusCheckFromLabels","createFailedStatusCheck","rr","rt","needsReviewGroupNames","updateReviewStatus","reviewGroup","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toAddNames","toDelete","toDeleteNames","getLabelFromKey","reviewConfig","prLabel","size","addLabels","toDeleteName","removeLabel","newLabelNamesArray","oldLabels","setLabels","getReviewersAndReviewStates","userIds","reviewers","reviewStatesByUser","listReviews","reviews","toUpperCase","reviewStates","dismissed","reviewer","getRolesFromPullRequestAndReviewers","assigneeIds","followers","requestedReviewers","isRequestedByName","requestedByTeams","f","closed","pull_request","isNotFork","git","deleteRef","requestedReviewer","assignee","senderMention","sender","prLink","slackUtils","createMessage","to","ownerPart","follower","createMrkdwnSectionBlock","createSlackMessageWithSecondaryBlock","secondaryBlockText","getPullRequestFromPayload","checkIfUserIsBot","checkIfIsThisBot","parse","issueParser","actions","issuePrefixes","parseMentions","mentions","slackifyCommentBody","multipleLines","slackifyMarkdown","getDiscussion","in_reply_to_id","listReviewComments","c","getMentions","discussion","getUsersInThread","prCommentCreated","saveInDb","results","filtered","slackSentMessages","typeId","sentTo","prUser","pull_request_review_id","commentByOwner","usersInThread","prUrl","commentLink","toOwner","promisesOwner","promisesNotOwner","slackifiedBody","start_line","isBotUser","slackMessage","updatePrCommentBody","newBody","updateComment","updatePrCommentBodyIfNeeded","updatePrCommentBodyOptions","syncLabel","shouldHaveLabel","prHasLabel","onRemove","onAdd","response","calcDefaultOptions","automergeLabel","skipCiLabel","prHasSkipCiLabel","prHasAutoMergeLabel","syncLabelsAfterCommentBodyEdited","prCommentEditedOrDeleted","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","parsePRValue","isPrFromBot","warnings","errorRule","parsePRKey","rules","rule","date","hasLintPrCheck","promises","commentBodyInfos","shouldCreateCommentBody","edited","updatedPullRequest","updateBranch","isFromRenovate","labelsChanged","fromRenovate","codeApprovedLabel","codeNeedsReviewLabel","autoMergeSkipCiLabel","createReview","event","updateBranchLabel","autoApproveAndAutoMerge","autoAssignPRToCreator","addAssignees","opened","reopened","reviewDismissed","hasChangesRequestedInReviews","hasApprovals","hasRequestedReviewsForGroup","reviewRequestRemoved","requested_reviewer","requestedTeam","requested_team","hasApprovedInReviews","assigneesLogins","potentialReviewer","sentMessageRequestedReview","split","deleteOne","reviewRequested","getEmojiFromState","reviewSubmitted","reviewUrl","isReviewByOwner","filteredFollowers","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","scheduleUpdateOrg","scheduleUpdateAllOrgs","run","mongoInit"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index-node12.cjs.js b/dist/index-node12.cjs.js index 33e221de5..60fe6d258 100644 --- a/dist/index-node12.cjs.js +++ b/dist/index-node12.cjs.js @@ -246,7 +246,7 @@ const config = { parsePR: { title: [{ regExp: // eslint-disable-next-line unicorn/no-unsafe-regex - /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\(([/a-z-]*)\))?(!)?:\s/, + /^(?revert: )?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\([/a-z-]+\)?((?=:\s)|(?=!:\s)))?(?!)?(?:\s.*)$/, error: { title: 'Title does not match commitlint conventional', summary: 'https://www.npmjs.com/package/@commitlint/config-conventional' @@ -381,8 +381,8 @@ const config$2 = { }, parsePR: { title: [{ - regExp: // eslint-disable-next-line unicorn/no-unsafe-regex - /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\(([/A-Za-z-]*)\))?:\s/, + // eslint-disable-next-line unicorn/no-unsafe-regex + regExp: /^(?revert: )?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\([/A-Za-z-]+\)?((?=:\s)|(?=!:\s)))?(?!)?(?:\s.*)$/, error: { title: 'Title does not match commitlint conventional', summary: 'https://www.npmjs.com/package/@commitlint/config-conventional' @@ -391,7 +391,7 @@ const config$2 = { bot: false, regExp: /\s([A-Z][\dA-Z]+-(\d+)|\[no issue])$/, error: { - title: 'Title does not have JIRA issue', + title: 'Title does not have Jira issue', summary: 'The PR title should end with ONK-0000, or [no issue]' }, status: 'jira-issue', @@ -412,6 +412,23 @@ const config$2 = { summary: `[${issue}](https://ornikar.atlassian.net/browse/${issue})` }; } + }], + head: [{ + bot: false, + // eslint-disable-next-line unicorn/no-unsafe-regex + regExp: /^(?revert-\d+-)?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\/[a-z-]+)?\/(?!)?(?.*)-(?[A-Z][\dA-Z]+-(\d+))$/, + warning: true, + error: { + title: 'Branch name does not match commitlint conventional', + summary: '' + } + }], + base: [{ + regExp: /^(master|main)$/, + error: { + title: 'PR to branches other than main is not recommended', + summary: 'https://ornikar.atlassian.net/wiki/spaces/TECH/pages/2221900272/Should+I+make+a+feature-branch+or+not' + } }] }, botUsers: ['michael-robot'], @@ -3003,37 +3020,56 @@ const cleanTitle = title => title.trim().replace(/[\s-]+\[?\s*([A-Za-z][\dA-Za-z const editOpenedPR = async (pullRequest, context, repoContext, reviewflowPrContext, shouldUpdateCommentBodyInfos, previousSha) => { const title = repoContext.config.trimTitle ? cleanTitle(pullRequest.title) : pullRequest.title; + const parsePRValue = { + title, + head: pullRequest.head.ref, + base: pullRequest.base.ref + }; const isPrFromBot = pullRequest.user && pullRequest.user.type === 'Bot'; const statuses = []; - const errorRule = repoContext.config.parsePR.title.find(rule => { - if (rule.bot === false && isPrFromBot) return false; - const match = rule.regExp.exec(title); + const warnings = []; + let errorRule; + getKeys(repoContext.config.parsePR).find(parsePRKey => { + const rules = repoContext.config.parsePR[parsePRKey]; + if (!rules) return false; + const value = parsePRValue[parsePRKey]; + errorRule = rules.find(rule => { + if (rule.bot === false && isPrFromBot) return false; + const match = rule.regExp.exec(value); + + if (match === null) { + if (rule.status) { + statuses.push({ + name: rule.status, + error: rule.error + }); + } + + if (rule.warning) { + warnings.push(rule.error); + return false; + } - if (match === null) { - if (rule.status) { + return true; + } + + if (rule.status && rule.statusInfoFromMatch) { statuses.push({ name: rule.status, - error: rule.error + info: rule.statusInfoFromMatch(match) }); + return false; } - return true; - } - - if (rule.status && rule.statusInfoFromMatch) { - statuses.push({ - name: rule.status, - info: rule.statusInfoFromMatch(match) - }); return false; - } - - return false; + }); + return errorRule; }); const date = new Date().toISOString(); const hasLintPrCheck = (await context.octokit.checks.listForRef(context.repo({ ref: pullRequest.head.sha }))).data.check_runs.find(check => check.name === `${process.env.REVIEWFLOW_NAME}/lint-pr`); + console.log(warnings); const promises = [...statuses.map(({ name, error, @@ -3050,10 +3086,11 @@ const editOpenedPR = async (pullRequest, context, repoContext, reviewflowPrConte started_at: date, completed_at: date, output: errorRule ? errorRule.error : { - title: '✓ Your PR is valid', + title: warnings.length === 0 ? '✓ Your PR is valid' : `warnings: ${warnings.map(error => error.title).join(',')}`, summary: '' } - })), !hasLintPrCheck && previousSha && errorRule ? createStatus(context, 'lint-pr', previousSha, 'success', 'New commits have been pushed') : undefined, !hasLintPrCheck && createStatus(context, 'lint-pr', pullRequest.head.sha, errorRule ? 'failure' : 'success', errorRule ? errorRule.error.title : '✓ Your PR is valid')].filter(ExcludesFalsy); + })), !hasLintPrCheck && previousSha && errorRule ? createStatus(context, 'lint-pr', previousSha, 'success', 'New commits have been pushed') : undefined, !hasLintPrCheck && createStatus(context, 'lint-pr', pullRequest.head.sha, errorRule ? 'failure' : 'success', errorRule ? errorRule.error.title : // eslint-disable-next-line unicorn/no-nested-ternary + warnings.length === 0 ? '✓ Your PR is valid' : `warning${warnings.length === 1 ? '' : 's'}: ${warnings.map(error => error.title).join(',')}`, errorRule ? errorRule.error.url : undefined)].filter(ExcludesFalsy); const body = removeDeprecatedReviewflowInPrBody(pullRequest.body); promises.push(updatePrIfNeeded(pullRequest, context, { title, diff --git a/dist/index-node12.cjs.js.map b/dist/index-node12.cjs.js.map index eaa486464..1dd33d9dd 100644 --- a/dist/index-node12.cjs.js.map +++ b/dist/index-node12.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"index-node12.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/utils/Excludes.ts","../src/events/account-handlers/actions/syncTeamMembers.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/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/slack/utils.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/utils/getReviewersAndReviewStates.ts","../src/events/pr-handlers/utils/getRolesFromPullRequestAndReviewers.ts","../src/events/pr-handlers/closed.ts","../src/events/pr-handlers/utils/createSlackMessageWithSecondaryBlock.ts","../src/events/pr-handlers/utils/getPullRequestFromPayload.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 || 3000}` : ''\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 try {\n const authInfo = await readAuthCookie(req, strategy);\n\n if (authInfo?.id) {\n return authInfo;\n }\n } catch {}\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(\n '/login',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (req: Request, res: Response) => {\n if (await getAuthInfoFromCookie(req, res)) {\n res.redirect('/app');\n return;\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\n router.get(\n '/login-response',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\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(\n '/',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\n","import type { Config } from './types';\n\nconst config: Config<'dev', never> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prDefaultOptions: {\n autoMerge: false,\n autoMergeWithSkipCi: 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://www.npmjs.com/package/@commitlint/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: ':vertical_traffic_light: automerge',\n color: '#64DD17',\n },\n 'merge/skip-ci': {\n name: ':vertical_traffic_light: 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 autoMerge: false,\n autoMergeWithSkipCi: 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 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-Za-z-]*)\\))?:\\s/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://www.npmjs.com/package/@commitlint/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 AymenBac: `aymen${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 camillebaronnet: `camille.baronnet${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'olivier-martinez': `olivier.martinez${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 GaelFerrand: 'gael.ferrand@othrys.dev',\n aenario: `romain.foucault${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\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: `loic.leser${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n carlbouville: `carl.bouville${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n },\n\n groupsGithubTeams: {\n dev: ['ops', 'backend', 'frontend', 'frontend-architects'],\n design: ['design'],\n },\n\n teams: {\n ops: {\n githubTeamName: 'ops',\n logins: ['JulienBreux', 'TheR3aLp3nGuinJM', 'AymenBac'],\n labels: ['teams/ops'],\n },\n\n backends: {\n githubTeamName: 'backend',\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n 'machartier',\n 'camillebaronnet',\n 'olivier-martinez',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n githubTeamName: 'frontend',\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'vlbr',\n 'budet-b',\n 'mdcarter',\n 'ChibiBlasphem',\n 'PSniezak',\n 'aenario',\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: ':vertical_traffic_light: 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-lifecycle': true,\n 'pr-lifecycle-follow': true,\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 { MongoStores, Org } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\n\ninterface OrgInfo {\n login: string;\n id: number;\n}\n\nexport const syncOrg = async (\n mongoStores: MongoStores,\n octokit: T,\n installationId: number,\n org: OrgInfo,\n): Promise => {\n const orgInStore = await mongoStores.orgs.upsertOne({\n _id: org.id,\n login: org.login,\n installationId,\n });\n\n const orgEmbed = { id: org.id, login: org.login };\n\n const memberIds: number[] = [];\n\n for await (const { data } of octokit.paginate.iterator(\n octokit.orgs.listMembers,\n { org: org.login },\n )) {\n await Promise.all(\n data.map(async (member) => {\n if (!member) return;\n memberIds.push(member.id);\n return Promise.all([\n mongoStores.orgMembers.upsertOne<'teams'>(\n {\n _id: `${org.id}_${member.id}`,\n org: orgEmbed,\n user: {\n id: member.id,\n login: member.login,\n },\n },\n {\n teams: [], // teams is synced in syncTeamMembers\n },\n ),\n mongoStores.users.upsertOne({\n _id: member.id,\n login: member.login,\n type: member.type,\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","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 { MongoStores, OrgTeamEmbed } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\nimport { ExcludesFalsy } from '../../../utils/Excludes';\n\nexport const syncTeamMembers = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n team: OrgTeamEmbed,\n): Promise => {\n const memberIds: number[] = [];\n for await (const { data } of octokit.paginate.iterator(\n octokit.teams.listMembersInOrg,\n {\n org: org.login,\n team_slug: team.slug,\n },\n )) {\n const currentIterationMemberIds = data\n .filter(ExcludesFalsy)\n .map((member) => member.id);\n memberIds.push(...currentIterationMemberIds);\n\n await mongoStores.orgMembers.partialUpdateMany(\n {\n _id: {\n $in: currentIterationMemberIds.map(\n (memberId) => `${org.id}_${memberId}`,\n ),\n },\n 'org.id': org.id,\n 'teams.id': { $ne: team.id },\n },\n { $push: { teams: team } },\n );\n }\n\n await mongoStores.orgMembers.partialUpdateMany(\n {\n 'org.id': org.id,\n 'user.id': { $not: { $in: memberIds } },\n },\n { $pull: { teams: { id: team.id } } },\n );\n};\n\nexport const syncTeamMembersWithTeamParents = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n team: OrgTeamEmbed,\n): Promise => {};\n","import type { MongoStores, OrgTeamEmbed } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\nimport { syncTeamMembers } from './syncTeamMembers';\n\nexport const syncTeams = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const orgEmbed = { id: org.id, login: org.login };\n\n const teamEmbeds: OrgTeamEmbed[] = [];\n const teamIds: number[] = [];\n\n for await (const { data } of octokit.paginate.iterator(octokit.teams.list, {\n org: org.login,\n })) {\n await Promise.all(\n data.map(async (team) => {\n teamIds.push(team.id);\n teamEmbeds.push({\n id: team.id,\n name: team.name,\n slug: team.slug,\n });\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 await Promise.all([\n mongoStores.orgTeams.deleteMany({\n 'org.id': org.id,\n _id: { $not: { $in: teamIds } },\n }),\n\n mongoStores.orgMembers.partialUpdateMany(\n {\n 'org.id': org.id,\n },\n { $pull: { teams: { id: { $not: { $in: teamIds } } } } },\n ),\n ]);\n\n return teamEmbeds;\n};\n\nexport const syncTeamsAndTeamMembers = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const teams = await syncTeams(mongoStores, octokit, org);\n for (const team of teams) {\n await syncTeamMembers(mongoStores, octokit, org, team);\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 { syncTeamsAndTeamMembers } 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-lifecycle': 'Your PR is closed, merged, reopened',\n 'pr-lifecycle-follow':\n \"Someone closed, merged, reopened a PR you're reviewing\",\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(\n '/org/:org/force-sync',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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 syncTeamsAndTeamMembers(mongoStores, user.api, org);\n\n res.redirect(`/app/org/${req.params.org}`);\n },\n );\n\n router.get(\n '/org/:org',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\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(\n '/repositories',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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 {data.map((repo: any) => (\n
  • \n \n {repo.name}\n \n
  • \n ))}\n
\n\n {data.length === 100 && (\n
We currently have a limit to 100 repositories
\n )}\n
\n
,\n ),\n );\n },\n );\n\n router.get(\n '/repository/:owner/:repository',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\n 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}\n","import type { MongoStores, User } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\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(\n '/user/force-sync',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\n router.get(\n '/user',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\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 >[1]['getRouter'],\n { mongoStores }: AppContext,\n): Promise {\n const router = (getRouter as NonNullable)('/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","import { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeamsAndTeamMembers } from '../events/account-handlers/actions/syncTeams';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { Org, User } from '../mongo';\nimport type { Octokit } from '../octokit';\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 syncTeamsAndTeamMembers(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 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 // TODO pass AccountInfo instead\n if (githubLogin.endsWith('[bot]')) {\n return `:robot_face: ${githubLogin.slice(0, -'[bot]'.length)}`;\n }\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 account.login,\n account._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 {\n PullRequestWithDecentData,\n PullRequestWithDecentDataFromWebhook,\n} from 'events/pr-handlers/utils/PullRequestData';\nimport type { Config } from '../accountConfigs';\nimport type {\n Org,\n User,\n AccountEmbed,\n AccountType,\n AccountEmbedWithoutType,\n OrgMember,\n} 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 getTeamGroup: (teamName: string) => GroupNames | undefined;\n getGithubTeamsGroups: (teamNames: string[]) => GroupNames[];\n getMembersForTeam: (teamId: string) => Promise;\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\n approveShouldWait: (\n reviewerGroup: GroupNames | undefined,\n pullRequest: PullRequestWithDecentData,\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 for (const groupName of getKeys(config.groups)) {\n Object.keys(config.groups[groupName]).forEach((login) => {\n githubLoginToGroup.set(login, groupName);\n });\n }\n\n const githubTeamNameToGroup = new Map();\n if (config.groupsGithubTeams) {\n for (const groupName of getKeys(config.groupsGithubTeams)) {\n config.groupsGithubTeams[groupName].forEach((teamName) => {\n githubTeamNameToGroup.set(teamName, groupName);\n });\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 const getGithubTeamsGroups = (githubTeamNames: string[]): string[] => [\n ...new Set(\n githubTeamNames\n .map((teamName) => githubTeamNameToGroup.get(teamName))\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 getTeamGroup: (githubTeamName): string | undefined =>\n githubTeamNameToGroup.get(githubTeamName),\n getGithubTeamsGroups,\n\n getTeamsForLogin: (githubLogin): string[] =>\n githubLoginToTeams.get(githubLogin) || [],\n\n getMembersForTeam: async (teamId): Promise => {\n if (accountInfo.type !== 'Organization') {\n throw new Error(\n `Invalid account type \"${accountInfo.type}\" for getMembersForTeam`,\n );\n }\n const cursor = await appContext.mongoStores.orgMembers.cursor<\n Pick\n >({\n 'org.id': account._id,\n 'teams.id': teamId,\n });\n await cursor.limit(100);\n const orgMembers = await cursor.toArray();\n return orgMembers.map((member) => member.user);\n },\n\n approveShouldWait: (\n reviewerGroup,\n pullRequest,\n { includesReviewerGroup, includesWaitForGroups },\n ): boolean => {\n if (\n !reviewerGroup ||\n !pullRequest.requested_reviewers ||\n !pullRequest.requested_teams\n ) {\n return false;\n }\n\n const requestedReviewerGroups = [\n ...new Set([\n ...getReviewerGroups(\n (pullRequest.requested_reviewers as PullRequestWithDecentDataFromWebhook['requested_reviewers']).map(\n (request) => request.login,\n ),\n ),\n ...(!pullRequest.requested_teams\n ? []\n : getGithubTeamsGroups(\n (pullRequest.requested_teams as PullRequestWithDecentDataFromWebhook['requested_teams']).map(\n (team) => team.name,\n ),\n )),\n ]),\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 | 'autoMerge'\n | 'autoMergeWithSkipCi'\n | 'deleteAfterMerge';\n\nexport type Options = Record;\n\nexport const options: OptionsKeys[] = [\n 'autoMerge',\n 'autoMergeWithSkipCi',\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\ninterface OptionDisplay {\n key: OptionsKeys;\n labelKey?: string;\n icon?: string;\n description: string;\n}\n\nexport const optionsDescriptions: OptionDisplay[] = [\n {\n key: 'autoMerge',\n labelKey: 'merge/automerge',\n description:\n 'Automatically merge when this PR is ready and has no failed statuses. When the repository requires _branches to be up to date before merging_, it merges default branch, with a queue per repo to prevent multiple merges when several PRs are ready. A fail job prevents the merge.',\n },\n {\n key: 'autoMergeWithSkipCi',\n labelKey: 'merge/skip-ci',\n description:\n 'Add `[skip ci]` on merge commit when merge is done with autoMerge.',\n },\n {\n key: 'deleteAfterMerge',\n icon: ':recycle:',\n description: 'Automatically delete the branch 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 return false;\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 (\n pullRequest.requested_reviewers &&\n pullRequest.requested_reviewers.length > 0\n ) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested reviewers',\n );\n return false;\n }\n\n if (pullRequest.requested_teams && pullRequest.requested_teams.length > 0) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested teams',\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 lockedPrNumber: lockedPr.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 (\n pullRequest.body &&\n pullRequest.body.includes('')\n ) {\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 const isFeatureBranch = false; // options.featureBranch;\n\n const mergeResult = await context.octokit.pulls.merge({\n merge_method: isFeatureBranch ? 'merge' : 'squash',\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n pull_number: pullRequest.number,\n commit_title: isFeatureBranch\n ? undefined\n : `${pullRequest.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pullRequest.number})`,\n commit_message: isFeatureBranch ? 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 { LabelList, StatusInfo } from 'accountConfigs/types';\nimport type { Options } from './parseBody';\nimport { parseOptions } from './parseBody';\nimport { optionsDescriptions } from './prOptions';\n\nexport const defaultCommentBody = 'This will be auto filled by reviewflow.';\n\nconst toMarkdownOptions = (\n repoLink: string,\n labelsConfig: LabelList,\n options: Options,\n): string => {\n return optionsDescriptions\n .map(({ key, labelKey, description, icon: iconValue }) => {\n const checkboxWithId = `[${\n options[key] ? 'x' : ' '\n }] `;\n\n const labelDescription = labelKey && labelsConfig[labelKey];\n const labelLink = labelDescription\n ? `[${labelDescription.name}](${repoLink}/labels/${encodeURIComponent(\n labelDescription.name,\n )}): `\n : '';\n const icon = labelLink || !iconValue ? '' : `${iconValue} `;\n\n return `- ${checkboxWithId}${icon}${labelLink}${description}`;\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 repoLink: string,\n labelsConfig: LabelList,\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 repoLink,\n labelsConfig,\n options,\n )}`;\n};\n\nexport const createCommentBody = (\n repoLink: string,\n labelsConfig: LabelList,\n defaultOptions: Options,\n infos?: StatusInfo[],\n): string => {\n return internalUpdateBodyOptionsAndInfos(\n repoLink,\n labelsConfig,\n '',\n defaultOptions,\n infos,\n );\n};\n\nexport const updateCommentOptions = (\n repoLink: string,\n labelsConfig: LabelList,\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(\n repoLink,\n labelsConfig,\n commentBody,\n updatedOptions,\n ),\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 !commitNotes ? '$1' : `#### Commits Notes:\\n\\n${commitNotes}\\n\\n$1`,\n );\n};\n\nexport const removeDeprecatedReviewflowInPrBody = (\n prBody: string | null,\n): string => {\n if (!prBody) return '';\n return prBody.replace(\n /^(.*)(.*)(.*)$/is,\n '$1$3',\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/rest';\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 as string };\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 as string };\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 as string };\n};\n","import type { RestEndpointMethodTypes } from '@octokit/rest';\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/rest';\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 | null;\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 if (labelKey === 'merge/skip-ci') {\n existingLabel = labels.find(\n (label) => label.name === 'automerge/skip-ci',\n );\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 name: existingLabel.name,\n new_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';\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<\n GroupNames extends string = any\n> = AccountContext & 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 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) => label.id && needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && requestedReviewLabelIds.includes(label.id),\n );\n const hasChangesRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && changesRequestedLabelIds.includes(label.id),\n );\n const hasApprovesReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && approvedReviewLabelIds.includes(label.id),\n );\n\n const getNeedsReviewGroupNames = (labels: PullRequestLabels): GroupNames[] =>\n labels\n .filter((label) => label.id && needsReviewLabelIds.includes(label.id))\n .map((label) =>\n labelIdToGroupName.get(label.id as NonNullable),\n )\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 { 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): ((context: Context) => Promise) => {\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 { 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\ntype OnCallback = (context: Context) => Promise;\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 GroupNames extends string = string\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 GroupNames extends string\n>(\n appContext: AppContext,\n getPrs: (\n payload: Context['payload'],\n repoContext: RepoContext,\n ) => 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 { AccountInfo } from 'context/getOrCreateAccount';\nimport type { PullRequestWithDecentData } from 'events/pr-handlers/utils/PullRequestData';\nimport 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\nexport const createOwnerPart = (\n ownerMention: string,\n pullRequest: PullRequestWithDecentData,\n sendTo: AccountInfo,\n): string => {\n const owner = pullRequest.user;\n\n if (owner && owner.id === sendTo.id) return 'your PR';\n\n const isAssignedTo: boolean =\n !!pullRequest.assignees &&\n pullRequest.assignees.some((a: any) => a && a.id === sendTo.id);\n\n return `${ownerMention}'s PR${isAssignedTo ? \" you're assigned to\" : ''}`;\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 { ExcludesFalsy } from '../../../utils/Excludes';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n PullRequestWithDecentDataFromWebhook,\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 (\n pullRequest.requested_reviewers &&\n pullRequest.requested_reviewers.length > 0\n ) {\n return createFailedStatusCheck(\n `Awaiting review from: ${(pullRequest.requested_reviewers as PullRequestWithDecentDataFromWebhook['requested_reviewers'])\n .filter(ExcludesFalsy)\n .map((rr) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (pullRequest.requested_teams && pullRequest.requested_teams.length > 0) {\n return createFailedStatusCheck(\n `Awaiting review from: ${(pullRequest.requested_teams as PullRequestWithDecentDataFromWebhook['requested_teams'])\n .filter(ExcludesFalsy)\n .map((rt) => rt.name)\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 { ExcludesFalsy } from '../../../utils/Excludes';\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(\n prLabels.map((label) => label.name).filter(ExcludesFalsy),\n );\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 (\n !label ||\n !label.name ||\n prLabels.some((prLabel) => prLabel.id === label.id)\n ) {\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 && existing.name) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n toDeleteNames.add(existing.name);\n }\n });\n }\n\n // TODO move that elsewhere\n if (pullRequest.user) {\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\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 { Context } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\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}\n\nexport type Reviewer = AccountInfo;\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 ({ data: reviews }) => {\n reviews.forEach((review) => {\n if (!review.user) return;\n if (!userIds.has(review.user.id)) {\n userIds.add(review.user.id);\n reviewers.push({\n id: review.user.id,\n login: review.user.login,\n type: review.user.type,\n });\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 { AccountInfo } from 'context/getOrCreateAccount';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\nimport type { Reviewer } from './getReviewersAndReviewStates';\n\nexport interface RequestedReviewers extends AccountInfo {\n isRequestedByName: boolean;\n requestedByTeams: string[];\n}\n\nexport function getRolesFromPullRequestAndReviewers(\n pullRequest: PullRequestWithDecentDataFromWebhook,\n reviewers: Reviewer[],\n): {\n owner: PullRequestWithDecentDataFromWebhook['user'];\n assignees: PullRequestWithDecentDataFromWebhook['assignees'];\n reviewers: Reviewer[];\n requestedReviewers: RequestedReviewers[];\n followers: AccountInfo[];\n} {\n const owner = pullRequest.user;\n const assignees = pullRequest.assignees;\n const assigneeIds = assignees.map((a) => a.id);\n\n const followers = reviewers.filter((user) => !assigneeIds.includes(user.id));\n const requestedReviewers: RequestedReviewers[] = pullRequest.requested_reviewers.map(\n (rr) => ({\n ...rr,\n isRequestedByName: true,\n requestedByTeams: [],\n }),\n );\n\n if (pullRequest.requested_teams) {\n // TODO\n // requestedReviewers.push ...\n }\n\n if (requestedReviewers) {\n followers.push(\n ...requestedReviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) && !assigneeIds.includes(rr.id)\n );\n }),\n );\n }\n\n return {\n owner,\n assignees,\n reviewers,\n requestedReviewers,\n followers,\n };\n}\n","import type { Probot } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseOptions } from './actions/utils/body/parseBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\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 repo is not ignored */\n if (reviewflowPrContext) {\n /* update status, update automerge queue, delete branch */\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 /* update slack home */\n if (pullRequest.requested_reviewers) {\n pullRequest.requested_reviewers.forEach((requestedReviewer) => {\n repoContext.slack.updateHome(requestedReviewer.login);\n });\n }\n\n if (pullRequest.requested_teams) {\n await Promise.all(\n pullRequest.requested_teams.map(async (team) => {\n const members = await repoContext.getMembersForTeam(team.id);\n members.forEach((member) => {\n repoContext.slack.updateHome(member.login);\n });\n }),\n );\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n /* send notifications to assignees and followers */\n const { reviewers } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n\n const senderMention = repoContext.slack.mention(\n context.payload.sender.login,\n );\n const ownerMention = repoContext.slack.mention(owner.login);\n const prLink = slackUtils.createPrLink(pullRequest, repoContext);\n\n const createMessage = (to: AccountInfo): string => {\n const ownerPart = slackUtils.createOwnerPart(\n ownerMention,\n pullRequest,\n to,\n );\n\n return `${\n pullRequest.merged\n ? `:rocket: ${senderMention} merged`\n : `:wastebasket: ${senderMention} closed`\n } ${ownerPart} ${prLink}\\n> ${pullRequest.title}`;\n };\n\n assignees.map((assignee) => {\n if (context.payload.sender.id === assignee.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle',\n assignee.id,\n assignee.login,\n {\n text: createMessage(assignee),\n },\n );\n });\n\n followers.map((follower) => {\n if (context.payload.sender.id === follower.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle-follow',\n follower.id,\n follower.login,\n {\n text: createMessage(follower),\n },\n );\n });\n },\n ),\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 { 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/rest';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\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 { ExcludesFalsy, 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']['listReviewComments']['response']['data']\n> => {\n if (!comment.in_reply_to_id) return [comment];\n return context.octokit.paginate(\n context.octokit.pulls.listReviewComments,\n context.pullRequest() as any,\n ({ data }) => {\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']['listReviewComments']['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']['listReviewComments']['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 (!c.user || 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 prUser = pr.user;\n if (!prUser) return;\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 = prUser.login === comment.user.login;\n const [discussion, { reviewers }] = await Promise.all([\n getDiscussion(context, comment),\n getReviewersAndReviewStates(context, repoContext),\n ]);\n\n const followers: AccountInfo[] = reviewers.filter(\n (u) => u.id !== prUser.id && u.id !== comment.user.id,\n );\n\n if (pr.requested_reviewers) {\n followers.push(\n ...pr.requested_reviewers\n .filter((rr) => {\n return (\n rr &&\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== (comment.user && comment.user.id) &&\n rr.id !== prUser.id\n );\n })\n .filter(ExcludesFalsy)\n .map((rr) => ({\n id: rr.id,\n login: rr.login,\n type: rr.type,\n })),\n );\n }\n\n const usersInThread = getUsersInThread(discussion).filter(\n (u) =>\n u.id !== prUser.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 !== prUser.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(prUser.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 (prUser && prUser.id) === comment.user.id\n ? 'his'\n : `${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 prUser.id,\n prUser.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 context.payload.repository.html_url,\n repoContext.config.labels.list,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n return {\n ...repoContext.config.prDefaultOptions,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n const { commentBody, options } = updateCommentOptions(\n context.payload.repository.html_url,\n repoContext.config.labels.list,\n reviewflowPrContext.commentBody,\n calcDefaultOptions(repoContext, pullRequest),\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, commentBody);\n\n if (options && automergeLabel) {\n await Promise.all([\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 parse from '@commitlint/parse';\nimport type { CommitNote } from '@commitlint/types';\nimport type { RestEndpointMethodTypes } from '@octokit/rest';\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 | null): string =>\n !text ? '' : text.replace(/\\r\\n/g, '\\n');\nconst checkIfHasDiff = (text1: string | null, 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 .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,\n shouldUpdateCommentBodyInfos: boolean,\n previousSha?: string,\n): Promise => {\n const title = repoContext.config.trimTitle\n ? cleanTitle(pullRequest.title)\n : pullRequest.title;\n\n const isPrFromBot = pullRequest.user && 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 context.payload.repository.html_url,\n repoContext.config.labels.list,\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 { updateReviewStatus } from './actions/updateReviewStatus';\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 codeNeedsReviewLabel = repoContext.labels['code/needs-review'];\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 if (hasLabelInPR(labels, codeNeedsReviewLabel)) {\n await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n 'dev',\n {\n remove: ['needsReview'],\n },\n );\n } else {\n await updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n labels,\n );\n }\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 autoMergeSkipCiLabel,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const option = (() => {\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 || pullRequest.assignees.length > 0) return;\n if (!pullRequest.user || 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 { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\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 if (reviewflowPrContext === null) return;\n const fromRenovate = pullRequest.head.ref.startsWith('renovate/');\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) {\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 ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\n\nexport default function reopened(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.reopened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n /* if repo is not ignored */\n if (reviewflowPrContext) {\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 /* update slack home */\n if (pullRequest.requested_reviewers) {\n pullRequest.requested_reviewers.forEach((requestedReviewer) => {\n repoContext.slack.updateHome(requestedReviewer.login);\n });\n }\n\n if (pullRequest.requested_teams) {\n await Promise.all(\n pullRequest.requested_teams.map(async (team) => {\n const members = await repoContext.getMembersForTeam(team.id);\n members.forEach((member) => {\n repoContext.slack.updateHome(member.login);\n });\n }),\n );\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n /* send notifications to assignees and followers */\n const { reviewers } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n\n const senderMention = repoContext.slack.mention(\n context.payload.sender.login,\n );\n const ownerMention = repoContext.slack.mention(owner.login);\n const prLink = slackUtils.createPrLink(pullRequest, repoContext);\n\n const createMessage = (to: AccountInfo): string => {\n const ownerPart = slackUtils.createOwnerPart(\n ownerMention,\n pullRequest,\n to,\n );\n\n return `:recycle: ${senderMention} reopened ${ownerPart} ${prLink}\\n> ${pullRequest.title}`;\n };\n\n assignees.map((assignee) => {\n if (context.payload.sender.id === assignee.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle',\n assignee.id,\n assignee.login,\n {\n text: createMessage(assignee),\n },\n );\n });\n\n followers.map((follower) => {\n if (context.payload.sender.id === follower.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle-follow',\n follower.id,\n follower.login,\n {\n text: createMessage(follower),\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 { 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.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\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n const hasApprovals = reviewStates[reviewerGroup].approved !== 0;\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n updatedPr,\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 if (assignee) {\n repoContext.slack.updateHome(assignee.login);\n }\n });\n }\n if (\n !updatedPr.assignees ||\n !updatedPr.assignees.find(\n (assignee) => 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: `:recycle: ${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: `:recycle: ${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 requestedReviewer = (context.payload as any).requested_reviewer;\n const requestedTeam = (context.payload as any).requested_team;\n const requestedReviewers = requestedReviewer\n ? [requestedReviewer]\n : await repoContext.getMembersForTeam(requestedTeam.id);\n\n const reviewerGroup = requestedReviewer\n ? repoContext.getReviewerGroup(requestedReviewer.login)\n : repoContext.getTeamGroup(requestedTeam.name);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest,\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 const assigneesLogins: string[] = [];\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n assigneesLogins.push(assignee.login);\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n requestedReviewers.forEach((potentialReviewer) => {\n if (assigneesLogins.includes(potentialReviewer)) return;\n repoContext.slack.updateHome(potentialReviewer.login);\n });\n }\n\n if (repoContext.slack) {\n if (requestedReviewers.some((rr) => rr.login === sender.login)) {\n requestedReviewers.forEach((potentialReviewer) => {\n if (potentialReviewer.login === sender.login) return;\n repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your team _${\n requestedTeam.name\n }_ review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n } else {\n requestedReviewers.forEach((potentialReviewer) => {\n repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for ${\n requestedTeam ? `your team _${requestedTeam.name}_` : 'your'\n } review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n }\n\n await Promise.all(\n requestedReviewers.map(async (potentialReviewer) => {\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}_${\n requestedTeam ? `${requestedTeam.id}_` : ''\n }${potentialReviewer.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 ),\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 requestedReviewer = (context.payload as any).requested_reviewer;\n const requestedTeam = (context.payload as any).requested_team;\n const requestedReviewers = requestedReviewer\n ? [requestedReviewer]\n : await repoContext.getMembersForTeam(requestedTeam.id);\n\n const reviewerGroup = requestedReviewer\n ? repoContext.getReviewerGroup(requestedReviewer.login)\n : repoContext.getTeamGroup(requestedTeam.name);\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 const assigneesLogins: string[] = [];\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n assigneesLogins.push(assignee.login);\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n requestedReviewers.forEach((potentialReviewer) => {\n if (assigneesLogins.includes(potentialReviewer)) return;\n repoContext.slack.updateHome(potentialReviewer.login);\n });\n }\n\n if (!shouldWait && repoContext.slack) {\n const text = `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests ${\n requestedReviewer ? 'your' : `your team _${requestedTeam.name}_`\n } review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )} !\\n> ${pullRequest.title}`;\n const message = { text };\n\n await Promise.all(\n requestedReviewers.map(async (potentialReviewer) => {\n if (sender.login === potentialReviewer.login) return;\n\n const result = await repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n message,\n );\n if (result) {\n await appContext.mongoStores.slackSentMessages.insertOne({\n type: 'review-requested',\n typeId: `${pullRequest.id}_${\n requestedTeam ? `${requestedTeam.id}_` : ''\n }${potentialReviewer.id}`,\n message,\n account: repoContext.accountEmbed,\n sentTo: [result],\n });\n }\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';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\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 { reviewers, reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n const isReviewByOwner = owner.login === reviewer.login;\n\n const filteredFollowers = followers.filter(\n (follower) => follower.id !== reviewer.id,\n );\n\n if (!isReviewByOwner) {\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,\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 (assignees) {\n assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !assignees.find((assignee) => assignee.login === reviewer.login)\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(owner.login);\n\n const createMessage = (\n toOwner?: boolean,\n isAssignedTo?: boolean,\n ): string => {\n const ownerPart = toOwner\n ? 'your PR'\n : `${ownerMention}'s PR${\n isAssignedTo ? \" you're assigned to\" : ''\n }`;\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 assignees.forEach((assignee) => {\n repoContext.slack.postMessage(\n 'pr-review',\n assignee.id,\n assignee.login,\n createSlackMessageWithSecondaryBlock(\n createMessage(assignee.id === owner.id, true),\n slackifiedBody,\n ),\n );\n });\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n filteredFollowers.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 filteredFollowers.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 {\n syncTeams,\n syncTeamsAndTeamMembers,\n} 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 appContext,\n async (context, accountContext) => {\n // TODO: only sync team members and team parents members\n // await syncTeamMembersWithTeamParents(\n // appContext.mongoStores,\n // context.octokit,\n // context.payload.organization,\n // {\n // id: context.payload.team.id,\n // name: context.payload.team.name,\n // slug: context.payload.team.slug,\n // },\n // );\n await syncTeamsAndTeamMembers(\n appContext.mongoStores,\n context.octokit,\n context.payload.organization,\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\nexport type 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 OrgTeam extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n name: string;\n slug: string;\n description: string | null;\n}\n\nexport interface OrgTeamEmbed {\n id: OrgTeam['_id'];\n name: OrgTeam['name'];\n slug: OrgTeam['slug'];\n}\n\nexport interface OrgMember extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n user: AccountEmbedWithoutType;\n slack?: { id: string };\n teams: OrgTeamEmbed[];\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 coll.createIndex(\n { 'org.id': 1, 'user.id': 1, 'teams.id': 1 },\n { unique: true },\n );\n coll.createIndex({ 'org.id': 1, 'teams.id': 1 });\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 { WebClient } from '@slack/web-api';\nimport type { MongoStores, Org, OrgMember } from '../mongo';\nimport type { Octokit } from '../octokit';\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 octokit: 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 octokit.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 octokit.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 octokit.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 octokit.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","autoMerge","autoMergeWithSkipCi","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","AymenBac","abarreir","damienorny","darame07","Pixy","machartier","camillebaronnet","HugoGarrido","CorentinAndre","Mxime","vlbr","mdcarter","ChibiBlasphem","PSniezak","GaelFerrand","aenario","design","jperriere","CoralineColasse","Lenamari","loicleser","carlbouville","groupsGithubTeams","ops","githubTeamName","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","octokit","installationId","orgInStore","upsertOne","_id","orgEmbed","memberIds","paginate","iterator","listMembers","Promise","all","member","push","orgMembers","type","deleteMany","$not","$in","ExcludesFalsy","Boolean","ExcludesNullish","syncTeamMembers","team","listMembersInOrg","team_slug","slug","currentIterationMemberIds","filter","partialUpdateMany","memberId","$ne","$push","$pull","syncTeams","teamEmbeds","teamIds","orgTeams","syncTeamsAndTeamMembers","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","github","userInfo","userSettings","u","getUserInstallation","username","appRouter","app","getRouter","use","cookieParser","getOrCreateAccount","accountInfo","getKeys","keys","emojiRegex","createEmojiRegex","getEmojiFromRepoDescription","startsWith","emoji","exec","voidTeamSlack","mention","postMessage","resolve","updateMessage","deleteMessage","addReaction","updateHome","initTeamSlack","slackHome","context","account","slackToken","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackEmails","values","slackClient","WebClient","membersInDb","findAll","members","foundEmailMembers","forEach","email","m","slack","im","missingEmails","includes","memberEmailToMemberId","page","profile","has","conversations","open","channel","console","membersMap","getUserFromGithubLogin","githubLogin","endsWith","slice","category","githubId","message","log","debug","DRY_RUN","chat","text","blocks","attachments","secondaryBlocks","thread_ts","ts","ok","update","delete","reactions","add","timestamp","scheduleUpdateMember","initAccountContext","appContext","payload","slackPromise","githubLoginToGroup","githubTeamNameToGroup","teamName","githubLoginToTeams","getReviewerGroups","githubLogins","Set","getGithubTeamsGroups","githubTeamNames","lock","Lock","accountEmbed","accountType","callback","reject","logInfos","info","createReleaseCallback","release","getReviewerGroup","getTeamGroup","getTeamsForLogin","getMembersForTeam","teamId","cursor","limit","toArray","approveShouldWait","reviewerGroup","pullRequest","includesReviewerGroup","includesWaitForGroups","requested_reviewers","requested_teams","requestedReviewerGroups","request","some","group","accountContextsPromise","accountContexts","obtainAccountContext","existingAccountContext","existingPromise","promise","then","accountContext","handlerOrgChange","organization","createHandlerOrgChange","options","optionsRegexps","option","regexp","RegExp","optionsDescriptions","labelKey","icon","parseOptions","content","defaultOptions","parseCommitNotes","commitNotes","replace","trim","parseBody","hasLabelInPR","prLabels","label","l","hasFailedStatusOrChecks","pr","checks","listForRef","ref","head","sha","failedChecks","check_runs","check","conclusion","combinedStatus","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","repoContext","reviewflowPrContext","autoMergeLabel","removePrFromAutomergeQueue","number","isRenovatePr","createMergeLockPrFromPr","branch","addLog","action","repoFullName","full_name","automergeLogs","insertOne","isRenovate","mergeableState","mergeable_state","hasNeedsReview","hasRequestedReview","lockedPr","getMergeLockedPr","String","prId","prNumber","lockedPrNumber","pushAutomergeQueue","addMergeLockPr","mergeable","prResult","pulls","pull_number","merged","reschedule","renovateRebaseBody","issues","issue_number","base","merge","parsedBody","commentBody","mergeResult","merge_method","commit_title","commit_message","errorMessage","defaultCommentBody","toMarkdownOptions","repoLink","labelsConfig","iconValue","checkboxWithId","labelDescription","labelLink","encodeURIComponent","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","labelConfig","labelColor","existingLabel","createLabel","current_name","updateLabel","new_name","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","createLink","createPrLink","html_url","createOwnerPart","ownerMention","sendTo","isAssignedTo","assignees","a","createStatus","createCommitStatus","target_url","addStatusCheck","previousSha","hasPrCheck","head_sha","started_at","created_at","completed_at","toISOString","output","updateStatusCheckFromLabels","createFailedStatusCheck","rr","rt","needsReviewGroupNames","updateReviewStatus","reviewGroup","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toAddNames","toDelete","toDeleteNames","getLabelFromKey","reviewConfig","prLabel","size","addLabels","toDeleteName","removeLabel","newLabelNamesArray","oldLabels","setLabels","getReviewersAndReviewStates","userIds","reviewers","reviewStatesByUser","listReviews","reviews","toUpperCase","reviewStates","dismissed","reviewer","getRolesFromPullRequestAndReviewers","assigneeIds","followers","requestedReviewers","isRequestedByName","requestedByTeams","f","closed","pull_request","isNotFork","git","deleteRef","requestedReviewer","assignee","senderMention","sender","prLink","slackUtils","createMessage","to","ownerPart","follower","createMrkdwnSectionBlock","createSlackMessageWithSecondaryBlock","secondaryBlockText","getPullRequestFromPayload","checkIfUserIsBot","checkIfIsThisBot","parse","issueParser","actions","issuePrefixes","parseMentions","mentions","slackifyCommentBody","multipleLines","slackifyMarkdown","getDiscussion","in_reply_to_id","listReviewComments","c","getMentions","discussion","getUsersInThread","prCommentCreated","saveInDb","results","filtered","slackSentMessages","typeId","sentTo","prUser","pull_request_review_id","commentByOwner","usersInThread","prUrl","commentLink","toOwner","promisesOwner","promisesNotOwner","slackifiedBody","start_line","isBotUser","slackMessage","updatePrCommentBody","newBody","updateComment","updatePrCommentBodyIfNeeded","updatePrCommentBodyOptions","syncLabel","shouldHaveLabel","prHasLabel","onRemove","onAdd","response","calcDefaultOptions","automergeLabel","skipCiLabel","prHasSkipCiLabel","prHasAutoMergeLabel","syncLabelsAfterCommentBodyEdited","prCommentEditedOrDeleted","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","codeNeedsReviewLabel","autoMergeSkipCiLabel","createReview","event","updateBranchLabel","autoApproveAndAutoMerge","autoAssignPRToCreator","addAssignees","opened","reopened","reviewDismissed","hasChangesRequestedInReviews","hasApprovals","hasRequestedReviewsForGroup","reviewRequestRemoved","requested_reviewer","requestedTeam","requested_team","hasApprovedInReviews","assigneesLogins","potentialReviewer","sentMessageRequestedReview","split","deleteOne","reviewRequested","getEmojiFromState","reviewSubmitted","reviewUrl","isReviewByOwner","filteredFollowers","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","scheduleUpdateOrg","scheduleUpdateAllOrgs","run","mongoInit"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index-node12.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/utils/Excludes.ts","../src/events/account-handlers/actions/syncTeamMembers.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/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/slack/utils.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/utils/getReviewersAndReviewStates.ts","../src/events/pr-handlers/utils/getRolesFromPullRequestAndReviewers.ts","../src/events/pr-handlers/closed.ts","../src/events/pr-handlers/utils/createSlackMessageWithSecondaryBlock.ts","../src/events/pr-handlers/utils/getPullRequestFromPayload.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 || 3000}` : ''\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 try {\n const authInfo = await readAuthCookie(req, strategy);\n\n if (authInfo?.id) {\n return authInfo;\n }\n } catch {}\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(\n '/login',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async (req: Request, res: Response) => {\n if (await getAuthInfoFromCookie(req, res)) {\n res.redirect('/app');\n return;\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\n router.get(\n '/login-response',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\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(\n '/',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\n","import type { Config } from './types';\n\nconst config: Config<'dev', never> = {\n autoAssignToCreator: true,\n trimTitle: true,\n requiresReviewRequest: false,\n prDefaultOptions: {\n autoMerge: false,\n autoMergeWithSkipCi: 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)|(?=!:\\s)))?(?!)?(?:\\s.*)$/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://www.npmjs.com/package/@commitlint/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: ':vertical_traffic_light: automerge',\n color: '#64DD17',\n },\n 'merge/skip-ci': {\n name: ':vertical_traffic_light: 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 autoMerge: false,\n autoMergeWithSkipCi: 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 { regexConventionalCommit } from '../utils/conventionalCommit';\nimport 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 autoMergeWithSkipCi: false,\n autoMerge: false,\n deleteAfterMerge: true,\n },\n parsePR: {\n title: [\n {\n // eslint-disable-next-line unicorn/no-unsafe-regex\n regExp: /^(?revert: )?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\\([/A-Za-z-]+\\)?((?=:\\s)|(?=!:\\s)))?(?!)?(?:\\s.*)$/,\n error: {\n title: 'Title does not match commitlint conventional',\n summary:\n 'https://www.npmjs.com/package/@commitlint/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 head: [\n {\n bot: false,\n // eslint-disable-next-line unicorn/no-unsafe-regex\n regExp: /^(?revert-\\d+-)?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\\/[a-z-]+)?\\/(?!)?(?.*)-(?[A-Z][\\dA-Z]+-(\\d+))$/,\n warning: true,\n error: {\n title: 'Branch name does not match commitlint conventional',\n summary: '',\n },\n },\n ],\n base: [\n {\n regExp: /^(master|main)$/,\n error: {\n title: 'PR to branches other than main is not recommended',\n summary:\n 'https://ornikar.atlassian.net/wiki/spaces/TECH/pages/2221900272/Should+I+make+a+feature-branch+or+not',\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 AymenBac: `aymen${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 camillebaronnet: `camille.baronnet${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n 'olivier-martinez': `olivier.martinez${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 GaelFerrand: 'gael.ferrand@othrys.dev',\n aenario: `romain.foucault${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\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: `loic.leser${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n carlbouville: `carl.bouville${process.env.ORNIKAR_EMAIL_DOMAIN}`,\n },\n },\n\n groupsGithubTeams: {\n dev: ['ops', 'backend', 'frontend', 'frontend-architects'],\n design: ['design'],\n },\n\n teams: {\n ops: {\n githubTeamName: 'ops',\n logins: ['JulienBreux', 'TheR3aLp3nGuinJM', 'AymenBac'],\n labels: ['teams/ops'],\n },\n\n backends: {\n githubTeamName: 'backend',\n logins: [\n 'abarreir',\n 'arthurflachs',\n 'damienorny',\n 'Thierry-girod',\n 'darame07',\n 'Pixy',\n 'machartier',\n 'camillebaronnet',\n 'olivier-martinez',\n ],\n labels: ['teams/backend'],\n },\n\n frontends: {\n githubTeamName: 'frontend',\n logins: [\n 'christophehurpeau',\n 'HugoGarrido',\n 'LentnerStefan',\n 'CorentinAndre',\n 'Mxime',\n 'vlbr',\n 'budet-b',\n 'mdcarter',\n 'ChibiBlasphem',\n 'PSniezak',\n 'aenario',\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: ':vertical_traffic_light: 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-lifecycle': true,\n 'pr-lifecycle-follow': true,\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 { MongoStores, Org } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\n\ninterface OrgInfo {\n login: string;\n id: number;\n}\n\nexport const syncOrg = async (\n mongoStores: MongoStores,\n octokit: T,\n installationId: number,\n org: OrgInfo,\n): Promise => {\n const orgInStore = await mongoStores.orgs.upsertOne({\n _id: org.id,\n login: org.login,\n installationId,\n });\n\n const orgEmbed = { id: org.id, login: org.login };\n\n const memberIds: number[] = [];\n\n for await (const { data } of octokit.paginate.iterator(\n octokit.orgs.listMembers,\n { org: org.login },\n )) {\n await Promise.all(\n data.map(async (member) => {\n if (!member) return;\n memberIds.push(member.id);\n return Promise.all([\n mongoStores.orgMembers.upsertOne<'teams'>(\n {\n _id: `${org.id}_${member.id}`,\n org: orgEmbed,\n user: {\n id: member.id,\n login: member.login,\n },\n },\n {\n teams: [], // teams is synced in syncTeamMembers\n },\n ),\n mongoStores.users.upsertOne({\n _id: member.id,\n login: member.login,\n type: member.type,\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","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 { MongoStores, OrgTeamEmbed } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\nimport { ExcludesFalsy } from '../../../utils/Excludes';\n\nexport const syncTeamMembers = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n team: OrgTeamEmbed,\n): Promise => {\n const memberIds: number[] = [];\n for await (const { data } of octokit.paginate.iterator(\n octokit.teams.listMembersInOrg,\n {\n org: org.login,\n team_slug: team.slug,\n },\n )) {\n const currentIterationMemberIds = data\n .filter(ExcludesFalsy)\n .map((member) => member.id);\n memberIds.push(...currentIterationMemberIds);\n\n await mongoStores.orgMembers.partialUpdateMany(\n {\n _id: {\n $in: currentIterationMemberIds.map(\n (memberId) => `${org.id}_${memberId}`,\n ),\n },\n 'org.id': org.id,\n 'teams.id': { $ne: team.id },\n },\n { $push: { teams: team } },\n );\n }\n\n await mongoStores.orgMembers.partialUpdateMany(\n {\n 'org.id': org.id,\n 'user.id': { $not: { $in: memberIds } },\n },\n { $pull: { teams: { id: team.id } } },\n );\n};\n\nexport const syncTeamMembersWithTeamParents = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n team: OrgTeamEmbed,\n): Promise => {};\n","import type { MongoStores, OrgTeamEmbed } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\nimport { syncTeamMembers } from './syncTeamMembers';\n\nexport const syncTeams = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const orgEmbed = { id: org.id, login: org.login };\n\n const teamEmbeds: OrgTeamEmbed[] = [];\n const teamIds: number[] = [];\n\n for await (const { data } of octokit.paginate.iterator(octokit.teams.list, {\n org: org.login,\n })) {\n await Promise.all(\n data.map(async (team) => {\n teamIds.push(team.id);\n teamEmbeds.push({\n id: team.id,\n name: team.name,\n slug: team.slug,\n });\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 await Promise.all([\n mongoStores.orgTeams.deleteMany({\n 'org.id': org.id,\n _id: { $not: { $in: teamIds } },\n }),\n\n mongoStores.orgMembers.partialUpdateMany(\n {\n 'org.id': org.id,\n },\n { $pull: { teams: { id: { $not: { $in: teamIds } } } } },\n ),\n ]);\n\n return teamEmbeds;\n};\n\nexport const syncTeamsAndTeamMembers = async (\n mongoStores: MongoStores,\n octokit: Octokit,\n org: { login: string; id: number },\n): Promise => {\n const teams = await syncTeams(mongoStores, octokit, org);\n for (const team of teams) {\n await syncTeamMembers(mongoStores, octokit, org, team);\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 { syncTeamsAndTeamMembers } 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-lifecycle': 'Your PR is closed, merged, reopened',\n 'pr-lifecycle-follow':\n \"Someone closed, merged, reopened a PR you're reviewing\",\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(\n '/org/:org/force-sync',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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 syncTeamsAndTeamMembers(mongoStores, user.api, org);\n\n res.redirect(`/app/org/${req.params.org}`);\n },\n );\n\n router.get(\n '/org/:org',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\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(\n '/repositories',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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 {data.map((repo: any) => (\n
  • \n \n {repo.name}\n \n
  • \n ))}\n
\n\n {data.length === 100 && (\n
We currently have a limit to 100 repositories
\n )}\n
\n
,\n ),\n );\n },\n );\n\n router.get(\n '/repository/:owner/:repository',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\n 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}\n","import type { MongoStores, User } from '../../../mongo';\nimport type { Octokit } from '../../../octokit';\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(\n '/user/force-sync',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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\n router.get(\n '/user',\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n 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}\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 >[1]['getRouter'],\n { mongoStores }: AppContext,\n): Promise {\n const router = (getRouter as NonNullable)('/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","import { syncOrg } from '../events/account-handlers/actions/syncOrg';\nimport { syncTeamsAndTeamMembers } from '../events/account-handlers/actions/syncTeams';\nimport { syncUser } from '../events/account-handlers/actions/syncUser';\nimport type { Org, User } from '../mongo';\nimport type { Octokit } from '../octokit';\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 syncTeamsAndTeamMembers(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 = (o: T): (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 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 // TODO pass AccountInfo instead\n if (githubLogin.endsWith('[bot]')) {\n return `:robot_face: ${githubLogin.slice(0, -'[bot]'.length)}`;\n }\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 account.login,\n account._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 {\n PullRequestWithDecentData,\n PullRequestWithDecentDataFromWebhook,\n} from 'events/pr-handlers/utils/PullRequestData';\nimport type { Config } from '../accountConfigs';\nimport type {\n Org,\n User,\n AccountEmbed,\n AccountType,\n AccountEmbedWithoutType,\n OrgMember,\n} 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 getTeamGroup: (teamName: string) => GroupNames | undefined;\n getGithubTeamsGroups: (teamNames: string[]) => GroupNames[];\n getMembersForTeam: (teamId: string) => Promise;\n getTeamsForLogin: (githubLogin: string) => TeamNames[];\n approveShouldWait: (\n reviewerGroup: GroupNames | undefined,\n pullRequest: PullRequestWithDecentData,\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 for (const groupName of getKeys(config.groups)) {\n Object.keys(config.groups[groupName]).forEach((login) => {\n githubLoginToGroup.set(login, groupName);\n });\n }\n\n const githubTeamNameToGroup = new Map();\n if (config.groupsGithubTeams) {\n for (const groupName of getKeys(config.groupsGithubTeams)) {\n config.groupsGithubTeams[groupName].forEach((teamName) => {\n githubTeamNameToGroup.set(teamName, groupName);\n });\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 const getGithubTeamsGroups = (githubTeamNames: string[]): string[] => [\n ...new Set(\n githubTeamNames\n .map((teamName) => githubTeamNameToGroup.get(teamName))\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 getTeamGroup: (githubTeamName): string | undefined =>\n githubTeamNameToGroup.get(githubTeamName),\n getGithubTeamsGroups,\n\n getTeamsForLogin: (githubLogin): string[] =>\n githubLoginToTeams.get(githubLogin) || [],\n\n getMembersForTeam: async (teamId): Promise => {\n if (accountInfo.type !== 'Organization') {\n throw new Error(\n `Invalid account type \"${accountInfo.type}\" for getMembersForTeam`,\n );\n }\n const cursor = await appContext.mongoStores.orgMembers.cursor<\n Pick\n >({\n 'org.id': account._id,\n 'teams.id': teamId,\n });\n await cursor.limit(100);\n const orgMembers = await cursor.toArray();\n return orgMembers.map((member) => member.user);\n },\n\n approveShouldWait: (\n reviewerGroup,\n pullRequest,\n { includesReviewerGroup, includesWaitForGroups },\n ): boolean => {\n if (\n !reviewerGroup ||\n !pullRequest.requested_reviewers ||\n !pullRequest.requested_teams\n ) {\n return false;\n }\n\n const requestedReviewerGroups = [\n ...new Set([\n ...getReviewerGroups(\n (pullRequest.requested_reviewers as PullRequestWithDecentDataFromWebhook['requested_reviewers']).map(\n (request) => request.login,\n ),\n ),\n ...(!pullRequest.requested_teams\n ? []\n : getGithubTeamsGroups(\n (pullRequest.requested_teams as PullRequestWithDecentDataFromWebhook['requested_teams']).map(\n (team) => team.name,\n ),\n )),\n ]),\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 | 'autoMerge'\n | 'autoMergeWithSkipCi'\n | 'deleteAfterMerge';\n\nexport type Options = Record;\n\nexport const options: OptionsKeys[] = [\n 'autoMerge',\n 'autoMergeWithSkipCi',\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\ninterface OptionDisplay {\n key: OptionsKeys;\n labelKey?: string;\n icon?: string;\n description: string;\n}\n\nexport const optionsDescriptions: OptionDisplay[] = [\n {\n key: 'autoMerge',\n labelKey: 'merge/automerge',\n description:\n 'Automatically merge when this PR is ready and has no failed statuses. When the repository requires _branches to be up to date before merging_, it merges default branch, with a queue per repo to prevent multiple merges when several PRs are ready. A fail job prevents the merge.',\n },\n {\n key: 'autoMergeWithSkipCi',\n labelKey: 'merge/skip-ci',\n description:\n 'Add `[skip ci]` on merge commit when merge is done with autoMerge.',\n },\n {\n key: 'deleteAfterMerge',\n icon: ':recycle:',\n description: 'Automatically delete the branch 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 return false;\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 (\n pullRequest.requested_reviewers &&\n pullRequest.requested_reviewers.length > 0\n ) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested reviewers',\n );\n return false;\n }\n\n if (pullRequest.requested_teams && pullRequest.requested_teams.length > 0) {\n repoContext.removePrFromAutomergeQueue(\n context,\n pullRequest.number,\n 'still has requested teams',\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 lockedPrNumber: lockedPr.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 (\n pullRequest.body &&\n pullRequest.body.includes('')\n ) {\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 const isFeatureBranch = false; // options.featureBranch;\n\n const mergeResult = await context.octokit.pulls.merge({\n merge_method: isFeatureBranch ? 'merge' : 'squash',\n owner: pullRequest.head.repo.owner.login,\n repo: pullRequest.head.repo.name,\n pull_number: pullRequest.number,\n commit_title: isFeatureBranch\n ? undefined\n : `${pullRequest.title}${\n options.autoMergeWithSkipCi ? ' [skip ci]' : ''\n } (#${pullRequest.number})`,\n commit_message: isFeatureBranch ? 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 { LabelList, StatusInfo } from 'accountConfigs/types';\nimport type { Options } from './parseBody';\nimport { parseOptions } from './parseBody';\nimport { optionsDescriptions } from './prOptions';\n\nexport const defaultCommentBody = 'This will be auto filled by reviewflow.';\n\nconst toMarkdownOptions = (\n repoLink: string,\n labelsConfig: LabelList,\n options: Options,\n): string => {\n return optionsDescriptions\n .map(({ key, labelKey, description, icon: iconValue }) => {\n const checkboxWithId = `[${\n options[key] ? 'x' : ' '\n }] `;\n\n const labelDescription = labelKey && labelsConfig[labelKey];\n const labelLink = labelDescription\n ? `[${labelDescription.name}](${repoLink}/labels/${encodeURIComponent(\n labelDescription.name,\n )}): `\n : '';\n const icon = labelLink || !iconValue ? '' : `${iconValue} `;\n\n return `- ${checkboxWithId}${icon}${labelLink}${description}`;\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 repoLink: string,\n labelsConfig: LabelList,\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 repoLink,\n labelsConfig,\n options,\n )}`;\n};\n\nexport const createCommentBody = (\n repoLink: string,\n labelsConfig: LabelList,\n defaultOptions: Options,\n infos?: StatusInfo[],\n): string => {\n return internalUpdateBodyOptionsAndInfos(\n repoLink,\n labelsConfig,\n '',\n defaultOptions,\n infos,\n );\n};\n\nexport const updateCommentOptions = (\n repoLink: string,\n labelsConfig: LabelList,\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(\n repoLink,\n labelsConfig,\n commentBody,\n updatedOptions,\n ),\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 !commitNotes ? '$1' : `#### Commits Notes:\\n\\n${commitNotes}\\n\\n$1`,\n );\n};\n\nexport const removeDeprecatedReviewflowInPrBody = (\n prBody: string | null,\n): string => {\n if (!prBody) return '';\n return prBody.replace(\n /^(.*)(.*)(.*)$/is,\n '$1$3',\n );\n};\n","import type { RestEndpointMethodTypes } from '@octokit/rest';\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 as string };\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 as string };\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 as string };\n};\n","import type { RestEndpointMethodTypes } from '@octokit/rest';\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/rest';\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 | null;\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 if (labelKey === 'merge/skip-ci') {\n existingLabel = labels.find(\n (label) => label.name === 'automerge/skip-ci',\n );\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 name: existingLabel.name,\n new_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';\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<\n GroupNames extends string = any\n> = AccountContext & 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 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) => label.id && needsReviewLabelIds.includes(label.id));\n const hasRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && requestedReviewLabelIds.includes(label.id),\n );\n const hasChangesRequestedReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && changesRequestedLabelIds.includes(label.id),\n );\n const hasApprovesReview = (labels: PullRequestLabels): boolean =>\n labels.some(\n (label) => label.id && approvedReviewLabelIds.includes(label.id),\n );\n\n const getNeedsReviewGroupNames = (labels: PullRequestLabels): GroupNames[] =>\n labels\n .filter((label) => label.id && needsReviewLabelIds.includes(label.id))\n .map((label) =>\n labelIdToGroupName.get(label.id as NonNullable),\n )\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 { 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): ((context: Context) => Promise) => {\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 { 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\ntype OnCallback = (context: Context) => Promise;\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 GroupNames extends string = string\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 GroupNames extends string\n>(\n appContext: AppContext,\n getPrs: (\n payload: Context['payload'],\n repoContext: RepoContext,\n ) => 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 { AccountInfo } from 'context/getOrCreateAccount';\nimport type { PullRequestWithDecentData } from 'events/pr-handlers/utils/PullRequestData';\nimport 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\nexport const createOwnerPart = (\n ownerMention: string,\n pullRequest: PullRequestWithDecentData,\n sendTo: AccountInfo,\n): string => {\n const owner = pullRequest.user;\n\n if (owner && owner.id === sendTo.id) return 'your PR';\n\n const isAssignedTo: boolean =\n !!pullRequest.assignees &&\n pullRequest.assignees.some((a: any) => a && a.id === sendTo.id);\n\n return `${ownerMention}'s PR${isAssignedTo ? \" you're assigned to\" : ''}`;\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 { ExcludesFalsy } from '../../../utils/Excludes';\nimport type {\n PullRequestLabels,\n PullRequestWithDecentData,\n PullRequestWithDecentDataFromWebhook,\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 (\n pullRequest.requested_reviewers &&\n pullRequest.requested_reviewers.length > 0\n ) {\n return createFailedStatusCheck(\n `Awaiting review from: ${(pullRequest.requested_reviewers as PullRequestWithDecentDataFromWebhook['requested_reviewers'])\n .filter(ExcludesFalsy)\n .map((rr) => rr.login)\n .join(', ')}`,\n );\n }\n\n if (pullRequest.requested_teams && pullRequest.requested_teams.length > 0) {\n return createFailedStatusCheck(\n `Awaiting review from: ${(pullRequest.requested_teams as PullRequestWithDecentDataFromWebhook['requested_teams'])\n .filter(ExcludesFalsy)\n .map((rt) => rt.name)\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 { ExcludesFalsy } from '../../../utils/Excludes';\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(\n prLabels.map((label) => label.name).filter(ExcludesFalsy),\n );\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 (\n !label ||\n !label.name ||\n prLabels.some((prLabel) => prLabel.id === label.id)\n ) {\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 && existing.name) {\n newLabelNames.delete(existing.name);\n toDelete.add(key);\n toDeleteNames.add(existing.name);\n }\n });\n }\n\n // TODO move that elsewhere\n if (pullRequest.user) {\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\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 { Context } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\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}\n\nexport type Reviewer = AccountInfo;\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 ({ data: reviews }) => {\n reviews.forEach((review) => {\n if (!review.user) return;\n if (!userIds.has(review.user.id)) {\n userIds.add(review.user.id);\n reviewers.push({\n id: review.user.id,\n login: review.user.login,\n type: review.user.type,\n });\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 { AccountInfo } from 'context/getOrCreateAccount';\nimport type { PullRequestWithDecentDataFromWebhook } from './PullRequestData';\nimport type { Reviewer } from './getReviewersAndReviewStates';\n\nexport interface RequestedReviewers extends AccountInfo {\n isRequestedByName: boolean;\n requestedByTeams: string[];\n}\n\nexport function getRolesFromPullRequestAndReviewers(\n pullRequest: PullRequestWithDecentDataFromWebhook,\n reviewers: Reviewer[],\n): {\n owner: PullRequestWithDecentDataFromWebhook['user'];\n assignees: PullRequestWithDecentDataFromWebhook['assignees'];\n reviewers: Reviewer[];\n requestedReviewers: RequestedReviewers[];\n followers: AccountInfo[];\n} {\n const owner = pullRequest.user;\n const assignees = pullRequest.assignees;\n const assigneeIds = assignees.map((a) => a.id);\n\n const followers = reviewers.filter((user) => !assigneeIds.includes(user.id));\n const requestedReviewers: RequestedReviewers[] = pullRequest.requested_reviewers.map(\n (rr) => ({\n ...rr,\n isRequestedByName: true,\n requestedByTeams: [],\n }),\n );\n\n if (pullRequest.requested_teams) {\n // TODO\n // requestedReviewers.push ...\n }\n\n if (requestedReviewers) {\n followers.push(\n ...requestedReviewers.filter((rr) => {\n return (\n !followers.find((f) => f.id === rr.id) && !assigneeIds.includes(rr.id)\n );\n }),\n );\n }\n\n return {\n owner,\n assignees,\n reviewers,\n requestedReviewers,\n followers,\n };\n}\n","import type { Probot } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { parseOptions } from './actions/utils/body/parseBody';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\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 repo is not ignored */\n if (reviewflowPrContext) {\n /* update status, update automerge queue, delete branch */\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 /* update slack home */\n if (pullRequest.requested_reviewers) {\n pullRequest.requested_reviewers.forEach((requestedReviewer) => {\n repoContext.slack.updateHome(requestedReviewer.login);\n });\n }\n\n if (pullRequest.requested_teams) {\n await Promise.all(\n pullRequest.requested_teams.map(async (team) => {\n const members = await repoContext.getMembersForTeam(team.id);\n members.forEach((member) => {\n repoContext.slack.updateHome(member.login);\n });\n }),\n );\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n /* send notifications to assignees and followers */\n const { reviewers } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n\n const senderMention = repoContext.slack.mention(\n context.payload.sender.login,\n );\n const ownerMention = repoContext.slack.mention(owner.login);\n const prLink = slackUtils.createPrLink(pullRequest, repoContext);\n\n const createMessage = (to: AccountInfo): string => {\n const ownerPart = slackUtils.createOwnerPart(\n ownerMention,\n pullRequest,\n to,\n );\n\n return `${\n pullRequest.merged\n ? `:rocket: ${senderMention} merged`\n : `:wastebasket: ${senderMention} closed`\n } ${ownerPart} ${prLink}\\n> ${pullRequest.title}`;\n };\n\n assignees.map((assignee) => {\n if (context.payload.sender.id === assignee.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle',\n assignee.id,\n assignee.login,\n {\n text: createMessage(assignee),\n },\n );\n });\n\n followers.map((follower) => {\n if (context.payload.sender.id === follower.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle-follow',\n follower.id,\n follower.login,\n {\n text: createMessage(follower),\n },\n );\n });\n },\n ),\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 { 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/rest';\nimport type { EventPayloads } from '@octokit/webhooks';\nimport type { Probot, Context } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\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 { ExcludesFalsy, 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']['listReviewComments']['response']['data']\n> => {\n if (!comment.in_reply_to_id) return [comment];\n return context.octokit.paginate(\n context.octokit.pulls.listReviewComments,\n context.pullRequest() as any,\n ({ data }) => {\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']['listReviewComments']['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']['listReviewComments']['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 (!c.user || 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 prUser = pr.user;\n if (!prUser) return;\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 = prUser.login === comment.user.login;\n const [discussion, { reviewers }] = await Promise.all([\n getDiscussion(context, comment),\n getReviewersAndReviewStates(context, repoContext),\n ]);\n\n const followers: AccountInfo[] = reviewers.filter(\n (u) => u.id !== prUser.id && u.id !== comment.user.id,\n );\n\n if (pr.requested_reviewers) {\n followers.push(\n ...pr.requested_reviewers\n .filter((rr) => {\n return (\n rr &&\n !followers.find((f) => f.id === rr.id) &&\n rr.id !== (comment.user && comment.user.id) &&\n rr.id !== prUser.id\n );\n })\n .filter(ExcludesFalsy)\n .map((rr) => ({\n id: rr.id,\n login: rr.login,\n type: rr.type,\n })),\n );\n }\n\n const usersInThread = getUsersInThread(discussion).filter(\n (u) =>\n u.id !== prUser.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 !== prUser.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(prUser.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 (prUser && prUser.id) === comment.user.id\n ? 'his'\n : `${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 prUser.id,\n prUser.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 context.payload.repository.html_url,\n repoContext.config.labels.list,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n return {\n ...repoContext.config.prDefaultOptions,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const prHasSkipCiLabel = hasLabelInPR(pullRequest.labels, skipCiLabel);\n const prHasAutoMergeLabel = hasLabelInPR(pullRequest.labels, automergeLabel);\n\n const { commentBody, options } = updateCommentOptions(\n context.payload.repository.html_url,\n repoContext.config.labels.list,\n reviewflowPrContext.commentBody,\n calcDefaultOptions(repoContext, pullRequest),\n );\n\n await updatePrCommentBodyIfNeeded(context, reviewflowPrContext, commentBody);\n\n if (options && automergeLabel) {\n await Promise.all([\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 parse from '@commitlint/parse';\nimport type { CommitNote } from '@commitlint/types';\nimport type { RestEndpointMethodTypes } from '@octokit/rest';\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 | null): string =>\n !text ? '' : text.replace(/\\r\\n/g, '\\n');\nconst checkIfHasDiff = (text1: string | null, 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 .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 {\n ParsePRRule,\n StatusError,\n StatusInfo,\n} from '../../../accountConfigs/types';\nimport { getKeys } from '../../../context/utils';\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,\n shouldUpdateCommentBodyInfos: boolean,\n previousSha?: string,\n): Promise => {\n const title = repoContext.config.trimTitle\n ? cleanTitle(pullRequest.title)\n : pullRequest.title;\n\n const parsePRValue = {\n title,\n head: pullRequest.head.ref,\n base: pullRequest.base.ref,\n };\n\n const isPrFromBot = pullRequest.user && pullRequest.user.type === 'Bot';\n\n const statuses: Status[] = [];\n const warnings: StatusError[] = [];\n\n let errorRule: ParsePRRule | undefined;\n getKeys(repoContext.config.parsePR).find((parsePRKey) => {\n const rules = repoContext.config.parsePR[parsePRKey];\n if (!rules) return false;\n\n const value = parsePRValue[parsePRKey];\n errorRule = rules.find((rule) => {\n if (rule.bot === false && isPrFromBot) return false;\n\n const match = rule.regExp.exec(value);\n if (match === null) {\n if (rule.status) {\n statuses.push({ name: rule.status, error: rule.error });\n }\n if (rule.warning) {\n warnings.push(rule.error);\n return false;\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 return errorRule;\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 console.log(warnings);\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:\n warnings.length === 0\n ? '✓ Your PR is valid'\n : `warnings: ${warnings\n .map((error) => error.title)\n .join(',')}`,\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\n ? errorRule.error.title\n : // eslint-disable-next-line unicorn/no-nested-ternary\n warnings.length === 0\n ? '✓ Your PR is valid'\n : `warning${warnings.length === 1 ? '' : 's'}: ${warnings\n .map((error) => error.title)\n .join(',')}`,\n errorRule ? errorRule.error.url : undefined,\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 context.payload.repository.html_url,\n repoContext.config.labels.list,\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 { updateReviewStatus } from './actions/updateReviewStatus';\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 codeNeedsReviewLabel = repoContext.labels['code/needs-review'];\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 if (hasLabelInPR(labels, codeNeedsReviewLabel)) {\n await updateReviewStatus(\n updatedPr,\n context,\n repoContext,\n 'dev',\n {\n remove: ['needsReview'],\n },\n );\n } else {\n await updateStatusCheckFromLabels(\n updatedPr,\n context,\n repoContext,\n labels,\n );\n }\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 autoMergeSkipCiLabel,\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 automergeLabel = repoContext.labels['merge/automerge'];\n const skipCiLabel = repoContext.labels['merge/skip-ci'];\n\n const option = (() => {\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 || pullRequest.assignees.length > 0) return;\n if (!pullRequest.user || 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 { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { fetchPr } from './utils/fetchPr';\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 if (reviewflowPrContext === null) return;\n const fromRenovate = pullRequest.head.ref.startsWith('renovate/');\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) {\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 ),\n );\n}\n","import type { Probot } from 'probot';\nimport type { AccountInfo } from 'context/getOrCreateAccount';\nimport type { AppContext } from '../../context/AppContext';\nimport * as slackUtils from '../../slack/utils';\nimport { editOpenedPR } from './actions/editOpenedPR';\nimport { updateReviewStatus } from './actions/updateReviewStatus';\nimport { createPullRequestHandler } from './utils/createPullRequestHandler';\nimport { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\n\nexport default function reopened(app: Probot, appContext: AppContext): void {\n app.on(\n 'pull_request.reopened',\n createPullRequestHandler(\n appContext,\n (payload, context, repoContext) => {\n return payload.pull_request;\n },\n async (\n pullRequest,\n context,\n repoContext,\n reviewflowPrContext,\n ): Promise => {\n /* if repo is not ignored */\n if (reviewflowPrContext) {\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 /* update slack home */\n if (pullRequest.requested_reviewers) {\n pullRequest.requested_reviewers.forEach((requestedReviewer) => {\n repoContext.slack.updateHome(requestedReviewer.login);\n });\n }\n\n if (pullRequest.requested_teams) {\n await Promise.all(\n pullRequest.requested_teams.map(async (team) => {\n const members = await repoContext.getMembersForTeam(team.id);\n members.forEach((member) => {\n repoContext.slack.updateHome(member.login);\n });\n }),\n );\n }\n\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n /* send notifications to assignees and followers */\n const { reviewers } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n\n const senderMention = repoContext.slack.mention(\n context.payload.sender.login,\n );\n const ownerMention = repoContext.slack.mention(owner.login);\n const prLink = slackUtils.createPrLink(pullRequest, repoContext);\n\n const createMessage = (to: AccountInfo): string => {\n const ownerPart = slackUtils.createOwnerPart(\n ownerMention,\n pullRequest,\n to,\n );\n\n return `:recycle: ${senderMention} reopened ${ownerPart} ${prLink}\\n> ${pullRequest.title}`;\n };\n\n assignees.map((assignee) => {\n if (context.payload.sender.id === assignee.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle',\n assignee.id,\n assignee.login,\n {\n text: createMessage(assignee),\n },\n );\n });\n\n followers.map((follower) => {\n if (context.payload.sender.id === follower.id) return;\n return repoContext.slack.postMessage(\n 'pr-lifecycle-follow',\n follower.id,\n follower.login,\n {\n text: createMessage(follower),\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 { 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.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\n const hasChangesRequestedInReviews =\n reviewStates[reviewerGroup].changesRequested !== 0;\n const hasApprovals = reviewStates[reviewerGroup].approved !== 0;\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n updatedPr,\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 if (assignee) {\n repoContext.slack.updateHome(assignee.login);\n }\n });\n }\n if (\n !updatedPr.assignees ||\n !updatedPr.assignees.find(\n (assignee) => 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: `:recycle: ${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: `:recycle: ${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 requestedReviewer = (context.payload as any).requested_reviewer;\n const requestedTeam = (context.payload as any).requested_team;\n const requestedReviewers = requestedReviewer\n ? [requestedReviewer]\n : await repoContext.getMembersForTeam(requestedTeam.id);\n\n const reviewerGroup = requestedReviewer\n ? repoContext.getReviewerGroup(requestedReviewer.login)\n : repoContext.getTeamGroup(requestedTeam.name);\n\n if (\n !repoContext.shouldIgnore &&\n reviewerGroup &&\n repoContext.config.labels.review[reviewerGroup]\n ) {\n const hasRequestedReviewsForGroup = repoContext.approveShouldWait(\n reviewerGroup,\n pullRequest,\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 const assigneesLogins: string[] = [];\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n assigneesLogins.push(assignee.login);\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n requestedReviewers.forEach((potentialReviewer) => {\n if (assigneesLogins.includes(potentialReviewer)) return;\n repoContext.slack.updateHome(potentialReviewer.login);\n });\n }\n\n if (repoContext.slack) {\n if (requestedReviewers.some((rr) => rr.login === sender.login)) {\n requestedReviewers.forEach((potentialReviewer) => {\n if (potentialReviewer.login === sender.login) return;\n repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for your team _${\n requestedTeam.name\n }_ review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n } else {\n requestedReviewers.forEach((potentialReviewer) => {\n repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n {\n text: `:skull_and_crossbones: ${repoContext.slack.mention(\n sender.login,\n )} removed the request for ${\n requestedTeam ? `your team _${requestedTeam.name}_` : 'your'\n } review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )}`,\n },\n );\n });\n }\n\n await Promise.all(\n requestedReviewers.map(async (potentialReviewer) => {\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}_${\n requestedTeam ? `${requestedTeam.id}_` : ''\n }${potentialReviewer.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 ),\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 requestedReviewer = (context.payload as any).requested_reviewer;\n const requestedTeam = (context.payload as any).requested_team;\n const requestedReviewers = requestedReviewer\n ? [requestedReviewer]\n : await repoContext.getMembersForTeam(requestedTeam.id);\n\n const reviewerGroup = requestedReviewer\n ? repoContext.getReviewerGroup(requestedReviewer.login)\n : repoContext.getTeamGroup(requestedTeam.name);\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 const assigneesLogins: string[] = [];\n if (pullRequest.assignees) {\n pullRequest.assignees.forEach((assignee) => {\n assigneesLogins.push(assignee.login);\n repoContext.slack.updateHome(assignee.login);\n });\n }\n\n requestedReviewers.forEach((potentialReviewer) => {\n if (assigneesLogins.includes(potentialReviewer)) return;\n repoContext.slack.updateHome(potentialReviewer.login);\n });\n }\n\n if (!shouldWait && repoContext.slack) {\n const text = `:eyes: ${repoContext.slack.mention(\n sender.login,\n )} requests ${\n requestedReviewer ? 'your' : `your team _${requestedTeam.name}_`\n } review on ${slackUtils.createPrLink(\n pullRequest,\n repoContext,\n )} !\\n> ${pullRequest.title}`;\n const message = { text };\n\n await Promise.all(\n requestedReviewers.map(async (potentialReviewer) => {\n if (sender.login === potentialReviewer.login) return;\n\n const result = await repoContext.slack.postMessage(\n 'pr-review',\n potentialReviewer.id,\n potentialReviewer.login,\n message,\n );\n if (result) {\n await appContext.mongoStores.slackSentMessages.insertOne({\n type: 'review-requested',\n typeId: `${pullRequest.id}_${\n requestedTeam ? `${requestedTeam.id}_` : ''\n }${potentialReviewer.id}`,\n message,\n account: repoContext.accountEmbed,\n sentTo: [result],\n });\n }\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';\nimport { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';\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 { reviewers, reviewStates } = await getReviewersAndReviewStates(\n context,\n repoContext,\n );\n const {\n owner,\n assignees,\n followers,\n } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers);\n const isReviewByOwner = owner.login === reviewer.login;\n\n const filteredFollowers = followers.filter(\n (follower) => follower.id !== reviewer.id,\n );\n\n if (!isReviewByOwner) {\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,\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 (assignees) {\n assignees.forEach((assignee) => {\n repoContext.slack.updateHome(assignee.login);\n });\n }\n if (\n !assignees.find((assignee) => assignee.login === reviewer.login)\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(owner.login);\n\n const createMessage = (\n toOwner?: boolean,\n isAssignedTo?: boolean,\n ): string => {\n const ownerPart = toOwner\n ? 'your PR'\n : `${ownerMention}'s PR${\n isAssignedTo ? \" you're assigned to\" : ''\n }`;\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 assignees.forEach((assignee) => {\n repoContext.slack.postMessage(\n 'pr-review',\n assignee.id,\n assignee.login,\n createSlackMessageWithSecondaryBlock(\n createMessage(assignee.id === owner.id, true),\n slackifiedBody,\n ),\n );\n });\n\n const message = createSlackMessageWithSecondaryBlock(\n createMessage(false),\n slackifiedBody,\n );\n\n filteredFollowers.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 filteredFollowers.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 {\n syncTeams,\n syncTeamsAndTeamMembers,\n} 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 appContext,\n async (context, accountContext) => {\n // TODO: only sync team members and team parents members\n // await syncTeamMembersWithTeamParents(\n // appContext.mongoStores,\n // context.octokit,\n // context.payload.organization,\n // {\n // id: context.payload.team.id,\n // name: context.payload.team.name,\n // slug: context.payload.team.slug,\n // },\n // );\n await syncTeamsAndTeamMembers(\n appContext.mongoStores,\n context.octokit,\n context.payload.organization,\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\nexport type 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 OrgTeam extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n name: string;\n slug: string;\n description: string | null;\n}\n\nexport interface OrgTeamEmbed {\n id: OrgTeam['_id'];\n name: OrgTeam['name'];\n slug: OrgTeam['slug'];\n}\n\nexport interface OrgMember extends MongoBaseModel {\n org: AccountEmbedWithoutType;\n user: AccountEmbedWithoutType;\n slack?: { id: string };\n teams: OrgTeamEmbed[];\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 coll.createIndex(\n { 'org.id': 1, 'user.id': 1, 'teams.id': 1 },\n { unique: true },\n );\n coll.createIndex({ 'org.id': 1, 'teams.id': 1 });\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 { WebClient } from '@slack/web-api';\nimport type { MongoStores, Org, OrgMember } from '../mongo';\nimport type { Octokit } from '../octokit';\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 octokit: 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 octokit.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 octokit.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 octokit.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 octokit.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","autoMerge","autoMergeWithSkipCi","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","head","warning","base","botUsers","JulienBreux","ORNIKAR_EMAIL_DOMAIN","TheR3aLp3nGuinJM","AymenBac","abarreir","damienorny","darame07","Pixy","machartier","camillebaronnet","HugoGarrido","CorentinAndre","Mxime","vlbr","mdcarter","ChibiBlasphem","PSniezak","GaelFerrand","aenario","design","jperriere","CoralineColasse","Lenamari","loicleser","carlbouville","groupsGithubTeams","ops","githubTeamName","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","octokit","installationId","orgInStore","upsertOne","_id","orgEmbed","memberIds","paginate","iterator","listMembers","Promise","all","member","push","orgMembers","type","deleteMany","$not","$in","ExcludesFalsy","Boolean","ExcludesNullish","syncTeamMembers","team","listMembersInOrg","team_slug","slug","currentIterationMemberIds","filter","partialUpdateMany","memberId","$ne","$push","$pull","syncTeams","teamEmbeds","teamIds","orgTeams","syncTeamsAndTeamMembers","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","github","userInfo","userSettings","u","getUserInstallation","username","appRouter","app","getRouter","use","cookieParser","getOrCreateAccount","accountInfo","getKeys","keys","emojiRegex","createEmojiRegex","getEmojiFromRepoDescription","startsWith","emoji","exec","voidTeamSlack","mention","postMessage","resolve","updateMessage","deleteMessage","addReaction","updateHome","initTeamSlack","slackHome","context","account","slackToken","githubLoginToSlackEmail","reduce","acc","groupName","assign","slackEmails","values","slackClient","WebClient","membersInDb","findAll","members","foundEmailMembers","forEach","email","m","slack","im","missingEmails","includes","memberEmailToMemberId","page","profile","has","conversations","open","channel","console","membersMap","getUserFromGithubLogin","githubLogin","endsWith","slice","category","githubId","message","log","debug","DRY_RUN","chat","text","blocks","attachments","secondaryBlocks","thread_ts","ts","ok","update","delete","reactions","add","timestamp","scheduleUpdateMember","initAccountContext","appContext","payload","slackPromise","githubLoginToGroup","githubTeamNameToGroup","teamName","githubLoginToTeams","getReviewerGroups","githubLogins","Set","getGithubTeamsGroups","githubTeamNames","lock","Lock","accountEmbed","accountType","callback","reject","logInfos","info","createReleaseCallback","release","getReviewerGroup","getTeamGroup","getTeamsForLogin","getMembersForTeam","teamId","cursor","limit","toArray","approveShouldWait","reviewerGroup","pullRequest","includesReviewerGroup","includesWaitForGroups","requested_reviewers","requested_teams","requestedReviewerGroups","request","some","group","accountContextsPromise","accountContexts","obtainAccountContext","existingAccountContext","existingPromise","promise","then","accountContext","handlerOrgChange","organization","createHandlerOrgChange","options","optionsRegexps","option","regexp","RegExp","optionsDescriptions","labelKey","icon","parseOptions","content","defaultOptions","parseCommitNotes","commitNotes","replace","trim","parseBody","hasLabelInPR","prLabels","label","l","hasFailedStatusOrChecks","pr","checks","listForRef","ref","sha","failedChecks","check_runs","check","conclusion","combinedStatus","getCombinedStatusForRef","state","failedStatuses","statuses","autoMergeIfPossible","repoContext","reviewflowPrContext","autoMergeLabel","removePrFromAutomergeQueue","number","isRenovatePr","createMergeLockPrFromPr","branch","addLog","action","repoFullName","full_name","automergeLogs","insertOne","isRenovate","mergeableState","mergeable_state","hasNeedsReview","hasRequestedReview","lockedPr","getMergeLockedPr","String","prId","prNumber","lockedPrNumber","pushAutomergeQueue","addMergeLockPr","mergeable","prResult","pulls","pull_number","merged","reschedule","renovateRebaseBody","issues","issue_number","merge","parsedBody","commentBody","mergeResult","merge_method","commit_title","commit_message","errorMessage","defaultCommentBody","toMarkdownOptions","repoLink","labelsConfig","iconValue","checkboxWithId","labelDescription","labelLink","encodeURIComponent","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","labelConfig","labelColor","existingLabel","createLabel","current_name","updateLabel","new_name","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","createLink","createPrLink","html_url","createOwnerPart","ownerMention","sendTo","isAssignedTo","assignees","a","createStatus","createCommitStatus","target_url","addStatusCheck","previousSha","hasPrCheck","head_sha","started_at","created_at","completed_at","toISOString","output","updateStatusCheckFromLabels","createFailedStatusCheck","rr","rt","needsReviewGroupNames","updateReviewStatus","reviewGroup","labelsToAdd","remove","labelsToRemove","newLabelNames","toAdd","toAddNames","toDelete","toDeleteNames","getLabelFromKey","reviewConfig","prLabel","size","addLabels","toDeleteName","removeLabel","newLabelNamesArray","oldLabels","setLabels","getReviewersAndReviewStates","userIds","reviewers","reviewStatesByUser","listReviews","reviews","toUpperCase","reviewStates","dismissed","reviewer","getRolesFromPullRequestAndReviewers","assigneeIds","followers","requestedReviewers","isRequestedByName","requestedByTeams","f","closed","pull_request","isNotFork","git","deleteRef","requestedReviewer","assignee","senderMention","sender","prLink","slackUtils","createMessage","to","ownerPart","follower","createMrkdwnSectionBlock","createSlackMessageWithSecondaryBlock","secondaryBlockText","getPullRequestFromPayload","checkIfUserIsBot","checkIfIsThisBot","parse","issueParser","actions","issuePrefixes","parseMentions","mentions","slackifyCommentBody","multipleLines","slackifyMarkdown","getDiscussion","in_reply_to_id","listReviewComments","c","getMentions","discussion","getUsersInThread","prCommentCreated","saveInDb","results","filtered","slackSentMessages","typeId","sentTo","prUser","pull_request_review_id","commentByOwner","usersInThread","prUrl","commentLink","toOwner","promisesOwner","promisesNotOwner","slackifiedBody","start_line","isBotUser","slackMessage","updatePrCommentBody","newBody","updateComment","updatePrCommentBodyIfNeeded","updatePrCommentBodyOptions","syncLabel","shouldHaveLabel","prHasLabel","onRemove","onAdd","response","calcDefaultOptions","automergeLabel","skipCiLabel","prHasSkipCiLabel","prHasAutoMergeLabel","syncLabelsAfterCommentBodyEdited","prCommentEditedOrDeleted","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","parsePRValue","isPrFromBot","warnings","errorRule","parsePRKey","rules","rule","date","hasLintPrCheck","promises","commentBodyInfos","shouldCreateCommentBody","edited","updatedPullRequest","updateBranch","isFromRenovate","labelsChanged","fromRenovate","codeApprovedLabel","codeNeedsReviewLabel","autoMergeSkipCiLabel","createReview","event","updateBranchLabel","autoApproveAndAutoMerge","autoAssignPRToCreator","addAssignees","opened","reopened","reviewDismissed","hasChangesRequestedInReviews","hasApprovals","hasRequestedReviewsForGroup","reviewRequestRemoved","requested_reviewer","requestedTeam","requested_team","hasApprovedInReviews","assigneesLogins","potentialReviewer","sentMessageRequestedReview","split","deleteOne","reviewRequested","getEmojiFromState","reviewSubmitted","reviewUrl","isReviewByOwner","filteredFollowers","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","scheduleUpdateOrg","scheduleUpdateAllOrgs","run","mongoInit"],"mappings":"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"} \ No newline at end of file diff --git a/src/accountConfigs/christophehurpeau.ts b/src/accountConfigs/christophehurpeau.ts index 5feea762d..2bfd225d3 100644 --- a/src/accountConfigs/christophehurpeau.ts +++ b/src/accountConfigs/christophehurpeau.ts @@ -14,7 +14,7 @@ const config: Config<'dev', never> = { { regExp: // eslint-disable-next-line unicorn/no-unsafe-regex - /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\(([/a-z-]*)\))?(!)?:\s/, + /^(?revert: )?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\([/a-z-]+\)?((?=:\s)|(?=!:\s)))?(?!)?(?:\s.*)$/, error: { title: 'Title does not match commitlint conventional', summary: diff --git a/src/accountConfigs/ornikar.ts b/src/accountConfigs/ornikar.ts index 0d2d36b96..08650a3e0 100644 --- a/src/accountConfigs/ornikar.ts +++ b/src/accountConfigs/ornikar.ts @@ -14,9 +14,8 @@ const config: Config<'dev' | 'design', 'ops' | 'frontends' | 'backends'> = { parsePR: { title: [ { - regExp: - // eslint-disable-next-line unicorn/no-unsafe-regex - /^(revert: )?(build|chore|ci|docs|feat|fix|perf|refactor|style|test)(\(([/A-Za-z-]*)\))?:\s/, + // eslint-disable-next-line unicorn/no-unsafe-regex + regExp: /^(?revert: )?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\([/A-Za-z-]+\)?((?=:\s)|(?=!:\s)))?(?!)?(?:\s.*)$/, error: { title: 'Title does not match commitlint conventional', summary: @@ -27,7 +26,7 @@ const config: Config<'dev' | 'design', 'ops' | 'frontends' | 'backends'> = { bot: false, regExp: /\s([A-Z][\dA-Z]+-(\d+)|\[no issue])$/, error: { - title: 'Title does not have JIRA issue', + title: 'Title does not have Jira issue', summary: 'The PR title should end with ONK-0000, or [no issue]', }, status: 'jira-issue', @@ -48,6 +47,28 @@ const config: Config<'dev' | 'design', 'ops' | 'frontends' | 'backends'> = { }, }, ], + head: [ + { + bot: false, + // eslint-disable-next-line unicorn/no-unsafe-regex + regExp: /^(?revert-\d+-)?(?build|chore|ci|docs|feat|fix|perf|refactor|style|test)(?\/[a-z-]+)?\/(?!)?(?.*)-(?[A-Z][\dA-Z]+-(\d+))$/, + warning: true, + error: { + title: 'Branch name does not match commitlint conventional', + summary: '', + }, + }, + ], + base: [ + { + regExp: /^(master|main)$/, + error: { + title: 'PR to branches other than main is not recommended', + summary: + 'https://ornikar.atlassian.net/wiki/spaces/TECH/pages/2221900272/Should+I+make+a+feature-branch+or+not', + }, + }, + ], }, botUsers: ['michael-robot'], diff --git a/src/accountConfigs/types.ts b/src/accountConfigs/types.ts index cde00324b..7d4697571 100644 --- a/src/accountConfigs/types.ts +++ b/src/accountConfigs/types.ts @@ -10,6 +10,7 @@ export interface StatusInfo { export interface StatusError { title: string; summary: string; + url?: string; } export interface Group { @@ -26,6 +27,7 @@ export interface ParsePRRule { bot?: false; regExp: RegExp; error: StatusError; + warning?: boolean; status?: string; statusInfoFromMatch?: (match: RegExpMatchArray) => StatusInfo; @@ -33,6 +35,8 @@ export interface ParsePRRule { export interface ParsePR { title: ParsePRRule[]; + head?: ParsePRRule[]; + base?: ParsePRRule[]; } export interface LabelDescriptor { diff --git a/src/context/utils.ts b/src/context/utils.ts index c52b1d530..70b370052 100644 --- a/src/context/utils.ts +++ b/src/context/utils.ts @@ -1,8 +1,6 @@ import createEmojiRegex from 'emoji-regex'; -export const getKeys = >( - o: T, -): (keyof T)[] => Object.keys(o) as (keyof T)[]; +export const getKeys = (o: T): (keyof T)[] => Object.keys(o) as (keyof T)[]; const emojiRegex = createEmojiRegex(); diff --git a/src/events/pr-handlers/actions/editOpenedPR.ts b/src/events/pr-handlers/actions/editOpenedPR.ts index 73de39f8e..506014a83 100644 --- a/src/events/pr-handlers/actions/editOpenedPR.ts +++ b/src/events/pr-handlers/actions/editOpenedPR.ts @@ -1,7 +1,12 @@ import type { EventPayloads } from '@octokit/webhooks'; import type { Context } from 'probot'; import type { RepoContext } from 'context/repoContext'; -import type { StatusError, StatusInfo } from '../../../accountConfigs/types'; +import type { + ParsePRRule, + StatusError, + StatusInfo, +} from '../../../accountConfigs/types'; +import { getKeys } from '../../../context/utils'; import { ExcludesFalsy } from '../../../utils/Excludes'; import type { PullRequestWithDecentData } from '../utils/PullRequestData'; import type { ReviewflowPrContext } from '../utils/createPullRequestContext'; @@ -46,30 +51,49 @@ export const editOpenedPR = async < ? cleanTitle(pullRequest.title) : pullRequest.title; + const parsePRValue = { + title, + head: pullRequest.head.ref, + base: pullRequest.base.ref, + }; + const isPrFromBot = pullRequest.user && pullRequest.user.type === 'Bot'; const statuses: Status[] = []; + const warnings: StatusError[] = []; + + let errorRule: ParsePRRule | undefined; + getKeys(repoContext.config.parsePR).find((parsePRKey) => { + const rules = repoContext.config.parsePR[parsePRKey]; + if (!rules) return false; + + const value = parsePRValue[parsePRKey]; + errorRule = rules.find((rule) => { + if (rule.bot === false && isPrFromBot) return false; + + const match = rule.regExp.exec(value); + if (match === null) { + if (rule.status) { + statuses.push({ name: rule.status, error: rule.error }); + } + if (rule.warning) { + warnings.push(rule.error); + return false; + } + return true; + } - const errorRule = repoContext.config.parsePR.title.find((rule) => { - if (rule.bot === false && isPrFromBot) return false; - - const match = rule.regExp.exec(title); - if (match === null) { - if (rule.status) { - statuses.push({ name: rule.status, error: rule.error }); + if (rule.status && rule.statusInfoFromMatch) { + statuses.push({ + name: rule.status, + info: rule.statusInfoFromMatch(match), + }); + return false; } - return true; - } - - if (rule.status && rule.statusInfoFromMatch) { - statuses.push({ - name: rule.status, - info: rule.statusInfoFromMatch(match), - }); - return false; - } - return false; + return false; + }); + return errorRule; }); const date = new Date().toISOString(); @@ -84,6 +108,8 @@ export const editOpenedPR = async < (check): boolean => check.name === `${process.env.REVIEWFLOW_NAME}/lint-pr`, ); + console.log(warnings); + const promises: Promise[] = [ ...statuses.map( ({ name, error, info }): Promise => @@ -125,7 +151,12 @@ export const editOpenedPR = async < output: errorRule ? errorRule.error : { - title: '✓ Your PR is valid', + title: + warnings.length === 0 + ? '✓ Your PR is valid' + : `warnings: ${warnings + .map((error) => error.title) + .join(',')}`, summary: '', }, }), @@ -145,7 +176,15 @@ export const editOpenedPR = async < 'lint-pr', pullRequest.head.sha, errorRule ? 'failure' : 'success', - errorRule ? errorRule.error.title : '✓ Your PR is valid', + errorRule + ? errorRule.error.title + : // eslint-disable-next-line unicorn/no-nested-ternary + warnings.length === 0 + ? '✓ Your PR is valid' + : `warning${warnings.length === 1 ? '' : 's'}: ${warnings + .map((error) => error.title) + .join(',')}`, + errorRule ? errorRule.error.url : undefined, ), ].filter(ExcludesFalsy);