renovate 42.0.0-next.1 → 42.0.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/platform/bitbucket-server/index.d.ts +3 -1
- package/dist/modules/platform/bitbucket-server/index.js +82 -0
- package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/schema.d.ts +96 -0
- package/dist/modules/platform/bitbucket-server/schema.js +9 -1
- package/dist/modules/platform/bitbucket-server/schema.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/utils.d.ts +2 -0
- package/dist/modules/platform/bitbucket-server/utils.js +25 -0
- package/dist/modules/platform/bitbucket-server/utils.js.map +1 -1
- package/package.json +2 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
import type { BranchStatus } from '../../../types';
|
2
|
-
import type { BranchStatusConfig, CreatePRConfig, EnsureCommentConfig, EnsureCommentRemovalConfig, EnsureIssueConfig, EnsureIssueResult, FindPRConfig, Issue, MergePRConfig, PlatformParams, PlatformResult, Pr, RepoParams, RepoResult, UpdatePrConfig } from '../types';
|
2
|
+
import type { BranchStatusConfig, CreatePRConfig, EnsureCommentConfig, EnsureCommentRemovalConfig, EnsureIssueConfig, EnsureIssueResult, FileOwnerRule, FindPRConfig, Issue, MergePRConfig, PlatformParams, PlatformResult, Pr, RepoParams, RepoResult, UpdatePrConfig } from '../types';
|
3
3
|
import type { BbsPr } from './types';
|
4
4
|
export declare const id = "bitbucket-server";
|
5
5
|
export declare function initPlatform({ endpoint, token, username, password, gitAuthor, }: PlatformParams): Promise<PlatformResult>;
|
@@ -38,5 +38,7 @@ export declare function updatePr({ number: prNo, prTitle: title, prBody: rawDesc
|
|
38
38
|
bitbucketInvalidReviewers?: string[] | undefined;
|
39
39
|
}): Promise<void>;
|
40
40
|
export declare function mergePr({ branchName, id: prNo, }: MergePRConfig): Promise<boolean>;
|
41
|
+
export declare function expandGroupMembers(reviewers: string[]): Promise<string[]>;
|
42
|
+
export declare function extractRulesFromCodeOwnersLines(cleanedLines: string[]): FileOwnerRule[];
|
41
43
|
export declare function massageMarkdown(input: string): string;
|
42
44
|
export declare function maxBodyLength(): number;
|
@@ -28,10 +28,13 @@ exports.ensureCommentRemoval = ensureCommentRemoval;
|
|
28
28
|
exports.createPr = createPr;
|
29
29
|
exports.updatePr = updatePr;
|
30
30
|
exports.mergePr = mergePr;
|
31
|
+
exports.expandGroupMembers = expandGroupMembers;
|
32
|
+
exports.extractRulesFromCodeOwnersLines = extractRulesFromCodeOwnersLines;
|
31
33
|
exports.massageMarkdown = massageMarkdown;
|
32
34
|
exports.maxBodyLength = maxBodyLength;
|
33
35
|
const tslib_1 = require("tslib");
|
34
36
|
const promises_1 = require("timers/promises");
|
37
|
+
const ignore_1 = tslib_1.__importDefault(require("ignore"));
|
35
38
|
const semver_1 = tslib_1.__importDefault(require("semver"));
|
36
39
|
const error_messages_1 = require("../../../constants/error-messages");
|
37
40
|
const logger_1 = require("../../../logger");
|
@@ -43,6 +46,7 @@ const hostRules = tslib_1.__importStar(require("../../../util/host-rules"));
|
|
43
46
|
const bitbucket_server_1 = require("../../../util/http/bitbucket-server");
|
44
47
|
const memory_http_cache_provider_1 = require("../../../util/http/cache/memory-http-cache-provider");
|
45
48
|
const regex_1 = require("../../../util/regex");
|
49
|
+
const sample_1 = require("../../../util/sample");
|
46
50
|
const sanitize_1 = require("../../../util/sanitize");
|
47
51
|
const url_1 = require("../../../util/url");
|
48
52
|
const util_1 = require("../util");
|
@@ -845,6 +849,84 @@ async function mergePr({ branchName, id: prNo, }) {
|
|
845
849
|
logger_1.logger.debug(`PR merged, PrNo:${prNo}`);
|
846
850
|
return true;
|
847
851
|
}
|
852
|
+
async function expandGroupMembers(reviewers) {
|
853
|
+
logger_1.logger.debug(`expandGroupMembers(${reviewers.join(', ')})`);
|
854
|
+
const expandedUsers = [];
|
855
|
+
const reviewerGroupPrefix = '@reviewer-group/';
|
856
|
+
for (const reviewer of reviewers) {
|
857
|
+
const [baseEntry, modifier] = reviewer.split(':');
|
858
|
+
if (baseEntry.startsWith(reviewerGroupPrefix)) {
|
859
|
+
const groupName = baseEntry.replace(reviewerGroupPrefix, '');
|
860
|
+
const groupUsers = await getUsersFromReviewerGroup(groupName);
|
861
|
+
if (!groupUsers.length) {
|
862
|
+
continue;
|
863
|
+
}
|
864
|
+
if (modifier) {
|
865
|
+
const randomCount = (0, utils_1.parseModifier)(modifier);
|
866
|
+
if (randomCount) {
|
867
|
+
expandedUsers.push(...(0, sample_1.sampleSize)(groupUsers, randomCount));
|
868
|
+
continue;
|
869
|
+
}
|
870
|
+
}
|
871
|
+
expandedUsers.push(...groupUsers);
|
872
|
+
}
|
873
|
+
else {
|
874
|
+
expandedUsers.push(baseEntry); // Add the user entry
|
875
|
+
}
|
876
|
+
}
|
877
|
+
return [...new Set(expandedUsers)];
|
878
|
+
}
|
879
|
+
function extractRulesFromCodeOwnersLines(cleanedLines) {
|
880
|
+
const results = [];
|
881
|
+
const reversedLines = cleanedLines
|
882
|
+
.filter((line) => line.trim() !== '' && !line.trim().startsWith('#'))
|
883
|
+
.reverse();
|
884
|
+
for (const line of reversedLines) {
|
885
|
+
const [pattern, ...entries] = (0, utils_1.splitEscapedSpaces)(line);
|
886
|
+
const matcher = (0, ignore_1.default)().add(pattern);
|
887
|
+
results.push({
|
888
|
+
pattern,
|
889
|
+
usernames: [...new Set(entries)],
|
890
|
+
score: pattern.length,
|
891
|
+
match: (path) => matcher.ignores(path),
|
892
|
+
});
|
893
|
+
}
|
894
|
+
return results;
|
895
|
+
}
|
896
|
+
// Gets active users by name, from a reviewer group
|
897
|
+
// Returns an empty array if the group is not found or has no active users
|
898
|
+
// As there is no direct API to get group by name, we get all reviewer groups per repo and filter them
|
899
|
+
// This is not efficient, but it is the only way to get users from a group by name
|
900
|
+
// Supports both repository-scoped and project-scoped groups following the BitBucket server logic described here:
|
901
|
+
// https://confluence.atlassian.com/bitbucketserver/code-owners-1296171116.html#Codeowners-Whatifaprojectandrepositorycontainareviewergroupwiththesamename?
|
902
|
+
async function getUsersFromReviewerGroup(groupName) {
|
903
|
+
const allGroups = [];
|
904
|
+
try {
|
905
|
+
const reviewerGroups = await bitbucketServerHttp.getJson(`./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/settings/reviewer-groups`, { paginate: true }, schema_1.ReviewerGroups);
|
906
|
+
allGroups.push(...reviewerGroups.body);
|
907
|
+
}
|
908
|
+
catch (err) {
|
909
|
+
logger_1.logger.debug({ err, groupName }, 'Failed to get reviewer groups for repo');
|
910
|
+
return [];
|
911
|
+
}
|
912
|
+
// First, try to find a repo-scoped group with this name
|
913
|
+
const repoGroup = allGroups.find((group) => group.name === groupName && group.scope?.type === 'REPOSITORY');
|
914
|
+
if (repoGroup) {
|
915
|
+
return repoGroup.users
|
916
|
+
.filter((user) => user.active)
|
917
|
+
.map((user) => user.emailAddress);
|
918
|
+
}
|
919
|
+
// If no repo-level group, fall back to project-level group
|
920
|
+
const projectGroup = allGroups.find((group) => group.name === groupName && group.scope?.type === 'PROJECT');
|
921
|
+
if (projectGroup) {
|
922
|
+
return projectGroup.users
|
923
|
+
.filter((user) => user.active)
|
924
|
+
.map((user) => user.emailAddress);
|
925
|
+
}
|
926
|
+
// Group not found at either level
|
927
|
+
logger_1.logger.warn({ groupName }, 'Reviewer group not found at repo or project level');
|
928
|
+
return [];
|
929
|
+
}
|
848
930
|
function massageMarkdown(input) {
|
849
931
|
logger_1.logger.debug(`massageMarkdown(${input.split(regex_1.newlineRegex)[0]})`);
|
850
932
|
// Remove any HTML we use
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/platform/bitbucket-server/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout } from 'timers/promises';\nimport semver from 'semver';\nimport type { PartialDeep } from 'type-fest';\nimport {\n REPOSITORY_CHANGED,\n REPOSITORY_EMPTY,\n REPOSITORY_NOT_FOUND,\n} from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport type { BranchStatus } from '../../../types';\nimport type { FileData } from '../../../types/platform/bitbucket-server';\nimport { parseJson } from '../../../util/common';\nimport { getEnv } from '../../../util/env';\nimport * as git from '../../../util/git';\nimport { deleteBranch } from '../../../util/git';\nimport * as hostRules from '../../../util/host-rules';\nimport {\n BitbucketServerHttp,\n type BitbucketServerHttpOptions,\n setBaseUrl,\n} from '../../../util/http/bitbucket-server';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider';\nimport type { HttpOptions, HttpResponse } from '../../../util/http/types';\nimport { newlineRegex, regEx } from '../../../util/regex';\nimport { sanitize } from '../../../util/sanitize';\nimport { ensureTrailingSlash, getQueryString } from '../../../util/url';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n EnsureIssueResult,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types';\nimport { getNewBranchName, repoFingerprint } from '../util';\nimport { smartTruncate } from '../utils/pr-body';\nimport { BbsPrCache } from './pr-cache';\nimport type {\n Comment,\n PullRequestActivity,\n PullRequestCommentActivity,\n} from './schema';\nimport { UserSchema, UsersSchema, isEmail } from './schema';\nimport type {\n BbsConfig,\n BbsPr,\n BbsRestBranch,\n BbsRestPr,\n BbsRestRepo,\n BbsRestUserRef,\n} from './types';\nimport * as utils from './utils';\nimport { getExtraCloneOpts } from './utils';\n\n/*\n * Version: 5.3 (EOL Date: 15 Aug 2019)\n * See following docs for api information:\n * https://docs.atlassian.com/bitbucket-server/rest/5.3.0/bitbucket-rest.html\n * https://docs.atlassian.com/bitbucket-server/rest/5.3.0/bitbucket-build-rest.html\n *\n * See following page for uptodate supported versions\n * https://confluence.atlassian.com/support/atlassian-support-end-of-life-policy-201851003.html#AtlassianSupportEndofLifePolicy-BitbucketServer\n */\n\nexport const id = 'bitbucket-server';\n\nlet config: BbsConfig = {} as any;\n\nconst bitbucketServerHttp = new BitbucketServerHttp();\n\nconst defaults: {\n endpoint?: string;\n hostType: string;\n version: string;\n} = {\n hostType: 'bitbucket-server',\n version: '0.0.0',\n};\n\n/* v8 ignore start */\nfunction updatePrVersion(pr: number, version: number): number {\n const res = Math.max(config.prVersions.get(pr) ?? 0, version);\n config.prVersions.set(pr, res);\n return res;\n} /* v8 ignore stop */\n\nexport async function initPlatform({\n endpoint,\n token,\n username,\n password,\n gitAuthor,\n}: PlatformParams): Promise<PlatformResult> {\n if (!endpoint) {\n throw new Error('Init: You must configure a Bitbucket Server endpoint');\n }\n if (!(username && password) && !token) {\n throw new Error(\n 'Init: You must either configure a Bitbucket Server username/password or a HTTP access token',\n );\n } else if (password && token) {\n throw new Error(\n 'Init: You must configure either a Bitbucket Server password or a HTTP access token, not both',\n );\n }\n // TODO: Add a connection check that endpoint/username/password combination are valid (#9595)\n defaults.endpoint = ensureTrailingSlash(endpoint);\n setBaseUrl(defaults.endpoint);\n const platformConfig: PlatformResult = {\n endpoint: defaults.endpoint,\n };\n try {\n let bitbucketServerVersion: string;\n const env = getEnv();\n /* v8 ignore start: experimental feature */\n if (env.RENOVATE_X_PLATFORM_VERSION) {\n bitbucketServerVersion = env.RENOVATE_X_PLATFORM_VERSION;\n } /* v8 ignore stop */ else {\n const { version } = (\n await bitbucketServerHttp.getJsonUnchecked<{ version: string }>(\n `./rest/api/1.0/application-properties`,\n )\n ).body;\n bitbucketServerVersion = version;\n logger.debug('Bitbucket Server version is: ' + bitbucketServerVersion);\n }\n\n if (semver.valid(bitbucketServerVersion)) {\n defaults.version = bitbucketServerVersion;\n }\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with Bitbucket. Check that your token includes \"api\" permissions',\n );\n }\n\n if (!gitAuthor && username) {\n logger.debug(`Attempting to confirm gitAuthor from username`);\n const options: HttpOptions = {\n memCache: false,\n };\n\n if (token) {\n options.token = token;\n } else {\n options.username = username;\n options.password = password;\n }\n\n try {\n const { displayName, emailAddress } = (\n await bitbucketServerHttp.getJson(\n `./rest/api/1.0/users/${username}`,\n options,\n UserSchema,\n )\n ).body;\n\n if (!emailAddress.length) {\n throw new Error(`No email address configured for username ${username}`);\n }\n\n platformConfig.gitAuthor = `${displayName} <${emailAddress}>`;\n\n logger.debug(`Detected gitAuthor: ${platformConfig.gitAuthor}`);\n } catch (err) {\n logger.debug(\n { err },\n 'Failed to get user info, fallback gitAuthor will be used',\n );\n }\n }\n\n return platformConfig;\n}\n\n// Get all repositories that the user has access to\nexport async function getRepos(): Promise<string[]> {\n logger.debug('Autodiscovering Bitbucket Server repositories');\n try {\n const repos = (\n await bitbucketServerHttp.getJsonUnchecked<BbsRestRepo[]>(\n `./rest/api/1.0/repos?permission=REPO_WRITE&state=AVAILABLE`,\n { paginate: true },\n )\n ).body;\n\n const result = repos.map((repo) => `${repo.project.key}/${repo.slug}`);\n logger.debug({ result }, 'result of getRepos()');\n return result;\n } catch (err) /* v8 ignore start */ {\n logger.error({ err }, `bitbucket getRepos error`);\n throw err;\n } /* v8 ignore stop */\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const repo = repoName ?? config.repository;\n const [project, slug] = repo.split('/');\n const fileUrl =\n `./rest/api/1.0/projects/${project}/repos/${slug}/browse/${fileName}?limit=20000` +\n (branchOrTag ? '&at=' + branchOrTag : '');\n const res = await bitbucketServerHttp.getJsonUnchecked<FileData>(fileUrl);\n const { isLastPage, lines, size } = res.body;\n if (isLastPage) {\n return lines.map(({ text }) => text).join('\\n');\n }\n logger.warn({ size }, 'The file is too big');\n throw new Error(`The file is too big (${size}B)`);\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n // TODO #22198\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\n// Initialize Bitbucket Server by getting base branch\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n ignorePrAuthor,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(\"${JSON.stringify({ repository }, null, 2)}\")`);\n const opts = hostRules.find({\n hostType: defaults.hostType,\n url: defaults.endpoint,\n });\n\n const [projectKey, repositorySlug] = repository.split('/');\n\n config = {\n projectKey,\n repositorySlug,\n repository,\n prVersions: new Map<number, number>(),\n username: opts.username,\n ignorePrAuthor,\n } as any;\n\n try {\n const info = (\n await bitbucketServerHttp.getJsonUnchecked<BbsRestRepo>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}`,\n )\n ).body;\n config.owner = info.project.key;\n logger.debug(`${repository} owner = ${config.owner}`);\n const branchRes = await bitbucketServerHttp.getJsonUnchecked<BbsRestBranch>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/branches/default`,\n );\n\n // 204 means empty, 404 means repo not found or missing default branch. repo must exist here.\n if ([204, 404].includes(branchRes.statusCode)) {\n throw new Error(REPOSITORY_EMPTY);\n }\n\n const url = utils.getRepoGitUrl(\n config.repositorySlug,\n // TODO #22198\n defaults.endpoint!,\n gitUrl,\n info,\n opts,\n );\n\n await git.initRepo({\n ...config,\n url,\n extraCloneOpts: getExtraCloneOpts(opts),\n cloneSubmodules,\n cloneSubmodulesFilter,\n fullClone: semver.lte(defaults.version, '8.0.0'),\n });\n\n config.mergeMethod = 'merge';\n const repoConfig: RepoResult = {\n defaultBranch: branchRes.body.displayId,\n isFork: !!info.origin,\n repoFingerprint: repoFingerprint(info.id, defaults.endpoint),\n };\n\n return repoConfig;\n } catch (err) /* v8 ignore start */ {\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n\n logger.debug({ err }, 'Unknown Bitbucket initRepo error');\n throw err;\n } /* v8 ignore stop */\n}\n\nexport async function getBranchForceRebase(\n _branchName: string,\n): Promise<boolean> {\n // https://docs.atlassian.com/bitbucket-server/rest/7.0.1/bitbucket-rest.html#idp342\n const res = await bitbucketServerHttp.getJsonUnchecked<{\n mergeConfig: { defaultStrategy: { id: string } };\n }>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/settings/pull-requests`,\n );\n\n // If the default merge strategy contains `ff-only` the PR can only be merged\n // if it is up to date with the base branch.\n // The current options for id are:\n // no-ff, ff, ff-only, rebase-no-ff, rebase-ff-only, squash, squash-ff-only\n return Boolean(\n res.body?.mergeConfig?.defaultStrategy?.id.includes('ff-only'),\n );\n}\n\n// Gets details for a PR\nexport async function getPr(\n prNo: number,\n refreshCache?: boolean,\n): Promise<BbsPr | null> {\n logger.debug(`getPr(${prNo})`);\n if (!prNo) {\n return null;\n }\n\n // Disables memCache (which is enabled by default) to be replaced by\n // memCacheProvider.\n const opts: HttpOptions = { memCache: false };\n // TODO: should refresh the cache rather than just ignore it\n if (!refreshCache) {\n opts.cacheProvider = memCacheProvider;\n }\n\n const res = await bitbucketServerHttp.getJsonUnchecked<BbsRestPr>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}`,\n opts,\n );\n\n const pr: BbsPr = {\n ...utils.prInfo(res.body),\n reviewers: res.body.reviewers.map((r) => r.user.name),\n };\n // TODO #22198\n pr.version = updatePrVersion(pr.number, pr.version!);\n\n return pr;\n}\n\n// TODO: coverage (#9624)\n/* v8 ignore start */\nfunction matchesState(state: string, desiredState: string): boolean {\n if (desiredState === 'all') {\n return true;\n }\n if (desiredState.startsWith('!')) {\n return state !== desiredState.substring(1);\n }\n return state === desiredState;\n} /* v8 ignore stop */\n\n// TODO: coverage (#9624)\n/* v8 ignore start */\nfunction isRelevantPr(\n branchName: string,\n prTitle: string | null | undefined,\n state: string,\n) {\n return (p: Pr): boolean =>\n p.sourceBranch === branchName &&\n (!prTitle || p.title.toUpperCase() === prTitle.toUpperCase()) &&\n matchesState(p.state, state);\n} /* v8 ignore stop */\n\n// TODO: coverage (#9624)\nexport async function getPrList(): Promise<Pr[]> {\n logger.debug(`getPrList()`);\n return await BbsPrCache.getPrs(\n bitbucketServerHttp,\n config.projectKey,\n config.repositorySlug,\n config.ignorePrAuthor,\n config.username,\n );\n}\n\n// TODO: coverage (#9624)\n/* v8 ignore start */\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n includeOtherAuthors,\n}: FindPRConfig): Promise<Pr | null> {\n logger.debug(`findPr(${branchName}, \"${prTitle!}\", \"${state}\")`);\n\n if (includeOtherAuthors) {\n // PR might have been created by anyone, so don't use the cached Renovate PR list\n const searchParams: Record<string, string> = {\n state: 'OPEN',\n };\n searchParams.direction = 'outgoing';\n searchParams.at = `refs/heads/${branchName}`;\n\n const query = getQueryString(searchParams);\n const prs = (\n await bitbucketServerHttp.getJsonUnchecked<BbsRestPr[]>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests?${query}`,\n {\n paginate: true,\n limit: 1, // only fetch the latest pr\n },\n )\n ).body;\n\n if (!prs.length) {\n logger.debug(`No PR found for branch ${branchName}`);\n return null;\n }\n\n return utils.prInfo(prs[0]);\n }\n\n const prList = await getPrList();\n const pr = prList.find(isRelevantPr(branchName, prTitle, state));\n if (pr) {\n logger.debug(`Found PR #${pr.number}`);\n } else {\n logger.debug(`Renovate did not find a PR for branch #${branchName}`);\n }\n return pr ?? null;\n} /* v8 ignore stop */\n\n// Returns the Pull Request for a branch. Null if not exists.\nexport async function getBranchPr(branchName: string): Promise<BbsPr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const existingPr = await findPr({\n branchName,\n state: 'open',\n });\n return existingPr ? getPr(existingPr.number) : null;\n}\n\n/* v8 ignore start */\nexport async function refreshPr(number: number): Promise<void> {\n // wait for pr change propagation\n await setTimeout(1000);\n // refresh cache\n await getPr(number, true);\n} /* v8 ignore stop */\n\nasync function getStatus(\n branchName: string,\n memCache = true,\n): Promise<utils.BitbucketCommitStatus> {\n const branchCommit = git.getBranchCommit(branchName);\n\n /* v8 ignore start: temporary code */\n const opts: HttpOptions = memCache\n ? { cacheProvider: memCacheProvider }\n : { memCache: false };\n /* v8 ignore stop */\n\n return (\n await bitbucketServerHttp.getJsonUnchecked<utils.BitbucketCommitStatus>(\n // TODO: types (#22198)\n `./rest/build-status/1.0/commits/stats/${branchCommit!}`,\n opts,\n )\n ).body;\n}\n\n// Returns the combined status for a branch.\n// umbrella for status checks\n// https://docs.atlassian.com/bitbucket-server/rest/6.0.0/bitbucket-build-rest.html#idp2\nexport async function getBranchStatus(\n branchName: string,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n\n if (!git.branchExists(branchName)) {\n logger.debug('Branch does not exist - cannot fetch status');\n throw new Error(REPOSITORY_CHANGED);\n }\n\n try {\n const commitStatus = await getStatus(branchName);\n\n logger.debug({ commitStatus }, 'branch status check result');\n\n if (commitStatus.failed > 0) {\n return 'red';\n }\n if (commitStatus.inProgress > 0) {\n return 'yellow';\n }\n return commitStatus.successful > 0 ? 'green' : 'yellow';\n } catch (err) {\n logger.warn({ err }, `Failed to get branch status`);\n return 'red';\n }\n}\n\nasync function getStatusCheck(\n branchName: string,\n memCache = true,\n): Promise<utils.BitbucketStatus[]> {\n const branchCommit = git.getBranchCommit(branchName);\n\n const opts: BitbucketServerHttpOptions = { paginate: true };\n /* v8 ignore start: temporary code */\n if (memCache) {\n opts.cacheProvider = memCacheProvider;\n } else {\n opts.memCache = false;\n }\n /* v8 ignore stop */\n\n return (\n await bitbucketServerHttp.getJsonUnchecked<utils.BitbucketStatus[]>(\n `./rest/build-status/1.0/commits/${branchCommit!}`,\n opts,\n )\n ).body;\n}\n\n// https://docs.atlassian.com/bitbucket-server/rest/6.0.0/bitbucket-build-rest.html#idp2\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n logger.debug(`getBranchStatusCheck(${branchName}, context=${context})`);\n\n try {\n const states = await getStatusCheck(branchName);\n\n for (const state of states) {\n if (state.key === context) {\n switch (state.state) {\n case 'SUCCESSFUL':\n return 'green';\n case 'INPROGRESS':\n return 'yellow';\n case 'FAILED':\n default:\n return 'red';\n }\n }\n }\n } catch (err) {\n logger.warn({ err }, `Failed to check branch status`);\n }\n return null;\n}\n\nexport async function setBranchStatus({\n branchName,\n context,\n description,\n state,\n url: targetUrl,\n}: BranchStatusConfig): Promise<void> {\n logger.debug(`setBranchStatus(${branchName})`);\n\n const existingStatus = await getBranchStatusCheck(branchName, context);\n if (existingStatus === state) {\n return;\n }\n logger.debug({ branch: branchName, context, state }, 'Setting branch status');\n\n const branchCommit = git.getBranchCommit(branchName);\n\n try {\n const body: any = {\n key: context,\n description,\n url: targetUrl ?? 'https://renovatebot.com',\n };\n\n switch (state) {\n case 'green':\n body.state = 'SUCCESSFUL';\n break;\n case 'yellow':\n body.state = 'INPROGRESS';\n break;\n case 'red':\n default:\n body.state = 'FAILED';\n break;\n }\n\n await bitbucketServerHttp.postJson(\n // TODO: types (#22198)\n `./rest/build-status/1.0/commits/${branchCommit!}`,\n { body },\n );\n\n // update status cache\n await getStatus(branchName, false);\n await getStatusCheck(branchName, false);\n } catch (err) {\n logger.warn({ err }, `Failed to set branch status`);\n }\n}\n\n// Issue\n\n/* v8 ignore start */\nexport function findIssue(title: string): Promise<Issue | null> {\n logger.debug(`findIssue(${title})`);\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve(null);\n} /* v8 ignore stop */\n\n/* v8 ignore start */\nexport function ensureIssue({\n title,\n}: EnsureIssueConfig): Promise<EnsureIssueResult | null> {\n logger.warn({ title }, 'Cannot ensure issue');\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve(null);\n} /* v8 ignore stop */\n\n/* v8 ignore start */\nexport function getIssueList(): Promise<Issue[]> {\n logger.debug(`getIssueList()`);\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve([]);\n} /* v8 ignore stop */\n\n/* v8 ignore start */\nexport function ensureIssueClosing(title: string): Promise<void> {\n logger.debug(`ensureIssueClosing(${title})`);\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve();\n} /* v8 ignore stop */\n\nexport function addAssignees(iid: number, assignees: string[]): Promise<void> {\n logger.debug(`addAssignees(${iid}, [${assignees.join(', ')}])`);\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve();\n}\n\nexport async function addReviewers(\n prNo: number,\n reviewers: string[],\n): Promise<void> {\n logger.debug(`Adding reviewers '${reviewers.join(', ')}' to #${prNo}`);\n\n const reviewerSlugs = new Set<string>();\n\n for (const entry of reviewers) {\n // If entry is an email-address, resolve userslugs\n if (isEmail(entry)) {\n const slugs = await getUserSlugsByEmail(entry);\n for (const slug of slugs) {\n reviewerSlugs.add(slug);\n }\n } else {\n reviewerSlugs.add(entry);\n }\n }\n\n await retry(updatePRAndAddReviewers, [prNo, Array.from(reviewerSlugs)], 3, [\n REPOSITORY_CHANGED,\n ]);\n}\n\n/**\n * Resolves Bitbucket users by email address,\n * restricted to users who have REPO_READ permission on the target repository.\n *\n * @param emailAddress - A string that could be the user's email-address.\n * @returns List of user slugs for active, matched users.\n */\nexport async function getUserSlugsByEmail(\n emailAddress: string,\n): Promise<string[]> {\n try {\n const filterUrl =\n `./rest/api/1.0/users?filter=${emailAddress}` +\n `&permission.1=REPO_READ` +\n `&permission.1.projectKey=${config.projectKey}` +\n `&permission.1.repositorySlug=${config.repositorySlug}`;\n\n const users = await bitbucketServerHttp.getJson(\n filterUrl,\n { limit: 100 },\n UsersSchema,\n );\n\n if (users.body.length) {\n return users.body\n .filter((u) => u.active && u.emailAddress === emailAddress)\n .map((u) => u.slug);\n }\n } catch (err) {\n logger.warn(\n { err, emailAddress },\n `Failed to resolve email address to user slug`,\n );\n throw err;\n }\n logger.debug({ userinfo: emailAddress }, 'No users found for email-address');\n return [];\n}\n\nasync function updatePRAndAddReviewers(\n prNo: number,\n reviewers: string[],\n): Promise<void> {\n try {\n const pr = await getPr(prNo);\n if (!pr) {\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n\n // TODO: can `reviewers` be undefined? (#22198)\n const reviewersSet = new Set([...pr.reviewers!, ...reviewers]);\n\n await bitbucketServerHttp.putJson(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}`,\n {\n body: {\n title: pr.title,\n version: pr.version,\n reviewers: Array.from(reviewersSet).map((name) => ({\n user: { name },\n })),\n },\n },\n );\n await getPr(prNo, true);\n } catch (err) {\n logger.warn({ err, reviewers, prNo }, `Failed to add reviewers`);\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n } else if (err.statusCode === 409) {\n if (utils.isInvalidReviewersResponse(err)) {\n // Retry again with invalid reviewers being removed\n const invalidReviewers = utils.getInvalidReviewers(err);\n const filteredReviewers = reviewers.filter(\n (name) => !invalidReviewers.includes(name),\n );\n await updatePRAndAddReviewers(prNo, filteredReviewers);\n } else {\n logger.debug(\n '409 response to adding reviewers - has repository changed?',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n } else {\n throw err;\n }\n }\n}\n\nasync function retry<T extends (...arg0: any[]) => Promise<any>>(\n fn: T,\n args: Parameters<T>,\n maxTries: number,\n retryErrorMessages: string[],\n): Promise<Awaited<ReturnType<T>>> {\n const maxAttempts = Math.max(maxTries, 1);\n let lastError: Error | undefined;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn(...args);\n } catch (e) {\n lastError = e;\n if (\n retryErrorMessages.length !== 0 &&\n !retryErrorMessages.includes(e.message)\n ) {\n logger.debug(`Error not marked for retry`);\n throw e;\n }\n }\n }\n\n logger.debug(`All ${maxAttempts} retry attempts exhausted`);\n // Can't be `undefined` here.\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw lastError;\n}\n\nexport function deleteLabel(issueNo: number, label: string): Promise<void> {\n logger.debug(`deleteLabel(${issueNo}, ${label})`);\n // Only used for the \"request Renovate to rebase a PR using a label\" feature\n //\n // Bitbucket Server does not have issues\n return Promise.resolve();\n}\n\nasync function getComments(prNo: number): Promise<Comment[]> {\n // GET /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/activities\n const activities = (\n await bitbucketServerHttp.getJsonUnchecked<PullRequestActivity[]>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/activities`,\n { paginate: true },\n )\n ).body;\n\n const comments = activities\n .filter(\n (a): a is PullRequestCommentActivity =>\n a.action === 'COMMENTED' && 'comment' in a && 'commentAction' in a,\n )\n .filter((a) => a.commentAction === 'ADDED')\n .map((a) => a.comment);\n\n logger.debug(`Found ${comments.length} comments`);\n\n return comments;\n}\n\nasync function addComment(prNo: number, text: string): Promise<void> {\n // POST /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments\n await bitbucketServerHttp.postJson(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/comments`,\n {\n body: { text },\n },\n );\n}\n\nasync function getCommentVersion(\n prNo: number,\n commentId: number,\n): Promise<number> {\n // GET /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}\n const { version } = (\n await bitbucketServerHttp.getJsonUnchecked<{ version: number }>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/comments/${commentId}`,\n )\n ).body;\n\n return version;\n}\n\nasync function editComment(\n prNo: number,\n commentId: number,\n text: string,\n): Promise<void> {\n const version = await getCommentVersion(prNo, commentId);\n\n // PUT /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}\n await bitbucketServerHttp.putJson(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/comments/${commentId}`,\n {\n body: { text, version },\n },\n );\n}\n\nasync function deleteComment(prNo: number, commentId: number): Promise<void> {\n const version = await getCommentVersion(prNo, commentId);\n\n // DELETE /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}\n await bitbucketServerHttp.deleteJson(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/comments/${commentId}?version=${version}`,\n );\n}\n\nexport async function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n const sanitizedContent = sanitize(content);\n try {\n const comments = await getComments(number);\n let body: string;\n let commentId: number | undefined;\n let commentNeedsUpdating: boolean | undefined;\n if (topic) {\n logger.debug(`Ensuring comment \"${topic}\" in #${number}`);\n body = `### ${topic}\\n\\n${sanitizedContent}`;\n comments.forEach((comment) => {\n if (comment.text.startsWith(`### ${topic}\\n\\n`)) {\n commentId = comment.id;\n commentNeedsUpdating = comment.text !== body;\n }\n });\n } else {\n logger.debug(`Ensuring content-only comment in #${number}`);\n body = `${sanitizedContent}`;\n comments.forEach((comment) => {\n if (comment.text === body) {\n commentId = comment.id;\n commentNeedsUpdating = false;\n }\n });\n }\n if (!commentId) {\n await addComment(number, body);\n logger.info(\n { repository: config.repository, prNo: number, topic },\n 'Comment added',\n );\n } else if (commentNeedsUpdating) {\n await editComment(number, commentId, body);\n logger.debug(\n { repository: config.repository, prNo: number },\n 'Comment updated',\n );\n } else {\n logger.debug('Comment is already update-to-date');\n }\n return true;\n } catch (err) /* v8 ignore start */ {\n logger.warn({ err }, 'Error ensuring comment');\n return false;\n } /* v8 ignore stop */\n}\n\nexport async function ensureCommentRemoval(\n deleteConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n try {\n const { number: prNo } = deleteConfig;\n const key =\n deleteConfig.type === 'by-topic'\n ? deleteConfig.topic\n : deleteConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${prNo} is removed`);\n const comments = await getComments(prNo);\n\n let commentId: number | null | undefined = null;\n if (deleteConfig.type === 'by-topic') {\n const byTopic = (comment: Comment): boolean =>\n comment.text.startsWith(`### ${deleteConfig.topic}\\n\\n`);\n commentId = comments.find(byTopic)?.id;\n } else if (deleteConfig.type === 'by-content') {\n const byContent = (comment: Comment): boolean =>\n comment.text.trim() === deleteConfig.content;\n commentId = comments.find(byContent)?.id;\n }\n\n if (commentId) {\n await deleteComment(prNo, commentId);\n }\n } catch (err) /* v8 ignore start */ {\n logger.warn({ err }, 'Error ensuring comment removal');\n } /* v8 ignore stop */\n}\n\n// Pull Request\n\nconst escapeHash = (input: string): string =>\n input?.replace(regEx(/#/g), '%23');\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle: title,\n prBody: rawDescription,\n platformPrOptions,\n}: CreatePRConfig): Promise<Pr> {\n const description = sanitize(rawDescription);\n logger.debug(`createPr(${sourceBranch}, title=${title})`);\n const base = targetBranch;\n let reviewers: BbsRestUserRef[] = [];\n\n if (platformPrOptions?.bbUseDefaultReviewers) {\n logger.debug(`fetching default reviewers`);\n const { id } = (\n await bitbucketServerHttp.getJsonUnchecked<{ id: number }>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}`,\n )\n ).body;\n\n const defReviewers = (\n await bitbucketServerHttp.getJsonUnchecked<{ name: string }[]>(\n `./rest/default-reviewers/1.0/projects/${config.projectKey}/repos/${\n config.repositorySlug\n }/reviewers?sourceRefId=refs/heads/${escapeHash(\n sourceBranch,\n )}&targetRefId=refs/heads/${base}&sourceRepoId=${id}&targetRepoId=${id}`,\n )\n ).body;\n\n reviewers = defReviewers.map((u) => ({\n user: { name: u.name },\n }));\n }\n\n const body: PartialDeep<BbsRestPr> = {\n title,\n description,\n fromRef: {\n id: `refs/heads/${sourceBranch}`,\n },\n toRef: {\n id: `refs/heads/${base}`,\n },\n reviewers,\n };\n let prInfoRes: HttpResponse<BbsRestPr>;\n try {\n prInfoRes = await bitbucketServerHttp.postJson<BbsRestPr>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests`,\n { body },\n );\n } catch (err) /* v8 ignore start */ {\n if (\n err.body?.errors?.[0]?.exceptionName ===\n 'com.atlassian.bitbucket.pull.EmptyPullRequestException'\n ) {\n logger.debug(\n 'Empty pull request - deleting branch so it can be recreated next run',\n );\n await deleteBranch(sourceBranch);\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n } /* v8 ignore stop */\n\n const pr: BbsPr = {\n ...utils.prInfo(prInfoRes.body),\n };\n\n // TODO #22198\n updatePrVersion(pr.number, pr.version!);\n await BbsPrCache.setPr(\n bitbucketServerHttp,\n config.projectKey,\n config.repositorySlug,\n config.ignorePrAuthor,\n config.username,\n pr,\n );\n\n return pr;\n}\n\nexport async function updatePr({\n number: prNo,\n prTitle: title,\n prBody: rawDescription,\n state,\n bitbucketInvalidReviewers,\n targetBranch,\n}: UpdatePrConfig & {\n bitbucketInvalidReviewers?: string[] | undefined;\n}): Promise<void> {\n const description = sanitize(rawDescription);\n logger.debug(`updatePr(${prNo}, title=${title})`);\n\n try {\n const pr = await getPr(prNo);\n if (!pr) {\n throw Object.assign(new Error(REPOSITORY_NOT_FOUND), { statusCode: 404 });\n }\n\n const body: any = {\n title,\n description,\n version: pr.version,\n reviewers: pr.reviewers\n ?.filter((name: string) => !bitbucketInvalidReviewers?.includes(name))\n .map((name: string) => ({ user: { name } })),\n };\n if (targetBranch) {\n body.toRef = {\n id: getNewBranchName(targetBranch),\n };\n }\n\n const { body: updatedPr } = await bitbucketServerHttp.putJson<\n BbsRestPr & {\n version: number;\n }\n >(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}`,\n { body },\n );\n\n updatePrVersion(prNo, updatedPr.version);\n\n const currentState = updatedPr.state;\n // TODO #22198\n const newState = {\n ['open']: 'OPEN',\n ['closed']: 'DECLINED',\n }[state!];\n\n let finalState: 'open' | 'closed' =\n currentState === 'OPEN' ? 'open' : 'closed';\n\n if (\n newState &&\n ['OPEN', 'DECLINED'].includes(currentState) &&\n currentState !== newState\n ) {\n const command = state === 'open' ? 'reopen' : 'decline';\n const { body: updatedStatePr } = await bitbucketServerHttp.postJson<{\n version: number;\n }>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${pr.number}/${command}?version=${updatedPr.version}`,\n );\n\n finalState = state!;\n\n updatePrVersion(pr.number, updatedStatePr.version);\n }\n\n const bbsPr = utils.prInfo(updatedPr);\n await BbsPrCache.setPr(\n bitbucketServerHttp,\n config.projectKey,\n config.repositorySlug,\n config.ignorePrAuthor,\n config.username,\n { ...bbsPr, state: finalState },\n );\n } catch (err) {\n logger.debug({ err, prNo }, `Failed to update PR`);\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n } else if (err.statusCode === 409) {\n if (utils.isInvalidReviewersResponse(err) && !bitbucketInvalidReviewers) {\n // Retry again with invalid reviewers being removed\n const invalidReviewers = utils.getInvalidReviewers(err);\n await updatePr({\n number: prNo,\n prTitle: title,\n prBody: rawDescription,\n state,\n bitbucketInvalidReviewers: invalidReviewers,\n });\n } else {\n throw new Error(REPOSITORY_CHANGED);\n }\n } else {\n throw err;\n }\n }\n}\n\n// https://docs.atlassian.com/bitbucket-server/rest/6.0.0/bitbucket-rest.html#idp261\nexport async function mergePr({\n branchName,\n id: prNo,\n}: MergePRConfig): Promise<boolean> {\n logger.debug(`mergePr(${prNo}, ${branchName!})`);\n // Used for \"automerge\" feature\n try {\n const pr = await getPr(prNo);\n if (!pr) {\n throw Object.assign(new Error(REPOSITORY_NOT_FOUND), { statusCode: 404 });\n }\n const { body } = await bitbucketServerHttp.postJson<{ version: number }>(\n // TODO: types (#22198)\n `./rest/api/1.0/projects/${config.projectKey}/repos/${\n config.repositorySlug\n }/pull-requests/${prNo}/merge?version=${pr.version!}`,\n );\n updatePrVersion(prNo, body.version);\n } catch (err) {\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n } else if (err.statusCode === 409) {\n logger.warn({ err }, `Failed to merge PR`);\n return false;\n } else {\n logger.warn({ err }, `Failed to merge PR`);\n return false;\n }\n }\n\n logger.debug(`PR merged, PrNo:${prNo}`);\n return true;\n}\n\nexport function massageMarkdown(input: string): string {\n logger.debug(`massageMarkdown(${input.split(newlineRegex)[0]})`);\n // Remove any HTML we use\n return smartTruncate(input, maxBodyLength())\n .replace(\n 'you tick the rebase/retry checkbox',\n 'PR is renamed to start with \"rebase!\"',\n )\n .replace(\n 'checking the rebase/retry box above',\n 'renaming the PR to start with \"rebase!\"',\n )\n .replace(regEx(/<\\/?summary>/g), '**')\n .replace(regEx(/<\\/?details>/g), '')\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?(\\n|$)`), '')\n .replace(regEx(/<!--.*?-->/gs), '');\n}\n\nexport function maxBodyLength(): number {\n return 30000;\n}\n"]}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/modules/platform/bitbucket-server/index.ts"],"names":[],"mappings":";;;AAkGA,oCAyFC;AAGD,4BAiBC;AAED,gCAiBC;AAED,kCAQC;AAGD,4BA8EC;AAED,oDAiBC;AAGD,sBA8BC;AA4BD,8BASC;AAID,wBA2CC;AAGD,kCAOC;AAGD,8BAKC;AA0BD,0CA0BC;AA0BD,oDA0BC;AAED,0CAiDC;AAKD,8BAQC;AAGD,kCAUC;AAGD,oCAQC;AAGD,gDAQC;AAED,oCAQC;AAED,oCAuBC;AASD,kDA8BC;AAiFD,kCAMC;AAyED,sCAkDC;AAED,oDA6BC;AAOD,4BAkFC;AAED,4BAsGC;AAGD,0BAgCC;AAED,gDAgCC;AAED,0EAqBC;AAsDD,0CAgBC;AAED,sCAEC;;AAp0CD,8CAA6C;AAC7C,4DAA4B;AAC5B,4DAA4B;AAE5B,sEAI2C;AAC3C,4CAAyC;AAGzC,iDAAiD;AACjD,2CAA2C;AAC3C,+DAAyC;AACzC,2CAAiD;AACjD,4EAAsD;AACtD,0EAI6C;AAC7C,oGAAuF;AAEvF,+CAA0D;AAC1D,iDAAkD;AAClD,qDAAkD;AAClD,2CAAwE;AAmBxE,kCAA4D;AAC5D,8CAAiD;AACjD,yCAAwC;AAMxC,qCAA4E;AAS5E,uDAAiC;AACjC,mCAA+E;AAE/E;;;;;;;;GAQG;AAEU,QAAA,EAAE,GAAG,kBAAkB,CAAC;AAErC,IAAI,MAAM,GAAc,EAAS,CAAC;AAElC,MAAM,mBAAmB,GAAG,IAAI,sCAAmB,EAAE,CAAC;AAEtD,MAAM,QAAQ,GAIV;IACF,QAAQ,EAAE,kBAAkB;IAC5B,OAAO,EAAE,OAAO;CACjB,CAAC;AAEF,qBAAqB;AACrB,SAAS,eAAe,CAAC,EAAU,EAAE,OAAe;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,oBAAoB;AAEf,KAAK,UAAU,YAAY,CAAC,EACjC,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,GACM;IACf,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;SAAM,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;IACJ,CAAC;IACD,6FAA6F;IAC7F,QAAQ,CAAC,QAAQ,GAAG,IAAA,yBAAmB,EAAC,QAAQ,CAAC,CAAC;IAClD,IAAA,6BAAU,EAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,cAAc,GAAmB;QACrC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;KAC5B,CAAC;IACF,IAAI,CAAC;QACH,IAAI,sBAA8B,CAAC;QACnC,MAAM,GAAG,GAAG,IAAA,YAAM,GAAE,CAAC;QACrB,2CAA2C;QAC3C,IAAI,GAAG,CAAC,2BAA2B,EAAE,CAAC;YACpC,sBAAsB,GAAG,GAAG,CAAC,2BAA2B,CAAC;QAC3D,CAAC,CAAC,oBAAoB;aAAM,CAAC;YAC3B,MAAM,EAAE,OAAO,EAAE,GAAG,CAClB,MAAM,mBAAmB,CAAC,gBAAgB,CACxC,uCAAuC,CACxC,CACF,CAAC,IAAI,CAAC;YACP,sBAAsB,GAAG,OAAO,CAAC;YACjC,eAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,sBAAsB,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,gBAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,OAAO,GAAG,sBAAsB,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,EACP,uFAAuF,CACxF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;QAC3B,eAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAgB;YAC3B,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC5B,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,CACpC,MAAM,mBAAmB,CAAC,OAAO,CAC/B,wBAAwB,QAAQ,EAAE,EAClC,OAAO,EACP,mBAAU,CACX,CACF,CAAC,IAAI,CAAC;YAEP,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,cAAc,CAAC,SAAS,GAAG,GAAG,WAAW,KAAK,YAAY,GAAG,CAAC;YAE9D,eAAM,CAAC,KAAK,CAAC,uBAAuB,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,EACP,0DAA0D,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,mDAAmD;AAC5C,KAAK,UAAU,QAAQ;IAC5B,eAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CACZ,MAAM,mBAAmB,CAAC,gBAAgB,CACxC,4DAA4D,EAC5D,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CACF,CAAC,IAAI,CAAC;QAEP,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,eAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACnC,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;QAClD,MAAM,GAAG,CAAC;IACZ,CAAC,CAAC,oBAAoB;AACxB,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,QAAiB,EACjB,WAAoB;IAEpB,MAAM,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC;IAC3C,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GACX,2BAA2B,OAAO,UAAU,IAAI,WAAW,QAAQ,cAAc;QACjF,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,CAAW,OAAO,CAAC,CAAC;IAC1E,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;IAC7C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,eAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,qBAAqB,CAAC,CAAC;IAC7C,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,IAAI,CAAC,CAAC;AACpD,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,QAAiB,EACjB,WAAoB;IAEpB,cAAc;IACd,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9D,OAAO,IAAA,kBAAS,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,qDAAqD;AAC9C,KAAK,UAAU,QAAQ,CAAC,EAC7B,UAAU,EACV,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,MAAM,GACK;IACX,eAAM,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,GAAG,EAAE,QAAQ,CAAC,QAAQ;KACvB,CAAC,CAAC;IAEH,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3D,MAAM,GAAG;QACP,UAAU;QACV,cAAc;QACd,UAAU;QACV,UAAU,EAAE,IAAI,GAAG,EAAkB;QACrC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,cAAc;KACR,CAAC;IAET,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CACX,MAAM,mBAAmB,CAAC,gBAAgB,CACxC,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,EAAE,CAC9E,CACF,CAAC,IAAI,CAAC;QACP,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAChC,eAAM,CAAC,KAAK,CAAC,GAAG,UAAU,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,CAC1D,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,mBAAmB,CAC/F,CAAC;QAEF,6FAA6F;QAC7F,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,iCAAgB,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAC7B,MAAM,CAAC,cAAc;QACrB,cAAc;QACd,QAAQ,CAAC,QAAS,EAClB,MAAM,EACN,IAAI,EACJ,IAAI,CACL,CAAC;QAEF,MAAM,GAAG,CAAC,QAAQ,CAAC;YACjB,GAAG,MAAM;YACT,GAAG;YACH,cAAc,EAAE,IAAA,yBAAiB,EAAC,IAAI,CAAC;YACvC,eAAe;YACf,qBAAqB;YACrB,SAAS,EAAE,gBAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;SACjD,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC;QAC7B,MAAM,UAAU,GAAe;YAC7B,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS;YACvC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;YACrB,eAAe,EAAE,IAAA,sBAAe,EAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;SAC7D,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACnC,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAoB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,iCAAgB,EAAE,CAAC;YACrC,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAC;QAC1D,MAAM,GAAG,CAAC;IACZ,CAAC,CAAC,oBAAoB;AACxB,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,WAAmB;IAEnB,oFAAoF;IACpF,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,CAGpD,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,yBAAyB,CACrG,CAAC;IAEF,6EAA6E;IAC7E,4CAA4C;IAC5C,kCAAkC;IAClC,2EAA2E;IAC3E,OAAO,OAAO,CACZ,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,wBAAwB;AACjB,KAAK,UAAU,KAAK,CACzB,IAAY,EACZ,YAAsB;IAEtB,eAAM,CAAC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,oBAAoB;IACpB,MAAM,IAAI,GAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC9C,4DAA4D;IAC5D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,IAAI,CAAC,aAAa,GAAG,6CAAgB,CAAC;IACxC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,CACpD,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,IAAI,EAAE,EACnG,IAAI,CACL,CAAC;IAEF,MAAM,EAAE,GAAU;QAChB,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KACtD,CAAC;IACF,cAAc;IACd,EAAE,CAAC,OAAO,GAAG,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAQ,CAAC,CAAC;IAErD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,yBAAyB;AACzB,qBAAqB;AACrB,SAAS,YAAY,CAAC,KAAa,EAAE,YAAoB;IACvD,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,KAAK,YAAY,CAAC;AAChC,CAAC,CAAC,oBAAoB;AAEtB,yBAAyB;AACzB,qBAAqB;AACrB,SAAS,YAAY,CACnB,UAAkB,EAClB,OAAkC,EAClC,KAAa;IAEb,OAAO,CAAC,CAAK,EAAW,EAAE,CACxB,CAAC,CAAC,YAAY,KAAK,UAAU;QAC7B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QAC7D,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC,oBAAoB;AAEtB,yBAAyB;AAClB,KAAK,UAAU,SAAS;IAC7B,eAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5B,OAAO,MAAM,qBAAU,CAAC,MAAM,CAC5B,mBAAmB,EACnB,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,QAAQ,CAChB,CAAC;AACJ,CAAC;AAED,yBAAyB;AACzB,qBAAqB;AACd,KAAK,UAAU,MAAM,CAAC,EAC3B,UAAU,EACV,OAAO,EACP,KAAK,GAAG,KAAK,EACb,mBAAmB,GACN;IACb,eAAM,CAAC,KAAK,CAAC,UAAU,UAAU,MAAM,OAAQ,OAAO,KAAK,IAAI,CAAC,CAAC;IAEjE,IAAI,mBAAmB,EAAE,CAAC;QACxB,iFAAiF;QACjF,MAAM,YAAY,GAA2B;YAC3C,KAAK,EAAE,MAAM;SACd,CAAC;QACF,YAAY,CAAC,SAAS,GAAG,UAAU,CAAC;QACpC,YAAY,CAAC,EAAE,GAAG,cAAc,UAAU,EAAE,CAAC;QAE7C,MAAM,KAAK,GAAG,IAAA,oBAAc,EAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,CACV,MAAM,mBAAmB,CAAC,gBAAgB,CACxC,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,KAAK,EAAE,EACpG;YACE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC,EAAE,2BAA2B;SACtC,CACF,CACF,CAAC,IAAI,CAAC;QAEP,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,eAAM,CAAC,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACjE,IAAI,EAAE,EAAE,CAAC;QACP,eAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,KAAK,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,IAAI,IAAI,CAAC;AACpB,CAAC,CAAC,oBAAoB;AAEtB,6DAA6D;AACtD,KAAK,UAAU,WAAW,CAAC,UAAkB;IAClD,eAAM,CAAC,KAAK,CAAC,eAAe,UAAU,GAAG,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC;QAC9B,UAAU;QACV,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED,qBAAqB;AACd,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,iCAAiC;IACjC,MAAM,IAAA,qBAAU,EAAC,IAAI,CAAC,CAAC;IACvB,gBAAgB;IAChB,MAAM,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC,oBAAoB;AAEtB,KAAK,UAAU,SAAS,CACtB,UAAkB,EAClB,QAAQ,GAAG,IAAI;IAEf,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAErD,qCAAqC;IACrC,MAAM,IAAI,GAAgB,QAAQ;QAChC,CAAC,CAAC,EAAE,aAAa,EAAE,6CAAgB,EAAE;QACrC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACxB,oBAAoB;IAEpB,OAAO,CACL,MAAM,mBAAmB,CAAC,gBAAgB;IACxC,uBAAuB;IACvB,yCAAyC,YAAa,EAAE,EACxD,IAAI,CACL,CACF,CAAC,IAAI,CAAC;AACT,CAAC;AAED,4CAA4C;AAC5C,6BAA6B;AAC7B,wFAAwF;AACjF,KAAK,UAAU,eAAe,CACnC,UAAkB;IAElB,eAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,GAAG,CAAC,CAAC;IAE/C,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,eAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,mCAAkB,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;QAEjD,eAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,4BAA4B,CAAC,CAAC;QAE7D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,YAAY,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,6BAA6B,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,UAAkB,EAClB,QAAQ,GAAG,IAAI;IAEf,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAErD,MAAM,IAAI,GAA+B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5D,qCAAqC;IACrC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,GAAG,6CAAgB,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,oBAAoB;IAEpB,OAAO,CACL,MAAM,mBAAmB,CAAC,gBAAgB,CACxC,mCAAmC,YAAa,EAAE,EAClD,IAAI,CACL,CACF,CAAC,IAAI,CAAC;AACT,CAAC;AAED,wFAAwF;AACjF,KAAK,UAAU,oBAAoB,CACxC,UAAkB,EAClB,OAAe;IAEf,eAAM,CAAC,KAAK,CAAC,wBAAwB,UAAU,aAAa,OAAO,GAAG,CAAC,CAAC;IAExE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;QAEhD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBAC1B,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;oBACpB,KAAK,YAAY;wBACf,OAAO,OAAO,CAAC;oBACjB,KAAK,YAAY;wBACf,OAAO,QAAQ,CAAC;oBAClB,KAAK,QAAQ,CAAC;oBACd;wBACE,OAAO,KAAK,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,+BAA+B,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,EACpC,UAAU,EACV,OAAO,EACP,WAAW,EACX,KAAK,EACL,GAAG,EAAE,SAAS,GACK;IACnB,eAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,GAAG,CAAC,CAAC;IAE/C,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvE,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IACD,eAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAC;IAE9E,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,IAAI,GAAQ;YAChB,GAAG,EAAE,OAAO;YACZ,WAAW;YACX,GAAG,EAAE,SAAS,IAAI,yBAAyB;SAC5C,CAAC;QAEF,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC1B,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC1B,MAAM;YACR,KAAK,KAAK,CAAC;YACX;gBACE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,MAAM;QACV,CAAC;QAED,MAAM,mBAAmB,CAAC,QAAQ;QAChC,uBAAuB;QACvB,mCAAmC,YAAa,EAAE,EAClD,EAAE,IAAI,EAAE,CACT,CAAC;QAEF,sBAAsB;QACtB,MAAM,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACnC,MAAM,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,6BAA6B,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,QAAQ;AAER,qBAAqB;AACrB,SAAgB,SAAS,CAAC,KAAa;IACrC,eAAM,CAAC,KAAK,CAAC,aAAa,KAAK,GAAG,CAAC,CAAC;IACpC,yDAAyD;IACzD,wCAAwC;IACxC,uDAAuD;IACvD,EAAE;IACF,wCAAwC;IACxC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAC,oBAAoB;AAEtB,qBAAqB;AACrB,SAAgB,WAAW,CAAC,EAC1B,KAAK,GACa;IAClB,eAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAC;IAC9C,yDAAyD;IACzD,wCAAwC;IACxC,uDAAuD;IACvD,EAAE;IACF,wCAAwC;IACxC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAC,oBAAoB;AAEtB,qBAAqB;AACrB,SAAgB,YAAY;IAC1B,eAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/B,yDAAyD;IACzD,wCAAwC;IACxC,uDAAuD;IACvD,EAAE;IACF,wCAAwC;IACxC,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC7B,CAAC,CAAC,oBAAoB;AAEtB,qBAAqB;AACrB,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,eAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,GAAG,CAAC,CAAC;IAC7C,yDAAyD;IACzD,wCAAwC;IACxC,uDAAuD;IACvD,EAAE;IACF,wCAAwC;IACxC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC,CAAC,oBAAoB;AAEtB,SAAgB,YAAY,CAAC,GAAW,EAAE,SAAmB;IAC3D,eAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,yDAAyD;IACzD,wCAAwC;IACxC,uDAAuD;IACvD,EAAE;IACF,wCAAwC;IACxC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,SAAmB;IAEnB,eAAM,CAAC,KAAK,CAAC,qBAAqB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAEvE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,kDAAkD;QAClD,IAAI,IAAA,gBAAO,EAAC,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,KAAK,CAAC,uBAAuB,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE;QACzE,mCAAkB;KACnB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,mBAAmB,CACvC,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,SAAS,GACb,+BAA+B,YAAY,EAAE;YAC7C,yBAAyB;YACzB,4BAA4B,MAAM,CAAC,UAAU,EAAE;YAC/C,gCAAgC,MAAM,CAAC,cAAc,EAAE,CAAC;QAE1D,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAC7C,SAAS,EACT,EAAE,KAAK,EAAE,GAAG,EAAE,EACd,oBAAW,CACZ,CAAC;QAEF,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC,IAAI;iBACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC;iBAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,YAAY,EAAE,EACrB,8CAA8C,CAC/C,CAAC;QACF,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,eAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,kCAAkC,CAAC,CAAC;IAC7E,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,IAAY,EACZ,SAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,qCAAoB,CAAC,CAAC;QACxC,CAAC;QAED,+CAA+C;QAC/C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,SAAU,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;QAE/D,MAAM,mBAAmB,CAAC,OAAO,CAC/B,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,IAAI,EAAE,EACnG;YACE,IAAI,EAAE;gBACJ,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACjD,IAAI,EAAE,EAAE,IAAI,EAAE;iBACf,CAAC,CAAC;aACJ;SACF,CACF,CAAC;QACF,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,yBAAyB,CAAC,CAAC;QACjE,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAoB,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1C,mDAAmD;gBACnD,MAAM,gBAAgB,GAAG,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBACxD,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC3C,CAAC;gBACF,MAAM,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,eAAM,CAAC,KAAK,CACV,4DAA4D,CAC7D,CAAC;gBACF,MAAM,IAAI,KAAK,CAAC,mCAAkB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAClB,EAAK,EACL,IAAmB,EACnB,QAAgB,EAChB,kBAA4B;IAE5B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1C,IAAI,SAA4B,CAAC;IACjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,SAAS,GAAG,CAAC,CAAC;YACd,IACE,kBAAkB,CAAC,MAAM,KAAK,CAAC;gBAC/B,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EACvC,CAAC;gBACD,eAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAC3C,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAED,eAAM,CAAC,KAAK,CAAC,OAAO,WAAW,2BAA2B,CAAC,CAAC;IAC5D,6BAA6B;IAC7B,+DAA+D;IAC/D,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,SAAgB,WAAW,CAAC,OAAe,EAAE,KAAa;IACxD,eAAM,CAAC,KAAK,CAAC,eAAe,OAAO,KAAK,KAAK,GAAG,CAAC,CAAC;IAClD,4EAA4E;IAC5E,EAAE;IACF,wCAAwC;IACxC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,0GAA0G;IAC1G,MAAM,UAAU,GAAG,CACjB,MAAM,mBAAmB,CAAC,gBAAgB,CACxC,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,IAAI,aAAa,EAC9G,EAAE,QAAQ,EAAE,IAAI,EAAE,CACnB,CACF,CAAC,IAAI,CAAC;IAEP,MAAM,QAAQ,GAAG,UAAU;SACxB,MAAM,CACL,CAAC,CAAC,EAAmC,EAAE,CACrC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,CACrE;SACA,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,CAAC;SAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEzB,eAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;IAElD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,IAAY;IAClD,yGAAyG;IACzG,MAAM,mBAAmB,CAAC,QAAQ,CAChC,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,IAAI,WAAW,EAC5G;QACE,IAAI,EAAE,EAAE,IAAI,EAAE;KACf,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAY,EACZ,SAAiB;IAEjB,oHAAoH;IACpH,MAAM,EAAE,OAAO,EAAE,GAAG,CAClB,MAAM,mBAAmB,CAAC,gBAAgB,CACxC,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,IAAI,aAAa,SAAS,EAAE,CAC1H,CACF,CAAC,IAAI,CAAC;IAEP,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAY,EACZ,SAAiB,EACjB,IAAY;IAEZ,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEzD,oHAAoH;IACpH,MAAM,mBAAmB,CAAC,OAAO,CAC/B,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,IAAI,aAAa,SAAS,EAAE,EACzH;QACE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KACxB,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,SAAiB;IAC1D,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEzD,uHAAuH;IACvH,MAAM,mBAAmB,CAAC,UAAU,CAClC,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,IAAI,aAAa,SAAS,YAAY,OAAO,EAAE,CAC7I,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,EAClC,MAAM,EACN,KAAK,EACL,OAAO,GACa;IACpB,MAAM,gBAAgB,GAAG,IAAA,mBAAQ,EAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,IAAY,CAAC;QACjB,IAAI,SAA6B,CAAC;QAClC,IAAI,oBAAyC,CAAC;QAC9C,IAAI,KAAK,EAAE,CAAC;YACV,eAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,SAAS,MAAM,EAAE,CAAC,CAAC;YAC1D,IAAI,GAAG,OAAO,KAAK,OAAO,gBAAgB,EAAE,CAAC;YAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3B,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC;oBAChD,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;oBACvB,oBAAoB,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;gBAC/C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,KAAK,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;YAC5D,IAAI,GAAG,GAAG,gBAAgB,EAAE,CAAC;YAC7B,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3B,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBAC1B,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;oBACvB,oBAAoB,GAAG,KAAK,CAAC;gBAC/B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/B,eAAM,CAAC,IAAI,CACT,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EACtD,eAAe,CAChB,CAAC;QACJ,CAAC;aAAM,IAAI,oBAAoB,EAAE,CAAC;YAChC,MAAM,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAC3C,eAAM,CAAC,KAAK,CACV,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAC/C,iBAAiB,CAClB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACnC,eAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,oBAAoB;AACxB,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,YAAwC;IAExC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC;QACtC,MAAM,GAAG,GACP,YAAY,CAAC,IAAI,KAAK,UAAU;YAC9B,CAAC,CAAC,YAAY,CAAC,KAAK;YACpB,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;QAC3B,eAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,SAAS,IAAI,aAAa,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QAEzC,IAAI,SAAS,GAA8B,IAAI,CAAC;QAChD,IAAI,YAAY,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,CAAC,OAAgB,EAAW,EAAE,CAC5C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,KAAK,MAAM,CAAC,CAAC;YAC3D,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACzC,CAAC;aAAM,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAW,EAAE,CAC9C,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,YAAY,CAAC,OAAO,CAAC;YAC/C,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAC3C,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACnC,eAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,gCAAgC,CAAC,CAAC;IACzD,CAAC,CAAC,oBAAoB;AACxB,CAAC;AAED,eAAe;AAEf,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAC3C,KAAK,EAAE,OAAO,CAAC,IAAA,aAAK,EAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAE9B,KAAK,UAAU,QAAQ,CAAC,EAC7B,YAAY,EACZ,YAAY,EACZ,OAAO,EAAE,KAAK,EACd,MAAM,EAAE,cAAc,EACtB,iBAAiB,GACF;IACf,MAAM,WAAW,GAAG,IAAA,mBAAQ,EAAC,cAAc,CAAC,CAAC;IAC7C,eAAM,CAAC,KAAK,CAAC,YAAY,YAAY,WAAW,KAAK,GAAG,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,YAAY,CAAC;IAC1B,IAAI,SAAS,GAAqB,EAAE,CAAC;IAErC,IAAI,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;QAC7C,eAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC3C,MAAM,EAAE,EAAE,EAAE,GAAG,CACb,MAAM,mBAAmB,CAAC,gBAAgB,CACxC,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,EAAE,CAC9E,CACF,CAAC,IAAI,CAAC;QAEP,MAAM,YAAY,GAAG,CACnB,MAAM,mBAAmB,CAAC,gBAAgB,CACxC,yCAAyC,MAAM,CAAC,UAAU,UACxD,MAAM,CAAC,cACT,qCAAqC,UAAU,CAC7C,YAAY,CACb,2BAA2B,IAAI,iBAAiB,EAAE,iBAAiB,EAAE,EAAE,CACzE,CACF,CAAC,IAAI,CAAC;QAEP,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;SACvB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,MAAM,IAAI,GAA2B;QACnC,KAAK;QACL,WAAW;QACX,OAAO,EAAE;YACP,EAAE,EAAE,cAAc,YAAY,EAAE;SACjC;QACD,KAAK,EAAE;YACL,EAAE,EAAE,cAAc,IAAI,EAAE;SACzB;QACD,SAAS;KACV,CAAC;IACF,IAAI,SAAkC,CAAC;IACvC,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAC5C,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,gBAAgB,EAC3F,EAAE,IAAI,EAAE,CACT,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACnC,IACE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa;YACpC,wDAAwD,EACxD,CAAC;YACD,eAAM,CAAC,KAAK,CACV,sEAAsE,CACvE,CAAC;YACF,MAAM,IAAA,kBAAY,EAAC,YAAY,CAAC,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,mCAAkB,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC,CAAC,oBAAoB;IAEtB,MAAM,EAAE,GAAU;QAChB,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;KAChC,CAAC;IAEF,cAAc;IACd,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAQ,CAAC,CAAC;IACxC,MAAM,qBAAU,CAAC,KAAK,CACpB,mBAAmB,EACnB,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,QAAQ,EACf,EAAE,CACH,CAAC;IAEF,OAAO,EAAE,CAAC;AACZ,CAAC;AAEM,KAAK,UAAU,QAAQ,CAAC,EAC7B,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,KAAK,EACd,MAAM,EAAE,cAAc,EACtB,KAAK,EACL,yBAAyB,EACzB,YAAY,GAGb;IACC,MAAM,WAAW,GAAG,IAAA,mBAAQ,EAAC,cAAc,CAAC,CAAC;IAC7C,eAAM,CAAC,KAAK,CAAC,YAAY,IAAI,WAAW,KAAK,GAAG,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAoB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,GAAQ;YAChB,KAAK;YACL,WAAW;YACX,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,SAAS,EAAE,EAAE,CAAC,SAAS;gBACrB,EAAE,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,yBAAyB,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;iBACrE,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;SAC/C,CAAC;QACF,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,GAAG;gBACX,EAAE,EAAE,IAAA,uBAAgB,EAAC,YAAY,CAAC;aACnC,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAK3D,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,IAAI,EAAE,EACnG,EAAE,IAAI,EAAE,CACT,CAAC;QAEF,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC;QACrC,cAAc;QACd,MAAM,QAAQ,GAAG;YACf,CAAC,MAAM,CAAC,EAAE,MAAM;YAChB,CAAC,QAAQ,CAAC,EAAE,UAAU;SACvB,CAAC,KAAM,CAAC,CAAC;QAEV,IAAI,UAAU,GACZ,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE9C,IACE,QAAQ;YACR,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC3C,YAAY,KAAK,QAAQ,EACzB,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YACxD,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAGjE,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,kBAAkB,EAAE,CAAC,MAAM,IAAI,OAAO,YAAY,SAAS,CAAC,OAAO,EAAE,CACjJ,CAAC;YAEF,UAAU,GAAG,KAAM,CAAC;YAEpB,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,qBAAU,CAAC,KAAK,CACpB,mBAAmB,EACnB,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,QAAQ,EACf,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAChC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,qBAAqB,CAAC,CAAC;QACnD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAoB,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACxE,mDAAmD;gBACnD,MAAM,gBAAgB,GAAG,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBACxD,MAAM,QAAQ,CAAC;oBACb,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,cAAc;oBACtB,KAAK;oBACL,yBAAyB,EAAE,gBAAgB;iBAC5C,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,mCAAkB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,oFAAoF;AAC7E,KAAK,UAAU,OAAO,CAAC,EAC5B,UAAU,EACV,EAAE,EAAE,IAAI,GACM;IACd,eAAM,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,UAAW,GAAG,CAAC,CAAC;IACjD,+BAA+B;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAoB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ;QACjD,uBAAuB;QACvB,2BAA2B,MAAM,CAAC,UAAU,UAC1C,MAAM,CAAC,cACT,kBAAkB,IAAI,kBAAkB,EAAE,CAAC,OAAQ,EAAE,CACtD,CAAC;QACF,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAoB,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAClC,eAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,eAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,kBAAkB,CACtC,SAAmB;IAEnB,eAAM,CAAC,KAAK,CAAC,sBAAsB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;IAE/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAElD,IAAI,SAAS,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,SAAS,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,WAAW,GAAG,IAAA,qBAAa,EAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,WAAW,EAAE,CAAC;oBAChB,aAAa,CAAC,IAAI,CAAC,GAAG,IAAA,mBAAU,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC3D,SAAS;gBACX,CAAC;YACH,CAAC;YAED,aAAa,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB;QACtD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,+BAA+B,CAC7C,YAAsB;IAEtB,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,MAAM,aAAa,GAAG,YAAY;SAC/B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SACpE,OAAO,EAAE,CAAC;IAEb,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,IAAA,0BAAkB,EAAC,IAAI,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAA,gBAAM,GAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC;YACX,OAAO;YACP,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mDAAmD;AACnD,0EAA0E;AAC1E,sGAAsG;AACtG,kFAAkF;AAClF,iHAAiH;AACjH,2JAA2J;AAC3J,KAAK,UAAU,yBAAyB,CAAC,SAAiB;IACxD,MAAM,SAAS,GAAG,EAAE,CAAC;IAErB,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,OAAO,CACtD,2BAA2B,MAAM,CAAC,UAAU,UAAU,MAAM,CAAC,cAAc,2BAA2B,EACtG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAClB,uBAAc,CACf,CAAC;QAEF,SAAS,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,wCAAwC,CAAC,CAAC;QAC3E,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,wDAAwD;IACxD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,YAAY,CAC1E,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,KAAK;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;aAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,2DAA2D;IAC3D,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CACjC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,SAAS,CACvE,CAAC;IAEF,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC,KAAK;aACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;aAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,kCAAkC;IAClC,eAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,EACb,mDAAmD,CACpD,CAAC;IACF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,eAAe,CAAC,KAAa;IAC3C,eAAM,CAAC,KAAK,CAAC,mBAAmB,KAAK,CAAC,KAAK,CAAC,oBAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE,yBAAyB;IACzB,OAAO,IAAA,uBAAa,EAAC,KAAK,EAAE,aAAa,EAAE,CAAC;SACzC,OAAO,CACN,oCAAoC,EACpC,uCAAuC,CACxC;SACA,OAAO,CACN,qCAAqC,EACrC,yCAAyC,CAC1C;SACA,OAAO,CAAC,IAAA,aAAK,EAAC,eAAe,CAAC,EAAE,IAAI,CAAC;SACrC,OAAO,CAAC,IAAA,aAAK,EAAC,eAAe,CAAC,EAAE,EAAE,CAAC;SACnC,OAAO,CAAC,IAAA,aAAK,EAAC,4CAA4C,CAAC,EAAE,EAAE,CAAC;SAChE,OAAO,CAAC,IAAA,aAAK,EAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { setTimeout } from 'timers/promises';\nimport ignore from 'ignore';\nimport semver from 'semver';\nimport type { PartialDeep } from 'type-fest';\nimport {\n REPOSITORY_CHANGED,\n REPOSITORY_EMPTY,\n REPOSITORY_NOT_FOUND,\n} from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport type { BranchStatus } from '../../../types';\nimport type { FileData } from '../../../types/platform/bitbucket-server';\nimport { parseJson } from '../../../util/common';\nimport { getEnv } from '../../../util/env';\nimport * as git from '../../../util/git';\nimport { deleteBranch } from '../../../util/git';\nimport * as hostRules from '../../../util/host-rules';\nimport {\n BitbucketServerHttp,\n type BitbucketServerHttpOptions,\n setBaseUrl,\n} from '../../../util/http/bitbucket-server';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider';\nimport type { HttpOptions, HttpResponse } from '../../../util/http/types';\nimport { newlineRegex, regEx } from '../../../util/regex';\nimport { sampleSize } from '../../../util/sample';\nimport { sanitize } from '../../../util/sanitize';\nimport { ensureTrailingSlash, getQueryString } from '../../../util/url';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n EnsureIssueResult,\n FileOwnerRule,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types';\nimport { getNewBranchName, repoFingerprint } from '../util';\nimport { smartTruncate } from '../utils/pr-body';\nimport { BbsPrCache } from './pr-cache';\nimport type {\n Comment,\n PullRequestActivity,\n PullRequestCommentActivity,\n} from './schema';\nimport { ReviewerGroups, UserSchema, UsersSchema, isEmail } from './schema';\nimport type {\n BbsConfig,\n BbsPr,\n BbsRestBranch,\n BbsRestPr,\n BbsRestRepo,\n BbsRestUserRef,\n} from './types';\nimport * as utils from './utils';\nimport { getExtraCloneOpts, parseModifier, splitEscapedSpaces } from './utils';\n\n/*\n * Version: 5.3 (EOL Date: 15 Aug 2019)\n * See following docs for api information:\n * https://docs.atlassian.com/bitbucket-server/rest/5.3.0/bitbucket-rest.html\n * https://docs.atlassian.com/bitbucket-server/rest/5.3.0/bitbucket-build-rest.html\n *\n * See following page for uptodate supported versions\n * https://confluence.atlassian.com/support/atlassian-support-end-of-life-policy-201851003.html#AtlassianSupportEndofLifePolicy-BitbucketServer\n */\n\nexport const id = 'bitbucket-server';\n\nlet config: BbsConfig = {} as any;\n\nconst bitbucketServerHttp = new BitbucketServerHttp();\n\nconst defaults: {\n endpoint?: string;\n hostType: string;\n version: string;\n} = {\n hostType: 'bitbucket-server',\n version: '0.0.0',\n};\n\n/* v8 ignore start */\nfunction updatePrVersion(pr: number, version: number): number {\n const res = Math.max(config.prVersions.get(pr) ?? 0, version);\n config.prVersions.set(pr, res);\n return res;\n} /* v8 ignore stop */\n\nexport async function initPlatform({\n endpoint,\n token,\n username,\n password,\n gitAuthor,\n}: PlatformParams): Promise<PlatformResult> {\n if (!endpoint) {\n throw new Error('Init: You must configure a Bitbucket Server endpoint');\n }\n if (!(username && password) && !token) {\n throw new Error(\n 'Init: You must either configure a Bitbucket Server username/password or a HTTP access token',\n );\n } else if (password && token) {\n throw new Error(\n 'Init: You must configure either a Bitbucket Server password or a HTTP access token, not both',\n );\n }\n // TODO: Add a connection check that endpoint/username/password combination are valid (#9595)\n defaults.endpoint = ensureTrailingSlash(endpoint);\n setBaseUrl(defaults.endpoint);\n const platformConfig: PlatformResult = {\n endpoint: defaults.endpoint,\n };\n try {\n let bitbucketServerVersion: string;\n const env = getEnv();\n /* v8 ignore start: experimental feature */\n if (env.RENOVATE_X_PLATFORM_VERSION) {\n bitbucketServerVersion = env.RENOVATE_X_PLATFORM_VERSION;\n } /* v8 ignore stop */ else {\n const { version } = (\n await bitbucketServerHttp.getJsonUnchecked<{ version: string }>(\n `./rest/api/1.0/application-properties`,\n )\n ).body;\n bitbucketServerVersion = version;\n logger.debug('Bitbucket Server version is: ' + bitbucketServerVersion);\n }\n\n if (semver.valid(bitbucketServerVersion)) {\n defaults.version = bitbucketServerVersion;\n }\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with Bitbucket. Check that your token includes \"api\" permissions',\n );\n }\n\n if (!gitAuthor && username) {\n logger.debug(`Attempting to confirm gitAuthor from username`);\n const options: HttpOptions = {\n memCache: false,\n };\n\n if (token) {\n options.token = token;\n } else {\n options.username = username;\n options.password = password;\n }\n\n try {\n const { displayName, emailAddress } = (\n await bitbucketServerHttp.getJson(\n `./rest/api/1.0/users/${username}`,\n options,\n UserSchema,\n )\n ).body;\n\n if (!emailAddress.length) {\n throw new Error(`No email address configured for username ${username}`);\n }\n\n platformConfig.gitAuthor = `${displayName} <${emailAddress}>`;\n\n logger.debug(`Detected gitAuthor: ${platformConfig.gitAuthor}`);\n } catch (err) {\n logger.debug(\n { err },\n 'Failed to get user info, fallback gitAuthor will be used',\n );\n }\n }\n\n return platformConfig;\n}\n\n// Get all repositories that the user has access to\nexport async function getRepos(): Promise<string[]> {\n logger.debug('Autodiscovering Bitbucket Server repositories');\n try {\n const repos = (\n await bitbucketServerHttp.getJsonUnchecked<BbsRestRepo[]>(\n `./rest/api/1.0/repos?permission=REPO_WRITE&state=AVAILABLE`,\n { paginate: true },\n )\n ).body;\n\n const result = repos.map((repo) => `${repo.project.key}/${repo.slug}`);\n logger.debug({ result }, 'result of getRepos()');\n return result;\n } catch (err) /* v8 ignore start */ {\n logger.error({ err }, `bitbucket getRepos error`);\n throw err;\n } /* v8 ignore stop */\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const repo = repoName ?? config.repository;\n const [project, slug] = repo.split('/');\n const fileUrl =\n `./rest/api/1.0/projects/${project}/repos/${slug}/browse/${fileName}?limit=20000` +\n (branchOrTag ? '&at=' + branchOrTag : '');\n const res = await bitbucketServerHttp.getJsonUnchecked<FileData>(fileUrl);\n const { isLastPage, lines, size } = res.body;\n if (isLastPage) {\n return lines.map(({ text }) => text).join('\\n');\n }\n logger.warn({ size }, 'The file is too big');\n throw new Error(`The file is too big (${size}B)`);\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n // TODO #22198\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\n// Initialize Bitbucket Server by getting base branch\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n ignorePrAuthor,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(\"${JSON.stringify({ repository }, null, 2)}\")`);\n const opts = hostRules.find({\n hostType: defaults.hostType,\n url: defaults.endpoint,\n });\n\n const [projectKey, repositorySlug] = repository.split('/');\n\n config = {\n projectKey,\n repositorySlug,\n repository,\n prVersions: new Map<number, number>(),\n username: opts.username,\n ignorePrAuthor,\n } as any;\n\n try {\n const info = (\n await bitbucketServerHttp.getJsonUnchecked<BbsRestRepo>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}`,\n )\n ).body;\n config.owner = info.project.key;\n logger.debug(`${repository} owner = ${config.owner}`);\n const branchRes = await bitbucketServerHttp.getJsonUnchecked<BbsRestBranch>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/branches/default`,\n );\n\n // 204 means empty, 404 means repo not found or missing default branch. repo must exist here.\n if ([204, 404].includes(branchRes.statusCode)) {\n throw new Error(REPOSITORY_EMPTY);\n }\n\n const url = utils.getRepoGitUrl(\n config.repositorySlug,\n // TODO #22198\n defaults.endpoint!,\n gitUrl,\n info,\n opts,\n );\n\n await git.initRepo({\n ...config,\n url,\n extraCloneOpts: getExtraCloneOpts(opts),\n cloneSubmodules,\n cloneSubmodulesFilter,\n fullClone: semver.lte(defaults.version, '8.0.0'),\n });\n\n config.mergeMethod = 'merge';\n const repoConfig: RepoResult = {\n defaultBranch: branchRes.body.displayId,\n isFork: !!info.origin,\n repoFingerprint: repoFingerprint(info.id, defaults.endpoint),\n };\n\n return repoConfig;\n } catch (err) /* v8 ignore start */ {\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n\n logger.debug({ err }, 'Unknown Bitbucket initRepo error');\n throw err;\n } /* v8 ignore stop */\n}\n\nexport async function getBranchForceRebase(\n _branchName: string,\n): Promise<boolean> {\n // https://docs.atlassian.com/bitbucket-server/rest/7.0.1/bitbucket-rest.html#idp342\n const res = await bitbucketServerHttp.getJsonUnchecked<{\n mergeConfig: { defaultStrategy: { id: string } };\n }>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/settings/pull-requests`,\n );\n\n // If the default merge strategy contains `ff-only` the PR can only be merged\n // if it is up to date with the base branch.\n // The current options for id are:\n // no-ff, ff, ff-only, rebase-no-ff, rebase-ff-only, squash, squash-ff-only\n return Boolean(\n res.body?.mergeConfig?.defaultStrategy?.id.includes('ff-only'),\n );\n}\n\n// Gets details for a PR\nexport async function getPr(\n prNo: number,\n refreshCache?: boolean,\n): Promise<BbsPr | null> {\n logger.debug(`getPr(${prNo})`);\n if (!prNo) {\n return null;\n }\n\n // Disables memCache (which is enabled by default) to be replaced by\n // memCacheProvider.\n const opts: HttpOptions = { memCache: false };\n // TODO: should refresh the cache rather than just ignore it\n if (!refreshCache) {\n opts.cacheProvider = memCacheProvider;\n }\n\n const res = await bitbucketServerHttp.getJsonUnchecked<BbsRestPr>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}`,\n opts,\n );\n\n const pr: BbsPr = {\n ...utils.prInfo(res.body),\n reviewers: res.body.reviewers.map((r) => r.user.name),\n };\n // TODO #22198\n pr.version = updatePrVersion(pr.number, pr.version!);\n\n return pr;\n}\n\n// TODO: coverage (#9624)\n/* v8 ignore start */\nfunction matchesState(state: string, desiredState: string): boolean {\n if (desiredState === 'all') {\n return true;\n }\n if (desiredState.startsWith('!')) {\n return state !== desiredState.substring(1);\n }\n return state === desiredState;\n} /* v8 ignore stop */\n\n// TODO: coverage (#9624)\n/* v8 ignore start */\nfunction isRelevantPr(\n branchName: string,\n prTitle: string | null | undefined,\n state: string,\n) {\n return (p: Pr): boolean =>\n p.sourceBranch === branchName &&\n (!prTitle || p.title.toUpperCase() === prTitle.toUpperCase()) &&\n matchesState(p.state, state);\n} /* v8 ignore stop */\n\n// TODO: coverage (#9624)\nexport async function getPrList(): Promise<Pr[]> {\n logger.debug(`getPrList()`);\n return await BbsPrCache.getPrs(\n bitbucketServerHttp,\n config.projectKey,\n config.repositorySlug,\n config.ignorePrAuthor,\n config.username,\n );\n}\n\n// TODO: coverage (#9624)\n/* v8 ignore start */\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n includeOtherAuthors,\n}: FindPRConfig): Promise<Pr | null> {\n logger.debug(`findPr(${branchName}, \"${prTitle!}\", \"${state}\")`);\n\n if (includeOtherAuthors) {\n // PR might have been created by anyone, so don't use the cached Renovate PR list\n const searchParams: Record<string, string> = {\n state: 'OPEN',\n };\n searchParams.direction = 'outgoing';\n searchParams.at = `refs/heads/${branchName}`;\n\n const query = getQueryString(searchParams);\n const prs = (\n await bitbucketServerHttp.getJsonUnchecked<BbsRestPr[]>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests?${query}`,\n {\n paginate: true,\n limit: 1, // only fetch the latest pr\n },\n )\n ).body;\n\n if (!prs.length) {\n logger.debug(`No PR found for branch ${branchName}`);\n return null;\n }\n\n return utils.prInfo(prs[0]);\n }\n\n const prList = await getPrList();\n const pr = prList.find(isRelevantPr(branchName, prTitle, state));\n if (pr) {\n logger.debug(`Found PR #${pr.number}`);\n } else {\n logger.debug(`Renovate did not find a PR for branch #${branchName}`);\n }\n return pr ?? null;\n} /* v8 ignore stop */\n\n// Returns the Pull Request for a branch. Null if not exists.\nexport async function getBranchPr(branchName: string): Promise<BbsPr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const existingPr = await findPr({\n branchName,\n state: 'open',\n });\n return existingPr ? getPr(existingPr.number) : null;\n}\n\n/* v8 ignore start */\nexport async function refreshPr(number: number): Promise<void> {\n // wait for pr change propagation\n await setTimeout(1000);\n // refresh cache\n await getPr(number, true);\n} /* v8 ignore stop */\n\nasync function getStatus(\n branchName: string,\n memCache = true,\n): Promise<utils.BitbucketCommitStatus> {\n const branchCommit = git.getBranchCommit(branchName);\n\n /* v8 ignore start: temporary code */\n const opts: HttpOptions = memCache\n ? { cacheProvider: memCacheProvider }\n : { memCache: false };\n /* v8 ignore stop */\n\n return (\n await bitbucketServerHttp.getJsonUnchecked<utils.BitbucketCommitStatus>(\n // TODO: types (#22198)\n `./rest/build-status/1.0/commits/stats/${branchCommit!}`,\n opts,\n )\n ).body;\n}\n\n// Returns the combined status for a branch.\n// umbrella for status checks\n// https://docs.atlassian.com/bitbucket-server/rest/6.0.0/bitbucket-build-rest.html#idp2\nexport async function getBranchStatus(\n branchName: string,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n\n if (!git.branchExists(branchName)) {\n logger.debug('Branch does not exist - cannot fetch status');\n throw new Error(REPOSITORY_CHANGED);\n }\n\n try {\n const commitStatus = await getStatus(branchName);\n\n logger.debug({ commitStatus }, 'branch status check result');\n\n if (commitStatus.failed > 0) {\n return 'red';\n }\n if (commitStatus.inProgress > 0) {\n return 'yellow';\n }\n return commitStatus.successful > 0 ? 'green' : 'yellow';\n } catch (err) {\n logger.warn({ err }, `Failed to get branch status`);\n return 'red';\n }\n}\n\nasync function getStatusCheck(\n branchName: string,\n memCache = true,\n): Promise<utils.BitbucketStatus[]> {\n const branchCommit = git.getBranchCommit(branchName);\n\n const opts: BitbucketServerHttpOptions = { paginate: true };\n /* v8 ignore start: temporary code */\n if (memCache) {\n opts.cacheProvider = memCacheProvider;\n } else {\n opts.memCache = false;\n }\n /* v8 ignore stop */\n\n return (\n await bitbucketServerHttp.getJsonUnchecked<utils.BitbucketStatus[]>(\n `./rest/build-status/1.0/commits/${branchCommit!}`,\n opts,\n )\n ).body;\n}\n\n// https://docs.atlassian.com/bitbucket-server/rest/6.0.0/bitbucket-build-rest.html#idp2\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n logger.debug(`getBranchStatusCheck(${branchName}, context=${context})`);\n\n try {\n const states = await getStatusCheck(branchName);\n\n for (const state of states) {\n if (state.key === context) {\n switch (state.state) {\n case 'SUCCESSFUL':\n return 'green';\n case 'INPROGRESS':\n return 'yellow';\n case 'FAILED':\n default:\n return 'red';\n }\n }\n }\n } catch (err) {\n logger.warn({ err }, `Failed to check branch status`);\n }\n return null;\n}\n\nexport async function setBranchStatus({\n branchName,\n context,\n description,\n state,\n url: targetUrl,\n}: BranchStatusConfig): Promise<void> {\n logger.debug(`setBranchStatus(${branchName})`);\n\n const existingStatus = await getBranchStatusCheck(branchName, context);\n if (existingStatus === state) {\n return;\n }\n logger.debug({ branch: branchName, context, state }, 'Setting branch status');\n\n const branchCommit = git.getBranchCommit(branchName);\n\n try {\n const body: any = {\n key: context,\n description,\n url: targetUrl ?? 'https://renovatebot.com',\n };\n\n switch (state) {\n case 'green':\n body.state = 'SUCCESSFUL';\n break;\n case 'yellow':\n body.state = 'INPROGRESS';\n break;\n case 'red':\n default:\n body.state = 'FAILED';\n break;\n }\n\n await bitbucketServerHttp.postJson(\n // TODO: types (#22198)\n `./rest/build-status/1.0/commits/${branchCommit!}`,\n { body },\n );\n\n // update status cache\n await getStatus(branchName, false);\n await getStatusCheck(branchName, false);\n } catch (err) {\n logger.warn({ err }, `Failed to set branch status`);\n }\n}\n\n// Issue\n\n/* v8 ignore start */\nexport function findIssue(title: string): Promise<Issue | null> {\n logger.debug(`findIssue(${title})`);\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve(null);\n} /* v8 ignore stop */\n\n/* v8 ignore start */\nexport function ensureIssue({\n title,\n}: EnsureIssueConfig): Promise<EnsureIssueResult | null> {\n logger.warn({ title }, 'Cannot ensure issue');\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve(null);\n} /* v8 ignore stop */\n\n/* v8 ignore start */\nexport function getIssueList(): Promise<Issue[]> {\n logger.debug(`getIssueList()`);\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve([]);\n} /* v8 ignore stop */\n\n/* v8 ignore start */\nexport function ensureIssueClosing(title: string): Promise<void> {\n logger.debug(`ensureIssueClosing(${title})`);\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve();\n} /* v8 ignore stop */\n\nexport function addAssignees(iid: number, assignees: string[]): Promise<void> {\n logger.debug(`addAssignees(${iid}, [${assignees.join(', ')}])`);\n // This is used by Renovate when creating its own issues,\n // e.g. for deprecated package warnings,\n // config error notifications, or \"dependencyDashboard\"\n //\n // Bitbucket Server does not have issues\n return Promise.resolve();\n}\n\nexport async function addReviewers(\n prNo: number,\n reviewers: string[],\n): Promise<void> {\n logger.debug(`Adding reviewers '${reviewers.join(', ')}' to #${prNo}`);\n\n const reviewerSlugs = new Set<string>();\n\n for (const entry of reviewers) {\n // If entry is an email-address, resolve userslugs\n if (isEmail(entry)) {\n const slugs = await getUserSlugsByEmail(entry);\n for (const slug of slugs) {\n reviewerSlugs.add(slug);\n }\n } else {\n reviewerSlugs.add(entry);\n }\n }\n\n await retry(updatePRAndAddReviewers, [prNo, Array.from(reviewerSlugs)], 3, [\n REPOSITORY_CHANGED,\n ]);\n}\n\n/**\n * Resolves Bitbucket users by email address,\n * restricted to users who have REPO_READ permission on the target repository.\n *\n * @param emailAddress - A string that could be the user's email-address.\n * @returns List of user slugs for active, matched users.\n */\nexport async function getUserSlugsByEmail(\n emailAddress: string,\n): Promise<string[]> {\n try {\n const filterUrl =\n `./rest/api/1.0/users?filter=${emailAddress}` +\n `&permission.1=REPO_READ` +\n `&permission.1.projectKey=${config.projectKey}` +\n `&permission.1.repositorySlug=${config.repositorySlug}`;\n\n const users = await bitbucketServerHttp.getJson(\n filterUrl,\n { limit: 100 },\n UsersSchema,\n );\n\n if (users.body.length) {\n return users.body\n .filter((u) => u.active && u.emailAddress === emailAddress)\n .map((u) => u.slug);\n }\n } catch (err) {\n logger.warn(\n { err, emailAddress },\n `Failed to resolve email address to user slug`,\n );\n throw err;\n }\n logger.debug({ userinfo: emailAddress }, 'No users found for email-address');\n return [];\n}\n\nasync function updatePRAndAddReviewers(\n prNo: number,\n reviewers: string[],\n): Promise<void> {\n try {\n const pr = await getPr(prNo);\n if (!pr) {\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n\n // TODO: can `reviewers` be undefined? (#22198)\n const reviewersSet = new Set([...pr.reviewers!, ...reviewers]);\n\n await bitbucketServerHttp.putJson(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}`,\n {\n body: {\n title: pr.title,\n version: pr.version,\n reviewers: Array.from(reviewersSet).map((name) => ({\n user: { name },\n })),\n },\n },\n );\n await getPr(prNo, true);\n } catch (err) {\n logger.warn({ err, reviewers, prNo }, `Failed to add reviewers`);\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n } else if (err.statusCode === 409) {\n if (utils.isInvalidReviewersResponse(err)) {\n // Retry again with invalid reviewers being removed\n const invalidReviewers = utils.getInvalidReviewers(err);\n const filteredReviewers = reviewers.filter(\n (name) => !invalidReviewers.includes(name),\n );\n await updatePRAndAddReviewers(prNo, filteredReviewers);\n } else {\n logger.debug(\n '409 response to adding reviewers - has repository changed?',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n } else {\n throw err;\n }\n }\n}\n\nasync function retry<T extends (...arg0: any[]) => Promise<any>>(\n fn: T,\n args: Parameters<T>,\n maxTries: number,\n retryErrorMessages: string[],\n): Promise<Awaited<ReturnType<T>>> {\n const maxAttempts = Math.max(maxTries, 1);\n let lastError: Error | undefined;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await fn(...args);\n } catch (e) {\n lastError = e;\n if (\n retryErrorMessages.length !== 0 &&\n !retryErrorMessages.includes(e.message)\n ) {\n logger.debug(`Error not marked for retry`);\n throw e;\n }\n }\n }\n\n logger.debug(`All ${maxAttempts} retry attempts exhausted`);\n // Can't be `undefined` here.\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw lastError;\n}\n\nexport function deleteLabel(issueNo: number, label: string): Promise<void> {\n logger.debug(`deleteLabel(${issueNo}, ${label})`);\n // Only used for the \"request Renovate to rebase a PR using a label\" feature\n //\n // Bitbucket Server does not have issues\n return Promise.resolve();\n}\n\nasync function getComments(prNo: number): Promise<Comment[]> {\n // GET /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/activities\n const activities = (\n await bitbucketServerHttp.getJsonUnchecked<PullRequestActivity[]>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/activities`,\n { paginate: true },\n )\n ).body;\n\n const comments = activities\n .filter(\n (a): a is PullRequestCommentActivity =>\n a.action === 'COMMENTED' && 'comment' in a && 'commentAction' in a,\n )\n .filter((a) => a.commentAction === 'ADDED')\n .map((a) => a.comment);\n\n logger.debug(`Found ${comments.length} comments`);\n\n return comments;\n}\n\nasync function addComment(prNo: number, text: string): Promise<void> {\n // POST /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments\n await bitbucketServerHttp.postJson(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/comments`,\n {\n body: { text },\n },\n );\n}\n\nasync function getCommentVersion(\n prNo: number,\n commentId: number,\n): Promise<number> {\n // GET /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}\n const { version } = (\n await bitbucketServerHttp.getJsonUnchecked<{ version: number }>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/comments/${commentId}`,\n )\n ).body;\n\n return version;\n}\n\nasync function editComment(\n prNo: number,\n commentId: number,\n text: string,\n): Promise<void> {\n const version = await getCommentVersion(prNo, commentId);\n\n // PUT /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}\n await bitbucketServerHttp.putJson(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/comments/${commentId}`,\n {\n body: { text, version },\n },\n );\n}\n\nasync function deleteComment(prNo: number, commentId: number): Promise<void> {\n const version = await getCommentVersion(prNo, commentId);\n\n // DELETE /rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}\n await bitbucketServerHttp.deleteJson(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}/comments/${commentId}?version=${version}`,\n );\n}\n\nexport async function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n const sanitizedContent = sanitize(content);\n try {\n const comments = await getComments(number);\n let body: string;\n let commentId: number | undefined;\n let commentNeedsUpdating: boolean | undefined;\n if (topic) {\n logger.debug(`Ensuring comment \"${topic}\" in #${number}`);\n body = `### ${topic}\\n\\n${sanitizedContent}`;\n comments.forEach((comment) => {\n if (comment.text.startsWith(`### ${topic}\\n\\n`)) {\n commentId = comment.id;\n commentNeedsUpdating = comment.text !== body;\n }\n });\n } else {\n logger.debug(`Ensuring content-only comment in #${number}`);\n body = `${sanitizedContent}`;\n comments.forEach((comment) => {\n if (comment.text === body) {\n commentId = comment.id;\n commentNeedsUpdating = false;\n }\n });\n }\n if (!commentId) {\n await addComment(number, body);\n logger.info(\n { repository: config.repository, prNo: number, topic },\n 'Comment added',\n );\n } else if (commentNeedsUpdating) {\n await editComment(number, commentId, body);\n logger.debug(\n { repository: config.repository, prNo: number },\n 'Comment updated',\n );\n } else {\n logger.debug('Comment is already update-to-date');\n }\n return true;\n } catch (err) /* v8 ignore start */ {\n logger.warn({ err }, 'Error ensuring comment');\n return false;\n } /* v8 ignore stop */\n}\n\nexport async function ensureCommentRemoval(\n deleteConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n try {\n const { number: prNo } = deleteConfig;\n const key =\n deleteConfig.type === 'by-topic'\n ? deleteConfig.topic\n : deleteConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${prNo} is removed`);\n const comments = await getComments(prNo);\n\n let commentId: number | null | undefined = null;\n if (deleteConfig.type === 'by-topic') {\n const byTopic = (comment: Comment): boolean =>\n comment.text.startsWith(`### ${deleteConfig.topic}\\n\\n`);\n commentId = comments.find(byTopic)?.id;\n } else if (deleteConfig.type === 'by-content') {\n const byContent = (comment: Comment): boolean =>\n comment.text.trim() === deleteConfig.content;\n commentId = comments.find(byContent)?.id;\n }\n\n if (commentId) {\n await deleteComment(prNo, commentId);\n }\n } catch (err) /* v8 ignore start */ {\n logger.warn({ err }, 'Error ensuring comment removal');\n } /* v8 ignore stop */\n}\n\n// Pull Request\n\nconst escapeHash = (input: string): string =>\n input?.replace(regEx(/#/g), '%23');\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle: title,\n prBody: rawDescription,\n platformPrOptions,\n}: CreatePRConfig): Promise<Pr> {\n const description = sanitize(rawDescription);\n logger.debug(`createPr(${sourceBranch}, title=${title})`);\n const base = targetBranch;\n let reviewers: BbsRestUserRef[] = [];\n\n if (platformPrOptions?.bbUseDefaultReviewers) {\n logger.debug(`fetching default reviewers`);\n const { id } = (\n await bitbucketServerHttp.getJsonUnchecked<{ id: number }>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}`,\n )\n ).body;\n\n const defReviewers = (\n await bitbucketServerHttp.getJsonUnchecked<{ name: string }[]>(\n `./rest/default-reviewers/1.0/projects/${config.projectKey}/repos/${\n config.repositorySlug\n }/reviewers?sourceRefId=refs/heads/${escapeHash(\n sourceBranch,\n )}&targetRefId=refs/heads/${base}&sourceRepoId=${id}&targetRepoId=${id}`,\n )\n ).body;\n\n reviewers = defReviewers.map((u) => ({\n user: { name: u.name },\n }));\n }\n\n const body: PartialDeep<BbsRestPr> = {\n title,\n description,\n fromRef: {\n id: `refs/heads/${sourceBranch}`,\n },\n toRef: {\n id: `refs/heads/${base}`,\n },\n reviewers,\n };\n let prInfoRes: HttpResponse<BbsRestPr>;\n try {\n prInfoRes = await bitbucketServerHttp.postJson<BbsRestPr>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests`,\n { body },\n );\n } catch (err) /* v8 ignore start */ {\n if (\n err.body?.errors?.[0]?.exceptionName ===\n 'com.atlassian.bitbucket.pull.EmptyPullRequestException'\n ) {\n logger.debug(\n 'Empty pull request - deleting branch so it can be recreated next run',\n );\n await deleteBranch(sourceBranch);\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n } /* v8 ignore stop */\n\n const pr: BbsPr = {\n ...utils.prInfo(prInfoRes.body),\n };\n\n // TODO #22198\n updatePrVersion(pr.number, pr.version!);\n await BbsPrCache.setPr(\n bitbucketServerHttp,\n config.projectKey,\n config.repositorySlug,\n config.ignorePrAuthor,\n config.username,\n pr,\n );\n\n return pr;\n}\n\nexport async function updatePr({\n number: prNo,\n prTitle: title,\n prBody: rawDescription,\n state,\n bitbucketInvalidReviewers,\n targetBranch,\n}: UpdatePrConfig & {\n bitbucketInvalidReviewers?: string[] | undefined;\n}): Promise<void> {\n const description = sanitize(rawDescription);\n logger.debug(`updatePr(${prNo}, title=${title})`);\n\n try {\n const pr = await getPr(prNo);\n if (!pr) {\n throw Object.assign(new Error(REPOSITORY_NOT_FOUND), { statusCode: 404 });\n }\n\n const body: any = {\n title,\n description,\n version: pr.version,\n reviewers: pr.reviewers\n ?.filter((name: string) => !bitbucketInvalidReviewers?.includes(name))\n .map((name: string) => ({ user: { name } })),\n };\n if (targetBranch) {\n body.toRef = {\n id: getNewBranchName(targetBranch),\n };\n }\n\n const { body: updatedPr } = await bitbucketServerHttp.putJson<\n BbsRestPr & {\n version: number;\n }\n >(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${prNo}`,\n { body },\n );\n\n updatePrVersion(prNo, updatedPr.version);\n\n const currentState = updatedPr.state;\n // TODO #22198\n const newState = {\n ['open']: 'OPEN',\n ['closed']: 'DECLINED',\n }[state!];\n\n let finalState: 'open' | 'closed' =\n currentState === 'OPEN' ? 'open' : 'closed';\n\n if (\n newState &&\n ['OPEN', 'DECLINED'].includes(currentState) &&\n currentState !== newState\n ) {\n const command = state === 'open' ? 'reopen' : 'decline';\n const { body: updatedStatePr } = await bitbucketServerHttp.postJson<{\n version: number;\n }>(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests/${pr.number}/${command}?version=${updatedPr.version}`,\n );\n\n finalState = state!;\n\n updatePrVersion(pr.number, updatedStatePr.version);\n }\n\n const bbsPr = utils.prInfo(updatedPr);\n await BbsPrCache.setPr(\n bitbucketServerHttp,\n config.projectKey,\n config.repositorySlug,\n config.ignorePrAuthor,\n config.username,\n { ...bbsPr, state: finalState },\n );\n } catch (err) {\n logger.debug({ err, prNo }, `Failed to update PR`);\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n } else if (err.statusCode === 409) {\n if (utils.isInvalidReviewersResponse(err) && !bitbucketInvalidReviewers) {\n // Retry again with invalid reviewers being removed\n const invalidReviewers = utils.getInvalidReviewers(err);\n await updatePr({\n number: prNo,\n prTitle: title,\n prBody: rawDescription,\n state,\n bitbucketInvalidReviewers: invalidReviewers,\n });\n } else {\n throw new Error(REPOSITORY_CHANGED);\n }\n } else {\n throw err;\n }\n }\n}\n\n// https://docs.atlassian.com/bitbucket-server/rest/6.0.0/bitbucket-rest.html#idp261\nexport async function mergePr({\n branchName,\n id: prNo,\n}: MergePRConfig): Promise<boolean> {\n logger.debug(`mergePr(${prNo}, ${branchName!})`);\n // Used for \"automerge\" feature\n try {\n const pr = await getPr(prNo);\n if (!pr) {\n throw Object.assign(new Error(REPOSITORY_NOT_FOUND), { statusCode: 404 });\n }\n const { body } = await bitbucketServerHttp.postJson<{ version: number }>(\n // TODO: types (#22198)\n `./rest/api/1.0/projects/${config.projectKey}/repos/${\n config.repositorySlug\n }/pull-requests/${prNo}/merge?version=${pr.version!}`,\n );\n updatePrVersion(prNo, body.version);\n } catch (err) {\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n } else if (err.statusCode === 409) {\n logger.warn({ err }, `Failed to merge PR`);\n return false;\n } else {\n logger.warn({ err }, `Failed to merge PR`);\n return false;\n }\n }\n\n logger.debug(`PR merged, PrNo:${prNo}`);\n return true;\n}\n\nexport async function expandGroupMembers(\n reviewers: string[],\n): Promise<string[]> {\n logger.debug(`expandGroupMembers(${reviewers.join(', ')})`);\n const expandedUsers: string[] = [];\n const reviewerGroupPrefix = '@reviewer-group/';\n\n for (const reviewer of reviewers) {\n const [baseEntry, modifier] = reviewer.split(':');\n\n if (baseEntry.startsWith(reviewerGroupPrefix)) {\n const groupName = baseEntry.replace(reviewerGroupPrefix, '');\n const groupUsers = await getUsersFromReviewerGroup(groupName);\n if (!groupUsers.length) {\n continue;\n }\n\n if (modifier) {\n const randomCount = parseModifier(modifier);\n if (randomCount) {\n expandedUsers.push(...sampleSize(groupUsers, randomCount));\n continue;\n }\n }\n\n expandedUsers.push(...groupUsers);\n } else {\n expandedUsers.push(baseEntry); // Add the user entry\n }\n }\n\n return [...new Set(expandedUsers)];\n}\n\nexport function extractRulesFromCodeOwnersLines(\n cleanedLines: string[],\n): FileOwnerRule[] {\n const results: FileOwnerRule[] = [];\n\n const reversedLines = cleanedLines\n .filter((line) => line.trim() !== '' && !line.trim().startsWith('#'))\n .reverse();\n\n for (const line of reversedLines) {\n const [pattern, ...entries] = splitEscapedSpaces(line);\n const matcher = ignore().add(pattern);\n results.push({\n pattern,\n usernames: [...new Set(entries)],\n score: pattern.length,\n match: (path: string) => matcher.ignores(path),\n });\n }\n\n return results;\n}\n\n// Gets active users by name, from a reviewer group\n// Returns an empty array if the group is not found or has no active users\n// As there is no direct API to get group by name, we get all reviewer groups per repo and filter them\n// This is not efficient, but it is the only way to get users from a group by name\n// Supports both repository-scoped and project-scoped groups following the BitBucket server logic described here:\n// https://confluence.atlassian.com/bitbucketserver/code-owners-1296171116.html#Codeowners-Whatifaprojectandrepositorycontainareviewergroupwiththesamename?\nasync function getUsersFromReviewerGroup(groupName: string): Promise<string[]> {\n const allGroups = [];\n\n try {\n const reviewerGroups = await bitbucketServerHttp.getJson(\n `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/settings/reviewer-groups`,\n { paginate: true },\n ReviewerGroups,\n );\n\n allGroups.push(...reviewerGroups.body);\n } catch (err) {\n logger.debug({ err, groupName }, 'Failed to get reviewer groups for repo');\n return [];\n }\n\n // First, try to find a repo-scoped group with this name\n const repoGroup = allGroups.find(\n (group) => group.name === groupName && group.scope?.type === 'REPOSITORY',\n );\n\n if (repoGroup) {\n return repoGroup.users\n .filter((user) => user.active)\n .map((user) => user.emailAddress);\n }\n\n // If no repo-level group, fall back to project-level group\n const projectGroup = allGroups.find(\n (group) => group.name === groupName && group.scope?.type === 'PROJECT',\n );\n\n if (projectGroup) {\n return projectGroup.users\n .filter((user) => user.active)\n .map((user) => user.emailAddress);\n }\n\n // Group not found at either level\n logger.warn(\n { groupName },\n 'Reviewer group not found at repo or project level',\n );\n return [];\n}\n\nexport function massageMarkdown(input: string): string {\n logger.debug(`massageMarkdown(${input.split(newlineRegex)[0]})`);\n // Remove any HTML we use\n return smartTruncate(input, maxBodyLength())\n .replace(\n 'you tick the rebase/retry checkbox',\n 'PR is renamed to start with \"rebase!\"',\n )\n .replace(\n 'checking the rebase/retry box above',\n 'renaming the PR to start with \"rebase!\"',\n )\n .replace(regEx(/<\\/?summary>/g), '**')\n .replace(regEx(/<\\/?details>/g), '')\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?(\\n|$)`), '')\n .replace(regEx(/<!--.*?-->/gs), '');\n}\n\nexport function maxBodyLength(): number {\n return 30000;\n}\n"]}
|
@@ -107,4 +107,100 @@ export declare const PullRequestActivity: z.ZodUnion<[z.ZodObject<{
|
|
107
107
|
commentAction: string;
|
108
108
|
}>]>;
|
109
109
|
export type PullRequestActivity = z.infer<typeof PullRequestActivity>;
|
110
|
+
export declare const ReviewerGroup: z.ZodObject<{
|
111
|
+
name: z.ZodString;
|
112
|
+
users: z.ZodArray<z.ZodObject<{
|
113
|
+
displayName: z.ZodString;
|
114
|
+
emailAddress: z.ZodString;
|
115
|
+
active: z.ZodBoolean;
|
116
|
+
slug: z.ZodString;
|
117
|
+
}, "strip", z.ZodTypeAny, {
|
118
|
+
active: boolean;
|
119
|
+
slug: string;
|
120
|
+
displayName: string;
|
121
|
+
emailAddress: string;
|
122
|
+
}, {
|
123
|
+
active: boolean;
|
124
|
+
slug: string;
|
125
|
+
displayName: string;
|
126
|
+
emailAddress: string;
|
127
|
+
}>, "many">;
|
128
|
+
scope: z.ZodObject<{
|
129
|
+
type: z.ZodUnion<[z.ZodLiteral<"REPOSITORY">, z.ZodLiteral<"PROJECT">]>;
|
130
|
+
}, "strip", z.ZodTypeAny, {
|
131
|
+
type: "REPOSITORY" | "PROJECT";
|
132
|
+
}, {
|
133
|
+
type: "REPOSITORY" | "PROJECT";
|
134
|
+
}>;
|
135
|
+
}, "strip", z.ZodTypeAny, {
|
136
|
+
name: string;
|
137
|
+
scope: {
|
138
|
+
type: "REPOSITORY" | "PROJECT";
|
139
|
+
};
|
140
|
+
users: {
|
141
|
+
active: boolean;
|
142
|
+
slug: string;
|
143
|
+
displayName: string;
|
144
|
+
emailAddress: string;
|
145
|
+
}[];
|
146
|
+
}, {
|
147
|
+
name: string;
|
148
|
+
scope: {
|
149
|
+
type: "REPOSITORY" | "PROJECT";
|
150
|
+
};
|
151
|
+
users: {
|
152
|
+
active: boolean;
|
153
|
+
slug: string;
|
154
|
+
displayName: string;
|
155
|
+
emailAddress: string;
|
156
|
+
}[];
|
157
|
+
}>;
|
158
|
+
export declare const ReviewerGroups: z.ZodArray<z.ZodObject<{
|
159
|
+
name: z.ZodString;
|
160
|
+
users: z.ZodArray<z.ZodObject<{
|
161
|
+
displayName: z.ZodString;
|
162
|
+
emailAddress: z.ZodString;
|
163
|
+
active: z.ZodBoolean;
|
164
|
+
slug: z.ZodString;
|
165
|
+
}, "strip", z.ZodTypeAny, {
|
166
|
+
active: boolean;
|
167
|
+
slug: string;
|
168
|
+
displayName: string;
|
169
|
+
emailAddress: string;
|
170
|
+
}, {
|
171
|
+
active: boolean;
|
172
|
+
slug: string;
|
173
|
+
displayName: string;
|
174
|
+
emailAddress: string;
|
175
|
+
}>, "many">;
|
176
|
+
scope: z.ZodObject<{
|
177
|
+
type: z.ZodUnion<[z.ZodLiteral<"REPOSITORY">, z.ZodLiteral<"PROJECT">]>;
|
178
|
+
}, "strip", z.ZodTypeAny, {
|
179
|
+
type: "REPOSITORY" | "PROJECT";
|
180
|
+
}, {
|
181
|
+
type: "REPOSITORY" | "PROJECT";
|
182
|
+
}>;
|
183
|
+
}, "strip", z.ZodTypeAny, {
|
184
|
+
name: string;
|
185
|
+
scope: {
|
186
|
+
type: "REPOSITORY" | "PROJECT";
|
187
|
+
};
|
188
|
+
users: {
|
189
|
+
active: boolean;
|
190
|
+
slug: string;
|
191
|
+
displayName: string;
|
192
|
+
emailAddress: string;
|
193
|
+
}[];
|
194
|
+
}, {
|
195
|
+
name: string;
|
196
|
+
scope: {
|
197
|
+
type: "REPOSITORY" | "PROJECT";
|
198
|
+
};
|
199
|
+
users: {
|
200
|
+
active: boolean;
|
201
|
+
slug: string;
|
202
|
+
displayName: string;
|
203
|
+
emailAddress: string;
|
204
|
+
}[];
|
205
|
+
}>, "many">;
|
110
206
|
export declare const isEmail: (value: string) => boolean;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.isEmail = exports.PullRequestActivity = exports.PullRequestCommentActivity = exports.Comment = exports.Files = exports.UsersSchema = exports.UserSchema = void 0;
|
3
|
+
exports.isEmail = exports.ReviewerGroups = exports.ReviewerGroup = exports.PullRequestActivity = exports.PullRequestCommentActivity = exports.Comment = exports.Files = exports.UsersSchema = exports.UserSchema = void 0;
|
4
4
|
const zod_1 = require("zod");
|
5
5
|
exports.UserSchema = zod_1.z.object({
|
6
6
|
displayName: zod_1.z.string(),
|
@@ -23,6 +23,14 @@ exports.PullRequestActivity = zod_1.z.union([
|
|
23
23
|
zod_1.z.object({ action: zod_1.z.string() }),
|
24
24
|
exports.PullRequestCommentActivity,
|
25
25
|
]);
|
26
|
+
exports.ReviewerGroup = zod_1.z.object({
|
27
|
+
name: zod_1.z.string(),
|
28
|
+
users: zod_1.z.array(exports.UserSchema),
|
29
|
+
scope: zod_1.z.object({
|
30
|
+
type: zod_1.z.union([zod_1.z.literal('REPOSITORY'), zod_1.z.literal('PROJECT')]),
|
31
|
+
}),
|
32
|
+
});
|
33
|
+
exports.ReviewerGroups = zod_1.z.array(exports.ReviewerGroup);
|
26
34
|
const EmailSchema = zod_1.z.string().email();
|
27
35
|
const isEmail = (value) => EmailSchema.safeParse(value).success;
|
28
36
|
exports.isEmail = isEmail;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../lib/modules/platform/bitbucket-server/schema.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAEX,QAAA,UAAU,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE;IACnB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAC;AAEU,QAAA,WAAW,GAAG,OAAC,CAAC,KAAK,CAAC,kBAAU,CAAC,CAAC;AAElC,QAAA,KAAK,GAAG,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAE5B,QAAA,OAAO,GAAG,OAAC,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;CACf,CAAC,CAAC;AAIU,QAAA,0BAA0B,GAAG,OAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC9B,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;IACzB,OAAO,EAAE,eAAO;CACjB,CAAC,CAAC;AAMU,QAAA,mBAAmB,GAAG,OAAC,CAAC,KAAK,CAAC;IACzC,OAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAChC,kCAA0B;CAC3B,CAAC,CAAC;
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../lib/modules/platform/bitbucket-server/schema.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAEX,QAAA,UAAU,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE;IACnB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAC;AAEU,QAAA,WAAW,GAAG,OAAC,CAAC,KAAK,CAAC,kBAAU,CAAC,CAAC;AAElC,QAAA,KAAK,GAAG,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAE5B,QAAA,OAAO,GAAG,OAAC,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;CACf,CAAC,CAAC;AAIU,QAAA,0BAA0B,GAAG,OAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC9B,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;IACzB,OAAO,EAAE,eAAO;CACjB,CAAC,CAAC;AAMU,QAAA,mBAAmB,GAAG,OAAC,CAAC,KAAK,CAAC;IACzC,OAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAChC,kCAA0B;CAC3B,CAAC,CAAC;AAIU,QAAA,aAAa,GAAG,OAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,kBAAU,CAAC;IAC1B,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,OAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;KAC/D,CAAC;CACH,CAAC,CAAC;AAEU,QAAA,cAAc,GAAG,OAAC,CAAC,KAAK,CAAC,qBAAa,CAAC,CAAC;AAErD,MAAM,WAAW,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AAEhC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAW,EAAE,CAChD,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAD1B,QAAA,OAAO,WACmB","sourcesContent":["import { z } from 'zod';\n\nexport const UserSchema = z.object({\n displayName: z.string(),\n emailAddress: z.string(),\n active: z.boolean(),\n slug: z.string(),\n});\n\nexport const UsersSchema = z.array(UserSchema);\n\nexport const Files = z.array(z.string());\n\nexport const Comment = z.object({\n text: z.string(),\n id: z.number(),\n});\n\nexport type Comment = z.infer<typeof Comment>;\n\nexport const PullRequestCommentActivity = z.object({\n action: z.literal('COMMENTED'),\n commentAction: z.string(),\n comment: Comment,\n});\n\nexport type PullRequestCommentActivity = z.infer<\n typeof PullRequestCommentActivity\n>;\n\nexport const PullRequestActivity = z.union([\n z.object({ action: z.string() }),\n PullRequestCommentActivity,\n]);\n\nexport type PullRequestActivity = z.infer<typeof PullRequestActivity>;\n\nexport const ReviewerGroup = z.object({\n name: z.string(),\n users: z.array(UserSchema),\n scope: z.object({\n type: z.union([z.literal('REPOSITORY'), z.literal('PROJECT')]),\n }),\n});\n\nexport const ReviewerGroups = z.array(ReviewerGroup);\n\nconst EmailSchema = z.string().email();\n\nexport const isEmail = (value: string): boolean =>\n EmailSchema.safeParse(value).success;\n"]}
|
@@ -18,3 +18,5 @@ export declare function isInvalidReviewersResponse(err: BitbucketError): boolean
|
|
18
18
|
export declare function getInvalidReviewers(err: BitbucketError): string[];
|
19
19
|
export declare function getRepoGitUrl(repository: string, defaultEndpoint: string, gitUrl: GitUrlOption | undefined, info: BbsRestRepo, opts: HostRule): string;
|
20
20
|
export declare function getExtraCloneOpts(opts: HostRule): GitOptions;
|
21
|
+
export declare function splitEscapedSpaces(str: string): string[];
|
22
|
+
export declare function parseModifier(value: string): number | null;
|
@@ -6,6 +6,8 @@ exports.isInvalidReviewersResponse = isInvalidReviewersResponse;
|
|
6
6
|
exports.getInvalidReviewers = getInvalidReviewers;
|
7
7
|
exports.getRepoGitUrl = getRepoGitUrl;
|
8
8
|
exports.getExtraCloneOpts = getExtraCloneOpts;
|
9
|
+
exports.splitEscapedSpaces = splitEscapedSpaces;
|
10
|
+
exports.parseModifier = parseModifier;
|
9
11
|
const tslib_1 = require("tslib");
|
10
12
|
// SEE for the reference https://github.com/renovatebot/renovate/blob/c3e9e572b225085448d94aa121c7ec81c14d3955/lib/platform/bitbucket/utils.js
|
11
13
|
const node_url_1 = require("node:url");
|
@@ -13,6 +15,7 @@ const is_1 = tslib_1.__importDefault(require("@sindresorhus/is"));
|
|
13
15
|
const error_messages_1 = require("../../../constants/error-messages");
|
14
16
|
const logger_1 = require("../../../logger");
|
15
17
|
const git = tslib_1.__importStar(require("../../../util/git"));
|
18
|
+
const regex_1 = require("../../../util/regex");
|
16
19
|
const url_1 = require("../../../util/url");
|
17
20
|
const pr_body_1 = require("../pr-body");
|
18
21
|
exports.BITBUCKET_INVALID_REVIEWERS_EXCEPTION = 'com.atlassian.bitbucket.pull.InvalidPullRequestReviewersException';
|
@@ -109,4 +112,26 @@ function getExtraCloneOpts(opts) {
|
|
109
112
|
}
|
110
113
|
return {};
|
111
114
|
}
|
115
|
+
function splitEscapedSpaces(str) {
|
116
|
+
const parts = str.split(' ');
|
117
|
+
const result = [];
|
118
|
+
let last;
|
119
|
+
for (const part of parts) {
|
120
|
+
if (last?.endsWith('\\\\')) {
|
121
|
+
result[result.length - 1] = last.slice(0, -2) + ' ' + part;
|
122
|
+
}
|
123
|
+
else {
|
124
|
+
result.push(part);
|
125
|
+
}
|
126
|
+
last = result.at(-1);
|
127
|
+
}
|
128
|
+
return result;
|
129
|
+
}
|
130
|
+
function parseModifier(value) {
|
131
|
+
const match = (0, regex_1.regEx)('^random(?:\\((\\d+)\\))?$').exec(value);
|
132
|
+
if (!match) {
|
133
|
+
return null;
|
134
|
+
}
|
135
|
+
return parseInt(match[1] ?? '1');
|
136
|
+
}
|
112
137
|
//# sourceMappingURL=utils.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/modules/platform/bitbucket-server/utils.ts"],"names":[],"mappings":";;;
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/modules/platform/bitbucket-server/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// SEE for the reference https://github.com/renovatebot/renovate/blob/c3e9e572b225085448d94aa121c7ec81c14d3955/lib/platform/bitbucket/utils.js\nimport { URL } from 'node:url';\nimport is from '@sindresorhus/is';\nimport { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport type { HostRule } from '../../../types';\nimport type { GitOptions, GitProtocol } from '../../../types/git';\nimport * as git from '../../../util/git';\nimport { regEx } from '../../../util/regex';\nimport { parseUrl } from '../../../util/url';\nimport { getPrBodyStruct } from '../pr-body';\nimport type { GitUrlOption } from '../types';\nimport type { BbsPr, BbsRestPr, BbsRestRepo, BitbucketError } from './types';\n\nexport const BITBUCKET_INVALID_REVIEWERS_EXCEPTION =\n 'com.atlassian.bitbucket.pull.InvalidPullRequestReviewersException';\n\n// https://docs.atlassian.com/bitbucket-server/rest/6.0.0/bitbucket-rest.html#idp250\nconst prStateMapping: any = {\n MERGED: 'merged',\n DECLINED: 'closed',\n OPEN: 'open',\n};\n\nexport function prInfo(pr: BbsRestPr): BbsPr {\n return {\n version: pr.version,\n number: pr.id,\n bodyStruct: getPrBodyStruct(pr.description),\n sourceBranch: pr.fromRef.displayId,\n targetBranch: pr.toRef.displayId,\n title: pr.title,\n state: prStateMapping[pr.state],\n createdAt: pr.createdDate,\n };\n}\n\nexport interface BitbucketCommitStatus {\n failed: number;\n inProgress: number;\n successful: number;\n}\n\nexport type BitbucketBranchState =\n | 'SUCCESSFUL'\n | 'FAILED'\n | 'INPROGRESS'\n | 'STOPPED';\n\nexport interface BitbucketStatus {\n key: string;\n state: BitbucketBranchState;\n}\n\nexport function isInvalidReviewersResponse(err: BitbucketError): boolean {\n const errors = err?.response?.body?.errors ?? [];\n return (\n errors.length > 0 &&\n errors.every(\n (error) => error.exceptionName === BITBUCKET_INVALID_REVIEWERS_EXCEPTION,\n )\n );\n}\n\nexport function getInvalidReviewers(err: BitbucketError): string[] {\n const errors = err?.response?.body?.errors ?? [];\n let invalidReviewers: string[] = [];\n for (const error of errors) {\n if (error.exceptionName === BITBUCKET_INVALID_REVIEWERS_EXCEPTION) {\n invalidReviewers = invalidReviewers.concat(\n error.reviewerErrors\n ?.map(({ context }) => context)\n .filter(is.nonEmptyString) ?? [],\n );\n }\n }\n\n return invalidReviewers;\n}\n\nfunction generateUrlFromEndpoint(\n defaultEndpoint: string,\n opts: HostRule,\n repository: string,\n): string {\n const url = new URL(defaultEndpoint);\n const generatedUrl = git.getUrl({\n protocol: url.protocol as GitProtocol,\n // TODO: types (#22198)\n auth: `${opts.username}:${opts.password}`,\n host: `${url.host}${url.pathname}${\n /* v8 ignore start */\n url.pathname.endsWith('/') ? '' : '/'\n /* v8 ignore stop */\n }scm`,\n repository,\n });\n logger.debug(`Using generated endpoint URL: ${generatedUrl}`);\n return generatedUrl;\n}\n\nfunction injectAuth(url: string, opts: HostRule): string {\n const repoUrl = parseUrl(url)!;\n if (!repoUrl) {\n logger.debug(`Invalid url: ${url}`);\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n if (!opts.token && opts.username && opts.password) {\n repoUrl.username = opts.username;\n repoUrl.password = opts.password;\n }\n return repoUrl.toString();\n}\n\nexport function getRepoGitUrl(\n repository: string,\n defaultEndpoint: string,\n gitUrl: GitUrlOption | undefined,\n info: BbsRestRepo,\n opts: HostRule,\n): string {\n if (gitUrl === 'ssh') {\n const sshUrl = info.links.clone?.find(({ name }) => name === 'ssh');\n if (sshUrl === undefined) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n logger.debug(`Using ssh URL: ${sshUrl.href}`);\n return sshUrl.href;\n }\n let cloneUrl = info.links.clone?.find(({ name }) => name === 'http');\n if (cloneUrl) {\n // Inject auth into the API provided URL\n return injectAuth(cloneUrl.href, opts);\n }\n // Http access might be disabled, try to find ssh url in this case\n cloneUrl = info.links.clone?.find(({ name }) => name === 'ssh');\n if (gitUrl === 'endpoint' || !cloneUrl) {\n return generateUrlFromEndpoint(defaultEndpoint, opts, repository);\n }\n // SSH urls can be used directly\n return cloneUrl.href;\n}\n\nexport function getExtraCloneOpts(opts: HostRule): GitOptions {\n if (opts.token) {\n return {\n '-c': `http.extraHeader=Authorization: Bearer ${opts.token}`,\n };\n }\n return {};\n}\n\nexport function splitEscapedSpaces(str: string): string[] {\n const parts = str.split(' ');\n const result: string[] = [];\n let last: string | undefined;\n\n for (const part of parts) {\n if (last?.endsWith('\\\\\\\\')) {\n result[result.length - 1] = last.slice(0, -2) + ' ' + part;\n } else {\n result.push(part);\n }\n last = result.at(-1);\n }\n\n return result;\n}\n\nexport function parseModifier(value: string): number | null {\n const match = regEx('^random(?:\\\\((\\\\d+)\\\\))?$').exec(value);\n if (!match) {\n return null;\n }\n return parseInt(match[1] ?? '1');\n}\n"]}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "renovate",
|
3
3
|
"description": "Automated dependency updates. Flexible so you don't need to be.",
|
4
|
-
"version": "42.0.0-next.
|
4
|
+
"version": "42.0.0-next.2",
|
5
5
|
"type": "commonjs",
|
6
6
|
"bin": {
|
7
7
|
"renovate": "dist/renovate.js",
|
@@ -347,7 +347,7 @@
|
|
347
347
|
"typescript": "5.8.3",
|
348
348
|
"typescript-eslint": "8.39.0",
|
349
349
|
"unified": "11.0.5",
|
350
|
-
"vite": "7.0
|
350
|
+
"vite": "7.1.0",
|
351
351
|
"vite-tsconfig-paths": "5.1.4",
|
352
352
|
"vitest": "3.2.4",
|
353
353
|
"vitest-mock-extended": "3.1.0"
|