renovate 43.46.0 → 43.46.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/datasource/docker/dockerhub-cache.js +1 -1
- package/dist/modules/datasource/docker/dockerhub-cache.js.map +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
- package/dist/modules/datasource/nuget/common.js +1 -1
- package/dist/modules/datasource/nuget/common.js.map +1 -1
- package/dist/modules/manager/npm/extract/yarn.js +1 -1
- package/dist/modules/manager/npm/extract/yarn.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/utils.js +1 -1
- package/dist/modules/platform/bitbucket-server/utils.js.map +1 -1
- package/dist/modules/platform/codecommit/index.js +2 -2
- package/dist/modules/platform/codecommit/index.js.map +1 -1
- package/dist/modules/platform/gerrit/utils.js +1 -1
- package/dist/modules/platform/gerrit/utils.js.map +1 -1
- package/dist/modules/platform/scm-manager/mapper.js +1 -1
- package/dist/modules/platform/scm-manager/mapper.js.map +1 -1
- package/dist/modules/versioning/azure-rest-api/index.js +1 -1
- package/dist/modules/versioning/azure-rest-api/index.js.map +1 -1
- package/dist/modules/versioning/bazel-module/bzlmod-version.js +1 -1
- package/dist/modules/versioning/bazel-module/bzlmod-version.js.map +1 -1
- package/dist/modules/versioning/conan/common.js +1 -1
- package/dist/modules/versioning/conan/common.js.map +1 -1
- package/dist/modules/versioning/deb/index.js +2 -2
- package/dist/modules/versioning/deb/index.js.map +1 -1
- package/dist/modules/versioning/glasskube/index.js +1 -1
- package/dist/modules/versioning/glasskube/index.js.map +1 -1
- package/dist/modules/versioning/gradle/compare.js +1 -1
- package/dist/modules/versioning/gradle/compare.js.map +1 -1
- package/dist/modules/versioning/hermit/index.js +10 -10
- package/dist/modules/versioning/hermit/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +1 -1
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/nixpkgs/index.js +2 -2
- package/dist/modules/versioning/nixpkgs/index.js.map +1 -1
- package/dist/modules/versioning/nuget/parser.js +9 -9
- package/dist/modules/versioning/nuget/parser.js.map +1 -1
- package/dist/modules/versioning/nuget/version.js +1 -1
- package/dist/modules/versioning/nuget/version.js.map +1 -1
- package/dist/modules/versioning/pep440/range.js +1 -1
- package/dist/modules/versioning/pep440/range.js.map +1 -1
- package/dist/modules/versioning/perl/index.js +2 -2
- package/dist/modules/versioning/perl/index.js.map +1 -1
- package/dist/modules/versioning/poetry/transform.js +1 -1
- package/dist/modules/versioning/poetry/transform.js.map +1 -1
- package/dist/modules/versioning/pvp/util.js +1 -1
- package/dist/modules/versioning/pvp/util.js.map +1 -1
- package/dist/modules/versioning/redhat/index.js +5 -5
- package/dist/modules/versioning/redhat/index.js.map +1 -1
- package/dist/modules/versioning/regex/index.js +5 -5
- package/dist/modules/versioning/regex/index.js.map +1 -1
- package/dist/modules/versioning/rpm/index.js +2 -2
- package/dist/modules/versioning/rpm/index.js.map +1 -1
- package/dist/modules/versioning/ruby/version.js +1 -1
- package/dist/modules/versioning/ruby/version.js.map +1 -1
- package/dist/modules/versioning/rust-release-channel/parse.js +7 -7
- package/dist/modules/versioning/rust-release-channel/parse.js.map +1 -1
- package/dist/modules/versioning/ubuntu/common.js +1 -1
- package/dist/modules/versioning/ubuntu/common.js.map +1 -1
- package/dist/modules/versioning/ubuntu/index.js +3 -3
- package/dist/modules/versioning/ubuntu/index.js.map +1 -1
- package/dist/modules/versioning/unity3d/index.js +4 -4
- package/dist/modules/versioning/unity3d/index.js.map +1 -1
- package/dist/modules/versioning/unity3d-packages/index.js +3 -3
- package/dist/modules/versioning/unity3d-packages/index.js.map +1 -1
- package/dist/util/git/auth.js +1 -1
- package/dist/util/git/auth.js.map +1 -1
- package/dist/util/http/forgejo.js +2 -2
- package/dist/util/http/forgejo.js.map +1 -1
- package/dist/util/http/gitea.js +2 -2
- package/dist/util/http/gitea.js.map +1 -1
- package/dist/util/http/github.js +1 -1
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/retry-after.js +1 -1
- package/dist/util/http/retry-after.js.map +1 -1
- package/dist/util/number.js +1 -1
- package/dist/util/number.js.map +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js +2 -2
- package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
- package/package.json +9 -9
- package/renovate-schema.json +2 -2
|
@@ -46,7 +46,7 @@ var DockerHubCache = class DockerHubCache {
|
|
|
46
46
|
this.cache.updatedAt = updatedAt;
|
|
47
47
|
if (earliestDate && latestDate) {
|
|
48
48
|
for (const [key, item] of Object.entries(this.cache.items)) {
|
|
49
|
-
const id = parseInt(key);
|
|
49
|
+
const id = parseInt(key, 10);
|
|
50
50
|
const itemDate = DateTime.fromISO(item.last_updated);
|
|
51
51
|
if (itemDate < earliestDate || itemDate > latestDate || this.reconciledIds.has(id)) continue;
|
|
52
52
|
delete this.cache.items[id];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dockerhub-cache.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/docker/dockerhub-cache.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport type { DockerHubTag } from './schema.ts';\n\nexport interface DockerHubCacheData {\n items: Record<number, DockerHubTag>;\n updatedAt: string | null;\n}\n\nconst cacheNamespace = 'datasource-docker-hub-cache';\n\nexport class DockerHubCache {\n private isChanged = false;\n private reconciledIds = new Set<number>();\n private dockerRepository: string;\n private cache: DockerHubCacheData;\n\n private constructor(dockerRepository: string, cache: DockerHubCacheData) {\n this.dockerRepository = dockerRepository;\n this.cache = cache;\n }\n\n static async init(dockerRepository: string): Promise<DockerHubCache> {\n let repoCache = await packageCache.get<DockerHubCacheData>(\n cacheNamespace,\n dockerRepository,\n );\n\n repoCache ??= {\n items: {},\n updatedAt: null,\n };\n\n return new DockerHubCache(dockerRepository, repoCache);\n }\n\n reconcile(items: DockerHubTag[], expectedCount: number): boolean {\n let needNextPage = true;\n\n let earliestDate = null;\n\n let { updatedAt } = this.cache;\n let latestDate = updatedAt ? DateTime.fromISO(updatedAt) : null;\n\n for (const newItem of items) {\n const id = newItem.id;\n this.reconciledIds.add(id);\n\n const oldItem = this.cache.items[id];\n\n const itemDate = DateTime.fromISO(newItem.last_updated);\n\n if (!earliestDate || earliestDate > itemDate) {\n earliestDate = itemDate;\n }\n\n if (!latestDate || latestDate < itemDate) {\n latestDate = itemDate;\n updatedAt = newItem.last_updated;\n }\n\n if (dequal(oldItem, newItem)) {\n needNextPage = false;\n continue;\n }\n\n this.cache.items[newItem.id] = newItem;\n this.isChanged = true;\n }\n\n this.cache.updatedAt = updatedAt;\n\n if (earliestDate && latestDate) {\n for (const [key, item] of Object.entries(this.cache.items)) {\n const id = parseInt(key);\n\n const itemDate = DateTime.fromISO(item.last_updated);\n\n if (\n itemDate < earliestDate ||\n itemDate > latestDate ||\n this.reconciledIds.has(id)\n ) {\n continue;\n }\n\n delete this.cache.items[id];\n this.isChanged = true;\n }\n\n if (Object.keys(this.cache.items).length > expectedCount) {\n return true;\n }\n }\n\n return needNextPage;\n }\n\n async save(): Promise<void> {\n if (this.isChanged) {\n await packageCache.set(\n cacheNamespace,\n this.dockerRepository,\n this.cache,\n 3 * 60 * 24 * 30,\n );\n }\n }\n\n getItems(): DockerHubTag[] {\n return Object.values(this.cache.items);\n }\n}\n"],"mappings":";;;;;AAUA,MAAM,iBAAiB;AAEvB,IAAa,iBAAb,MAAa,eAAe;CAC1B,AAAQ,YAAY;CACpB,AAAQ,gCAAgB,IAAI,KAAa;CACzC,AAAQ;CACR,AAAQ;CAER,AAAQ,YAAY,kBAA0B,OAA2B;AACvE,OAAK,mBAAmB;AACxB,OAAK,QAAQ;;CAGf,aAAa,KAAK,kBAAmD;EACnE,IAAI,YAAY,MAAMA,IACpB,gBACA,iBACD;AAED,gBAAc;GACZ,OAAO,EAAE;GACT,WAAW;GACZ;AAED,SAAO,IAAI,eAAe,kBAAkB,UAAU;;CAGxD,UAAU,OAAuB,eAAgC;EAC/D,IAAI,eAAe;EAEnB,IAAI,eAAe;EAEnB,IAAI,EAAE,cAAc,KAAK;EACzB,IAAI,aAAa,YAAY,SAAS,QAAQ,UAAU,GAAG;AAE3D,OAAK,MAAM,WAAW,OAAO;GAC3B,MAAM,KAAK,QAAQ;AACnB,QAAK,cAAc,IAAI,GAAG;GAE1B,MAAM,UAAU,KAAK,MAAM,MAAM;GAEjC,MAAM,WAAW,SAAS,QAAQ,QAAQ,aAAa;AAEvD,OAAI,CAAC,gBAAgB,eAAe,SAClC,gBAAe;AAGjB,OAAI,CAAC,cAAc,aAAa,UAAU;AACxC,iBAAa;AACb,gBAAY,QAAQ;;AAGtB,OAAI,OAAO,SAAS,QAAQ,EAAE;AAC5B,mBAAe;AACf;;AAGF,QAAK,MAAM,MAAM,QAAQ,MAAM;AAC/B,QAAK,YAAY;;AAGnB,OAAK,MAAM,YAAY;AAEvB,MAAI,gBAAgB,YAAY;AAC9B,QAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,MAAM,MAAM,EAAE;IAC1D,MAAM,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"dockerhub-cache.js","names":["packageCache.get","packageCache.set"],"sources":["../../../../lib/modules/datasource/docker/dockerhub-cache.ts"],"sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport type { DockerHubTag } from './schema.ts';\n\nexport interface DockerHubCacheData {\n items: Record<number, DockerHubTag>;\n updatedAt: string | null;\n}\n\nconst cacheNamespace = 'datasource-docker-hub-cache';\n\nexport class DockerHubCache {\n private isChanged = false;\n private reconciledIds = new Set<number>();\n private dockerRepository: string;\n private cache: DockerHubCacheData;\n\n private constructor(dockerRepository: string, cache: DockerHubCacheData) {\n this.dockerRepository = dockerRepository;\n this.cache = cache;\n }\n\n static async init(dockerRepository: string): Promise<DockerHubCache> {\n let repoCache = await packageCache.get<DockerHubCacheData>(\n cacheNamespace,\n dockerRepository,\n );\n\n repoCache ??= {\n items: {},\n updatedAt: null,\n };\n\n return new DockerHubCache(dockerRepository, repoCache);\n }\n\n reconcile(items: DockerHubTag[], expectedCount: number): boolean {\n let needNextPage = true;\n\n let earliestDate = null;\n\n let { updatedAt } = this.cache;\n let latestDate = updatedAt ? DateTime.fromISO(updatedAt) : null;\n\n for (const newItem of items) {\n const id = newItem.id;\n this.reconciledIds.add(id);\n\n const oldItem = this.cache.items[id];\n\n const itemDate = DateTime.fromISO(newItem.last_updated);\n\n if (!earliestDate || earliestDate > itemDate) {\n earliestDate = itemDate;\n }\n\n if (!latestDate || latestDate < itemDate) {\n latestDate = itemDate;\n updatedAt = newItem.last_updated;\n }\n\n if (dequal(oldItem, newItem)) {\n needNextPage = false;\n continue;\n }\n\n this.cache.items[newItem.id] = newItem;\n this.isChanged = true;\n }\n\n this.cache.updatedAt = updatedAt;\n\n if (earliestDate && latestDate) {\n for (const [key, item] of Object.entries(this.cache.items)) {\n const id = parseInt(key, 10);\n\n const itemDate = DateTime.fromISO(item.last_updated);\n\n if (\n itemDate < earliestDate ||\n itemDate > latestDate ||\n this.reconciledIds.has(id)\n ) {\n continue;\n }\n\n delete this.cache.items[id];\n this.isChanged = true;\n }\n\n if (Object.keys(this.cache.items).length > expectedCount) {\n return true;\n }\n }\n\n return needNextPage;\n }\n\n async save(): Promise<void> {\n if (this.isChanged) {\n await packageCache.set(\n cacheNamespace,\n this.dockerRepository,\n this.cache,\n 3 * 60 * 24 * 30,\n );\n }\n }\n\n getItems(): DockerHubTag[] {\n return Object.values(this.cache.items);\n }\n}\n"],"mappings":";;;;;AAUA,MAAM,iBAAiB;AAEvB,IAAa,iBAAb,MAAa,eAAe;CAC1B,AAAQ,YAAY;CACpB,AAAQ,gCAAgB,IAAI,KAAa;CACzC,AAAQ;CACR,AAAQ;CAER,AAAQ,YAAY,kBAA0B,OAA2B;AACvE,OAAK,mBAAmB;AACxB,OAAK,QAAQ;;CAGf,aAAa,KAAK,kBAAmD;EACnE,IAAI,YAAY,MAAMA,IACpB,gBACA,iBACD;AAED,gBAAc;GACZ,OAAO,EAAE;GACT,WAAW;GACZ;AAED,SAAO,IAAI,eAAe,kBAAkB,UAAU;;CAGxD,UAAU,OAAuB,eAAgC;EAC/D,IAAI,eAAe;EAEnB,IAAI,eAAe;EAEnB,IAAI,EAAE,cAAc,KAAK;EACzB,IAAI,aAAa,YAAY,SAAS,QAAQ,UAAU,GAAG;AAE3D,OAAK,MAAM,WAAW,OAAO;GAC3B,MAAM,KAAK,QAAQ;AACnB,QAAK,cAAc,IAAI,GAAG;GAE1B,MAAM,UAAU,KAAK,MAAM,MAAM;GAEjC,MAAM,WAAW,SAAS,QAAQ,QAAQ,aAAa;AAEvD,OAAI,CAAC,gBAAgB,eAAe,SAClC,gBAAe;AAGjB,OAAI,CAAC,cAAc,aAAa,UAAU;AACxC,iBAAa;AACb,gBAAY,QAAQ;;AAGtB,OAAI,OAAO,SAAS,QAAQ,EAAE;AAC5B,mBAAe;AACf;;AAGF,QAAK,MAAM,MAAM,QAAQ,MAAM;AAC/B,QAAK,YAAY;;AAGnB,OAAK,MAAM,YAAY;AAEvB,MAAI,gBAAgB,YAAY;AAC9B,QAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,MAAM,MAAM,EAAE;IAC1D,MAAM,KAAK,SAAS,KAAK,GAAG;IAE5B,MAAM,WAAW,SAAS,QAAQ,KAAK,aAAa;AAEpD,QACE,WAAW,gBACX,WAAW,cACX,KAAK,cAAc,IAAI,GAAG,CAE1B;AAGF,WAAO,KAAK,MAAM,MAAM;AACxB,SAAK,YAAY;;AAGnB,OAAI,OAAO,KAAK,KAAK,MAAM,MAAM,CAAC,SAAS,cACzC,QAAO;;AAIX,SAAO;;CAGT,MAAM,OAAsB;AAC1B,MAAI,KAAK,UACP,OAAMC,IACJ,gBACA,KAAK,kBACL,KAAK,OACL,OAAc,GACf;;CAIL,WAA2B;AACzB,SAAO,OAAO,OAAO,KAAK,MAAM,MAAM"}
|
|
@@ -127,7 +127,7 @@ var GoProxyDatasource = class GoProxyDatasource extends Datasource {
|
|
|
127
127
|
const majorSuffixSeparator = isGopkgin ? "." : "/";
|
|
128
128
|
const modParts = packageName.match(modRegex)?.groups;
|
|
129
129
|
const baseMod = modParts?.baseMod ?? packageName;
|
|
130
|
-
const packageMajor = parseInt(modParts?.majorVersion ?? "0");
|
|
130
|
+
const packageMajor = parseInt(modParts?.majorVersion ?? "0", 10);
|
|
131
131
|
const result = { releases: [] };
|
|
132
132
|
for (let major = packageMajor;; major += 1) {
|
|
133
133
|
let pkg = `${baseMod}${majorSuffixSeparator}v${major}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"releases-goproxy.js","names":["p.map","HttpError","goVersioning"],"sources":["../../../../lib/modules/datasource/go/releases-goproxy.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace, isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport goVersioning from '../../versioning/go-mod-directive/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BaseGoDatasource } from './base.ts';\nimport { getSourceUrl } from './common.ts';\nimport { parseGoproxy, parseNoproxy } from './goproxy-parser.ts';\nimport { GoDirectDatasource } from './releases-direct.ts';\nimport type { VersionInfo } from './types.ts';\n\nconst modRegex = regEx(/^(?<baseMod>.*?)(?:[./]v(?<majorVersion>\\d+))?$/);\n\n/**\n * @see https://go.dev/ref/mod#pseudo-versions\n */\nconst pseudoVersionRegex = regEx(\n /v\\d+\\.\\d+\\.\\d+-(?:\\w+\\.)?(?:0\\.)?(?<timestamp>\\d{14})-(?<digest>[a-f0-9]{12})/i,\n);\n\nexport function pseudoVersionToRelease(pseudoVersion: string): Release | null {\n const match = pseudoVersion.match(pseudoVersionRegex)?.groups;\n if (!match) {\n return null;\n }\n\n const { digest: newDigest, timestamp } = match;\n const releaseTimestamp = asTimestamp(timestamp);\n\n return {\n version: pseudoVersion,\n newDigest,\n releaseTimestamp,\n };\n}\n\nexport class GoProxyDatasource extends Datasource {\n static readonly id = 'go-proxy';\n\n constructor() {\n super(GoProxyDatasource.id);\n }\n\n readonly direct = new GoDirectDatasource();\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName } = config;\n logger.trace(`goproxy.getReleases(${packageName})`);\n const goproxy = getEnv().GOPROXY ?? 'https://proxy.golang.org,direct';\n if (goproxy === 'direct') {\n return this.direct.getReleases(config);\n }\n const proxyList = parseGoproxy(goproxy);\n const noproxy = parseNoproxy();\n\n let result: ReleaseResult | null = null;\n\n if (noproxy?.test(packageName)) {\n logger.debug(`Fetching ${packageName} via GONOPROXY match`);\n result = await this.direct.getReleases(config);\n return result;\n }\n\n for (const { url, fallback } of proxyList) {\n try {\n if (url === 'off') {\n break;\n } else if (url === 'direct') {\n result = await this.direct.getReleases(config);\n break;\n }\n\n const res = await this.getVersionsWithInfo(url, packageName);\n if (res.releases.length) {\n result = res;\n break;\n }\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const statusCode = potentialHttpError?.response?.statusCode;\n const canFallback =\n fallback === '|' ? true : statusCode === 404 || statusCode === 410;\n const msg = canFallback\n ? 'Goproxy error: trying next URL provided with GOPROXY'\n : 'Goproxy error: skipping other URLs provided with GOPROXY';\n logger.debug({ err }, msg);\n if (!canFallback) {\n break;\n }\n }\n }\n\n if (result && !result.sourceUrl) {\n try {\n const datasource = await BaseGoDatasource.getDatasource(packageName);\n const sourceUrl = getSourceUrl(datasource);\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n } catch (err) {\n logger.trace({ err }, `Can't get datasource for ${packageName}`);\n }\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Avoid ambiguity when serving from case-insensitive file systems.\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\n encodeCase(input: string): string {\n return input.replace(regEx(/([A-Z])/g), (x) => `!${x.toLowerCase()}`);\n }\n\n async listVersions(baseUrl: string, packageName: string): Promise<Release[]> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n 'list',\n );\n const { body } = await this.http.getText(url);\n return filterMap(body.split(newlineRegex), (str) => {\n if (!isNonEmptyStringAndNotWhitespace(str)) {\n return null;\n }\n\n const [version, timestamp] = str.trim().split(regEx(/\\s+/));\n const release: Release = pseudoVersionToRelease(version) ?? { version };\n\n const releaseTimestamp = asTimestamp(timestamp);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n return release;\n });\n }\n\n async versionInfo(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<Release> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.info`,\n );\n const res = await this.http.getJsonUnchecked<VersionInfo>(url);\n\n const result: Release = {\n version: res.body.Version,\n };\n\n const releaseTimestamp = asTimestamp(res.body.Time);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n return result;\n }\n\n async getLatestVersion(\n baseUrl: string,\n packageName: string,\n ): Promise<string | null> {\n try {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@latest',\n );\n const res = await this.http.getJsonUnchecked<VersionInfo>(url);\n return res.body.Version;\n } catch (err) {\n logger.trace({ err }, 'Failed to get latest version');\n return null;\n }\n }\n\n async getVersionsWithInfo(\n baseUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const isGopkgin = packageName.startsWith('gopkg.in/');\n const majorSuffixSeparator = isGopkgin ? '.' : '/';\n const modParts = packageName.match(modRegex)?.groups;\n const baseMod = modParts?.baseMod ?? /* v8 ignore next */ packageName;\n const packageMajor = parseInt(modParts?.majorVersion ?? '0');\n\n const result: ReleaseResult = { releases: [] };\n for (let major = packageMajor; ; major += 1) {\n let pkg = `${baseMod}${majorSuffixSeparator}v${major}`;\n if (!isGopkgin && major < 2) {\n pkg = baseMod;\n major += 1; // v0 and v1 are the same module\n }\n\n let releases: Release[] = [];\n\n try {\n const res = await this.listVersions(baseUrl, pkg);\n\n // Artifactory returns all versions in any major (past and future),\n // so starting from v2, we filter them in order to avoid the infinite loop\n const filteredReleases = res.filter(({ version }) => {\n if (major < 2) {\n return true;\n }\n\n return (\n version.split(regEx(/[^\\d]+/)).find(isTruthy) === major.toString()\n );\n });\n\n releases = await p.map(filteredReleases, async (versionInfo) => {\n const { version, newDigest, releaseTimestamp } = versionInfo;\n\n if (releaseTimestamp) {\n return { version, newDigest, releaseTimestamp };\n }\n\n try {\n return await this.versionInfo(baseUrl, pkg, version);\n } catch (err) {\n logger.trace({ err }, `Can't obtain data from ${baseUrl}`);\n return { version };\n }\n });\n result.releases.push(...releases);\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const status = potentialHttpError.response?.statusCode;\n if (\n potentialHttpError instanceof HttpError &&\n (status === 404 || status === 403) &&\n major !== packageMajor\n ) {\n break;\n }\n\n throw err;\n }\n\n const latestVersion = await this.getLatestVersion(baseUrl, pkg);\n if (latestVersion) {\n result.tags ??= {};\n result.tags.latest ??= latestVersion;\n if (goVersioning.isGreaterThan(latestVersion, result.tags.latest)) {\n result.tags.latest = latestVersion;\n }\n if (!result.releases.length) {\n const releaseFromLatest = pseudoVersionToRelease(latestVersion);\n if (releaseFromLatest) {\n result.releases.push(releaseFromLatest);\n }\n }\n }\n\n if (!releases.length) {\n break;\n }\n }\n\n return result;\n }\n\n static getCacheKey({ packageName }: GetReleasesConfig): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n // TODO: types (#22198)\n return `${packageName}@@${goproxy}@@${noproxy?.toString()}`;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"releases-goproxy.js","names":["p.map","HttpError","goVersioning"],"sources":["../../../../lib/modules/datasource/go/releases-goproxy.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace, isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport { HttpError } from '../../../util/http/index.ts';\nimport * as p from '../../../util/promises.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport goVersioning from '../../versioning/go-mod-directive/index.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, Release, ReleaseResult } from '../types.ts';\nimport { BaseGoDatasource } from './base.ts';\nimport { getSourceUrl } from './common.ts';\nimport { parseGoproxy, parseNoproxy } from './goproxy-parser.ts';\nimport { GoDirectDatasource } from './releases-direct.ts';\nimport type { VersionInfo } from './types.ts';\n\nconst modRegex = regEx(/^(?<baseMod>.*?)(?:[./]v(?<majorVersion>\\d+))?$/);\n\n/**\n * @see https://go.dev/ref/mod#pseudo-versions\n */\nconst pseudoVersionRegex = regEx(\n /v\\d+\\.\\d+\\.\\d+-(?:\\w+\\.)?(?:0\\.)?(?<timestamp>\\d{14})-(?<digest>[a-f0-9]{12})/i,\n);\n\nexport function pseudoVersionToRelease(pseudoVersion: string): Release | null {\n const match = pseudoVersion.match(pseudoVersionRegex)?.groups;\n if (!match) {\n return null;\n }\n\n const { digest: newDigest, timestamp } = match;\n const releaseTimestamp = asTimestamp(timestamp);\n\n return {\n version: pseudoVersion,\n newDigest,\n releaseTimestamp,\n };\n}\n\nexport class GoProxyDatasource extends Datasource {\n static readonly id = 'go-proxy';\n\n constructor() {\n super(GoProxyDatasource.id);\n }\n\n readonly direct = new GoDirectDatasource();\n\n private async _getReleases(\n config: GetReleasesConfig,\n ): Promise<ReleaseResult | null> {\n const { packageName } = config;\n logger.trace(`goproxy.getReleases(${packageName})`);\n const goproxy = getEnv().GOPROXY ?? 'https://proxy.golang.org,direct';\n if (goproxy === 'direct') {\n return this.direct.getReleases(config);\n }\n const proxyList = parseGoproxy(goproxy);\n const noproxy = parseNoproxy();\n\n let result: ReleaseResult | null = null;\n\n if (noproxy?.test(packageName)) {\n logger.debug(`Fetching ${packageName} via GONOPROXY match`);\n result = await this.direct.getReleases(config);\n return result;\n }\n\n for (const { url, fallback } of proxyList) {\n try {\n if (url === 'off') {\n break;\n } else if (url === 'direct') {\n result = await this.direct.getReleases(config);\n break;\n }\n\n const res = await this.getVersionsWithInfo(url, packageName);\n if (res.releases.length) {\n result = res;\n break;\n }\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const statusCode = potentialHttpError?.response?.statusCode;\n const canFallback =\n fallback === '|' ? true : statusCode === 404 || statusCode === 410;\n const msg = canFallback\n ? 'Goproxy error: trying next URL provided with GOPROXY'\n : 'Goproxy error: skipping other URLs provided with GOPROXY';\n logger.debug({ err }, msg);\n if (!canFallback) {\n break;\n }\n }\n }\n\n if (result && !result.sourceUrl) {\n try {\n const datasource = await BaseGoDatasource.getDatasource(packageName);\n const sourceUrl = getSourceUrl(datasource);\n if (sourceUrl) {\n result.sourceUrl = sourceUrl;\n }\n } catch (err) {\n logger.trace({ err }, `Can't get datasource for ${packageName}`);\n }\n }\n\n return result;\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${GoProxyDatasource.id}`,\n key: GoProxyDatasource.getCacheKey(config),\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n /**\n * Avoid ambiguity when serving from case-insensitive file systems.\n *\n * @see https://golang.org/ref/mod#goproxy-protocol\n */\n encodeCase(input: string): string {\n return input.replace(regEx(/([A-Z])/g), (x) => `!${x.toLowerCase()}`);\n }\n\n async listVersions(baseUrl: string, packageName: string): Promise<Release[]> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n 'list',\n );\n const { body } = await this.http.getText(url);\n return filterMap(body.split(newlineRegex), (str) => {\n if (!isNonEmptyStringAndNotWhitespace(str)) {\n return null;\n }\n\n const [version, timestamp] = str.trim().split(regEx(/\\s+/));\n const release: Release = pseudoVersionToRelease(version) ?? { version };\n\n const releaseTimestamp = asTimestamp(timestamp);\n if (releaseTimestamp) {\n release.releaseTimestamp = releaseTimestamp;\n }\n\n return release;\n });\n }\n\n async versionInfo(\n baseUrl: string,\n packageName: string,\n version: string,\n ): Promise<Release> {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@v',\n `${version}.info`,\n );\n const res = await this.http.getJsonUnchecked<VersionInfo>(url);\n\n const result: Release = {\n version: res.body.Version,\n };\n\n const releaseTimestamp = asTimestamp(res.body.Time);\n if (releaseTimestamp) {\n result.releaseTimestamp = releaseTimestamp;\n }\n\n return result;\n }\n\n async getLatestVersion(\n baseUrl: string,\n packageName: string,\n ): Promise<string | null> {\n try {\n const url = joinUrlParts(\n baseUrl,\n this.encodeCase(packageName),\n '@latest',\n );\n const res = await this.http.getJsonUnchecked<VersionInfo>(url);\n return res.body.Version;\n } catch (err) {\n logger.trace({ err }, 'Failed to get latest version');\n return null;\n }\n }\n\n async getVersionsWithInfo(\n baseUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const isGopkgin = packageName.startsWith('gopkg.in/');\n const majorSuffixSeparator = isGopkgin ? '.' : '/';\n const modParts = packageName.match(modRegex)?.groups;\n const baseMod = modParts?.baseMod ?? /* v8 ignore next */ packageName;\n const packageMajor = parseInt(modParts?.majorVersion ?? '0', 10);\n\n const result: ReleaseResult = { releases: [] };\n for (let major = packageMajor; ; major += 1) {\n let pkg = `${baseMod}${majorSuffixSeparator}v${major}`;\n if (!isGopkgin && major < 2) {\n pkg = baseMod;\n major += 1; // v0 and v1 are the same module\n }\n\n let releases: Release[] = [];\n\n try {\n const res = await this.listVersions(baseUrl, pkg);\n\n // Artifactory returns all versions in any major (past and future),\n // so starting from v2, we filter them in order to avoid the infinite loop\n const filteredReleases = res.filter(({ version }) => {\n if (major < 2) {\n return true;\n }\n\n return (\n version.split(regEx(/[^\\d]+/)).find(isTruthy) === major.toString()\n );\n });\n\n releases = await p.map(filteredReleases, async (versionInfo) => {\n const { version, newDigest, releaseTimestamp } = versionInfo;\n\n if (releaseTimestamp) {\n return { version, newDigest, releaseTimestamp };\n }\n\n try {\n return await this.versionInfo(baseUrl, pkg, version);\n } catch (err) {\n logger.trace({ err }, `Can't obtain data from ${baseUrl}`);\n return { version };\n }\n });\n result.releases.push(...releases);\n } catch (err) {\n const potentialHttpError =\n err instanceof ExternalHostError ? err.err : err;\n const status = potentialHttpError.response?.statusCode;\n if (\n potentialHttpError instanceof HttpError &&\n (status === 404 || status === 403) &&\n major !== packageMajor\n ) {\n break;\n }\n\n throw err;\n }\n\n const latestVersion = await this.getLatestVersion(baseUrl, pkg);\n if (latestVersion) {\n result.tags ??= {};\n result.tags.latest ??= latestVersion;\n if (goVersioning.isGreaterThan(latestVersion, result.tags.latest)) {\n result.tags.latest = latestVersion;\n }\n if (!result.releases.length) {\n const releaseFromLatest = pseudoVersionToRelease(latestVersion);\n if (releaseFromLatest) {\n result.releases.push(releaseFromLatest);\n }\n }\n }\n\n if (!releases.length) {\n break;\n }\n }\n\n return result;\n }\n\n static getCacheKey({ packageName }: GetReleasesConfig): string {\n const goproxy = getEnv().GOPROXY;\n const noproxy = parseNoproxy();\n // TODO: types (#22198)\n return `${packageName}@@${goproxy}@@${noproxy?.toString()}`;\n }\n}\n"],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ function parseRegistryUrl(registryUrl) {
|
|
|
30
30
|
if (protocolVersionMatch) {
|
|
31
31
|
const { protocol } = protocolVersionMatch;
|
|
32
32
|
parsedUrl.hash = "";
|
|
33
|
-
protocolVersion = Number.parseInt(protocol);
|
|
33
|
+
protocolVersion = Number.parseInt(protocol, 10);
|
|
34
34
|
} else if (parsedUrl.pathname.endsWith(".json")) protocolVersion = 3;
|
|
35
35
|
return {
|
|
36
36
|
feedUrl: parsedUrl.href,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/nuget/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { ParsedRegistryUrl } from './types.ts';\n\nconst buildMetaRe = regEx(/\\+.+$/g);\n\nexport function removeBuildMeta(version: string): string {\n return version.replace(buildMetaRe, '');\n}\n\nconst urlWhitespaceRe = regEx(/\\s/g);\n\nexport function massageUrl(url: string | null | undefined): string | null {\n if (url === null || url === undefined) {\n return null;\n }\n\n let resultUrl = url;\n\n // During `dotnet pack` certain URLs are being URL decoded which may introduce whitespace\n // and causes Markdown link generation problems.\n resultUrl = resultUrl.replace(urlWhitespaceRe, '%20');\n\n return resultUrl;\n}\n\nconst protocolVersionRegExp = regEx(/#protocolVersion=(?<protocol>2|3)/);\n\nexport function parseRegistryUrl(registryUrl: string): ParsedRegistryUrl {\n const parsedUrl = parseUrl(registryUrl);\n if (!parsedUrl) {\n logger.debug(\n { urL: registryUrl },\n `nuget registry failure: can't parse ${registryUrl}`,\n );\n return { feedUrl: registryUrl, protocolVersion: null };\n }\n let protocolVersion = 2;\n const protocolVersionMatch = protocolVersionRegExp.exec(\n parsedUrl.hash,\n )?.groups;\n if (protocolVersionMatch) {\n const { protocol } = protocolVersionMatch;\n parsedUrl.hash = '';\n protocolVersion = Number.parseInt(protocol);\n } else if (parsedUrl.pathname.endsWith('.json')) {\n protocolVersion = 3;\n }\n\n const feedUrl = parsedUrl.href;\n return { feedUrl, protocolVersion };\n}\n\n/**\n * Compare two versions. Return:\n * - `1` if `a > b` or `b` is invalid\n * - `-1` if `a < b` or `a` is invalid\n * - `0` if `a == b` or both `a` and `b` are invalid\n */\nexport function sortNugetVersions(a: string, b: string): number {\n if (versioning.isValid(a)) {\n if (versioning.isValid(b)) {\n return versioning.sortVersions(a, b);\n } else {\n return 1;\n }\n } else if (versioning.isValid(b)) {\n return -1;\n } else {\n return 0;\n }\n}\n"],"mappings":";;;;;;AAMA,MAAM,cAAc,MAAM,SAAS;AAEnC,SAAgB,gBAAgB,SAAyB;AACvD,QAAO,QAAQ,QAAQ,aAAa,GAAG;;AAGzC,MAAM,kBAAkB,MAAM,MAAM;AAEpC,SAAgB,WAAW,KAA+C;AACxE,KAAI,QAAQ,QAAQ,QAAQ,OAC1B,QAAO;CAGT,IAAI,YAAY;AAIhB,aAAY,UAAU,QAAQ,iBAAiB,MAAM;AAErD,QAAO;;AAGT,MAAM,wBAAwB,MAAM,oCAAoC;AAExE,SAAgB,iBAAiB,aAAwC;CACvE,MAAM,YAAY,SAAS,YAAY;AACvC,KAAI,CAAC,WAAW;AACd,SAAO,MACL,EAAE,KAAK,aAAa,EACpB,uCAAuC,cACxC;AACD,SAAO;GAAE,SAAS;GAAa,iBAAiB;GAAM;;CAExD,IAAI,kBAAkB;CACtB,MAAM,uBAAuB,sBAAsB,KACjD,UAAU,KACX,EAAE;AACH,KAAI,sBAAsB;EACxB,MAAM,EAAE,aAAa;AACrB,YAAU,OAAO;AACjB,oBAAkB,OAAO,SAAS,
|
|
1
|
+
{"version":3,"file":"common.js","names":["versioning"],"sources":["../../../../lib/modules/datasource/nuget/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { api as versioning } from '../../versioning/nuget/index.ts';\nimport type { ParsedRegistryUrl } from './types.ts';\n\nconst buildMetaRe = regEx(/\\+.+$/g);\n\nexport function removeBuildMeta(version: string): string {\n return version.replace(buildMetaRe, '');\n}\n\nconst urlWhitespaceRe = regEx(/\\s/g);\n\nexport function massageUrl(url: string | null | undefined): string | null {\n if (url === null || url === undefined) {\n return null;\n }\n\n let resultUrl = url;\n\n // During `dotnet pack` certain URLs are being URL decoded which may introduce whitespace\n // and causes Markdown link generation problems.\n resultUrl = resultUrl.replace(urlWhitespaceRe, '%20');\n\n return resultUrl;\n}\n\nconst protocolVersionRegExp = regEx(/#protocolVersion=(?<protocol>2|3)/);\n\nexport function parseRegistryUrl(registryUrl: string): ParsedRegistryUrl {\n const parsedUrl = parseUrl(registryUrl);\n if (!parsedUrl) {\n logger.debug(\n { urL: registryUrl },\n `nuget registry failure: can't parse ${registryUrl}`,\n );\n return { feedUrl: registryUrl, protocolVersion: null };\n }\n let protocolVersion = 2;\n const protocolVersionMatch = protocolVersionRegExp.exec(\n parsedUrl.hash,\n )?.groups;\n if (protocolVersionMatch) {\n const { protocol } = protocolVersionMatch;\n parsedUrl.hash = '';\n protocolVersion = Number.parseInt(protocol, 10);\n } else if (parsedUrl.pathname.endsWith('.json')) {\n protocolVersion = 3;\n }\n\n const feedUrl = parsedUrl.href;\n return { feedUrl, protocolVersion };\n}\n\n/**\n * Compare two versions. Return:\n * - `1` if `a > b` or `b` is invalid\n * - `-1` if `a < b` or `a` is invalid\n * - `0` if `a == b` or both `a` and `b` are invalid\n */\nexport function sortNugetVersions(a: string, b: string): number {\n if (versioning.isValid(a)) {\n if (versioning.isValid(b)) {\n return versioning.sortVersions(a, b);\n } else {\n return 1;\n }\n } else if (versioning.isValid(b)) {\n return -1;\n } else {\n return 0;\n }\n}\n"],"mappings":";;;;;;AAMA,MAAM,cAAc,MAAM,SAAS;AAEnC,SAAgB,gBAAgB,SAAyB;AACvD,QAAO,QAAQ,QAAQ,aAAa,GAAG;;AAGzC,MAAM,kBAAkB,MAAM,MAAM;AAEpC,SAAgB,WAAW,KAA+C;AACxE,KAAI,QAAQ,QAAQ,QAAQ,OAC1B,QAAO;CAGT,IAAI,YAAY;AAIhB,aAAY,UAAU,QAAQ,iBAAiB,MAAM;AAErD,QAAO;;AAGT,MAAM,wBAAwB,MAAM,oCAAoC;AAExE,SAAgB,iBAAiB,aAAwC;CACvE,MAAM,YAAY,SAAS,YAAY;AACvC,KAAI,CAAC,WAAW;AACd,SAAO,MACL,EAAE,KAAK,aAAa,EACpB,uCAAuC,cACxC;AACD,SAAO;GAAE,SAAS;GAAa,iBAAiB;GAAM;;CAExD,IAAI,kBAAkB;CACtB,MAAM,uBAAuB,sBAAsB,KACjD,UAAU,KACX,EAAE;AACH,KAAI,sBAAsB;EACxB,MAAM,EAAE,aAAa;AACrB,YAAU,OAAO;AACjB,oBAAkB,OAAO,SAAS,UAAU,GAAG;YACtC,UAAU,SAAS,SAAS,QAAQ,CAC7C,mBAAkB;AAIpB,QAAO;EAAE,SADO,UAAU;EACR;EAAiB;;;;;;;;AASrC,SAAgB,kBAAkB,GAAW,GAAmB;AAC9D,KAAIA,IAAW,QAAQ,EAAE,CACvB,KAAIA,IAAW,QAAQ,EAAE,CACvB,QAAOA,IAAW,aAAa,GAAG,EAAE;KAEpC,QAAO;UAEAA,IAAW,QAAQ,EAAE,CAC9B,QAAO;KAEP,QAAO"}
|
|
@@ -13,7 +13,7 @@ async function getYarnLock(filePath) {
|
|
|
13
13
|
const lockedVersions = {};
|
|
14
14
|
let lockfileVersion;
|
|
15
15
|
for (const [key, val] of Object.entries(parsed)) if (key === "__metadata") {
|
|
16
|
-
lockfileVersion = parseInt(val.cacheKey);
|
|
16
|
+
lockfileVersion = parseInt(val.cacheKey, 10);
|
|
17
17
|
logger.once.debug(`yarn.lock ${filePath} has __metadata.cacheKey=${lockfileVersion}`);
|
|
18
18
|
} else for (const entry of key.split(", ")) try {
|
|
19
19
|
const { scope, name, range } = structUtils.parseDescriptor(entry);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yarn.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/yarn.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { miscUtils, structUtils } from '@yarnpkg/core';\nimport { parseSyml } from '@yarnpkg/parsers';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport type { PackageFileContent } from '../../types.ts';\nimport type { YarnCatalogs } from '../schema.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { extractCatalogDeps } from './common/catalogs.ts';\nimport type { Catalog, LockFile } from './types.ts';\n\nexport async function getYarnLock(filePath: string): Promise<LockFile> {\n // TODO #22198\n const yarnLockRaw = (await readLocalFile(filePath, 'utf8'))!;\n try {\n const parsed = parseSyml(yarnLockRaw);\n const lockedVersions: Record<string, string> = {};\n let lockfileVersion: number | undefined;\n\n for (const [key, val] of Object.entries(parsed)) {\n if (key === '__metadata') {\n // yarn 2\n lockfileVersion = parseInt(val.cacheKey);\n logger.once.debug(\n `yarn.lock ${filePath} has __metadata.cacheKey=${lockfileVersion}`,\n );\n } else {\n for (const entry of key.split(', ')) {\n try {\n const { scope, name, range } = structUtils.parseDescriptor(entry);\n const packageName = scope ? `@${scope}/${name}` : name;\n const { selector } = structUtils.parseRange(range);\n\n logger.trace({ entry, version: val.version });\n lockedVersions[packageName + '@' + selector] = parsed[key].version;\n } catch (err) {\n logger.debug(\n { entry, err },\n 'Invalid descriptor or range found in yarn.lock',\n );\n }\n }\n }\n }\n const isYarn1 = !('__metadata' in parsed);\n if (isYarn1) {\n logger.once.debug(\n `yarn.lock ${filePath} is has no __metadata so is yarn 1`,\n );\n } else {\n logger.once.debug(\n `yarn.lock ${filePath} is has __metadata so is yarn 2+`,\n );\n }\n return {\n isYarn1,\n lockfileVersion,\n lockedVersions,\n };\n } catch (err) {\n logger.debug({ filePath, err }, 'Warning: Exception parsing yarn.lock');\n return { isYarn1: true, lockedVersions: {} };\n }\n}\n\nexport function getZeroInstallPaths(yarnrcYml: string): string[] {\n let conf: any;\n try {\n conf = parseSyml(yarnrcYml); /* v8 ignore next -- needs test */\n } catch (err) {\n logger.warn({ err }, 'Error parsing .yarnrc.yml');\n }\n const paths = [\n conf?.cacheFolder ?? './.yarn/cache',\n '.pnp.cjs',\n '.pnp.js',\n '.pnp.loader.mjs',\n ];\n if (\n conf &&\n miscUtils.tryParseOptionalBoolean(conf.pnpEnableInlining) === false\n ) {\n paths.push(conf.pnpDataPath ?? './.pnp.data.json');\n }\n return paths;\n}\n\nexport async function isZeroInstall(yarnrcYmlPath: string): Promise<boolean> {\n const yarnrcYml = await readLocalFile(yarnrcYmlPath, 'utf8');\n if (isString(yarnrcYml)) {\n const paths = getZeroInstallPaths(yarnrcYml);\n for (const p of paths) {\n if (await localPathExists(getSiblingFileName(yarnrcYmlPath, p))) {\n logger.debug(`Detected Yarn zero-install in ${p}`);\n return true;\n }\n }\n }\n return false;\n}\n\nexport function getYarnVersionFromLock(lockfile: LockFile): string {\n const { lockfileVersion, isYarn1 } = lockfile;\n if (isYarn1) {\n return '^1.22.18';\n }\n if (lockfileVersion && lockfileVersion >= 12) {\n // This will probably be v5\n return '>=4.0.0';\n }\n if (lockfileVersion && lockfileVersion >= 10) {\n return '^4.0.0';\n }\n if (lockfileVersion && lockfileVersion >= 8) {\n // https://github.com/yarnpkg/berry/commit/9bcd27ae34aee77a567dd104947407532fa179b3\n return '^3.0.0';\n } else if (lockfileVersion && lockfileVersion >= 6) {\n // https://github.com/yarnpkg/berry/commit/f753790380cbda5b55d028ea84b199445129f9ba\n return '^2.2.0';\n }\n\n return '^2.0.0';\n}\n\nexport async function extractYarnCatalogs(\n catalogs: YarnCatalogs,\n packageFile: string,\n hasPackageManager: boolean,\n): Promise<PackageFileContent<NpmManagerData>> {\n logger.trace(`yarn.extractYarnCatalogs(${packageFile})`);\n\n const yarnCatalogs = yarnCatalogsToArray(catalogs);\n\n const deps = extractCatalogDeps(yarnCatalogs, 'yarn');\n\n let yarnLock: string | undefined;\n const filePath = getSiblingFileName(packageFile, 'yarn.lock');\n\n if (await localPathExists(filePath)) {\n yarnLock = filePath;\n }\n\n return {\n deps,\n managerData: {\n yarnLock,\n hasPackageManager,\n },\n };\n}\n\nfunction yarnCatalogsToArray({\n catalog: defaultCatalogDeps,\n catalogs: namedCatalogs,\n}: YarnCatalogs): Catalog[] {\n const result: Catalog[] = [];\n\n if (defaultCatalogDeps !== undefined) {\n result.push({ name: 'default', dependencies: defaultCatalogDeps });\n }\n\n if (!namedCatalogs) {\n return result;\n }\n\n for (const [name, dependencies] of Object.entries(namedCatalogs)) {\n result.push({\n name,\n dependencies,\n });\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;AAeA,eAAsB,YAAY,UAAqC;CAErE,MAAM,cAAe,MAAM,cAAc,UAAU,OAAO;AAC1D,KAAI;EACF,MAAM,SAAS,UAAU,YAAY;EACrC,MAAM,iBAAyC,EAAE;EACjD,IAAI;AAEJ,OAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,OAAO,CAC7C,KAAI,QAAQ,cAAc;AAExB,qBAAkB,SAAS,IAAI,
|
|
1
|
+
{"version":3,"file":"yarn.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/yarn.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { miscUtils, structUtils } from '@yarnpkg/core';\nimport { parseSyml } from '@yarnpkg/parsers';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport type { PackageFileContent } from '../../types.ts';\nimport type { YarnCatalogs } from '../schema.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { extractCatalogDeps } from './common/catalogs.ts';\nimport type { Catalog, LockFile } from './types.ts';\n\nexport async function getYarnLock(filePath: string): Promise<LockFile> {\n // TODO #22198\n const yarnLockRaw = (await readLocalFile(filePath, 'utf8'))!;\n try {\n const parsed = parseSyml(yarnLockRaw);\n const lockedVersions: Record<string, string> = {};\n let lockfileVersion: number | undefined;\n\n for (const [key, val] of Object.entries(parsed)) {\n if (key === '__metadata') {\n // yarn 2\n lockfileVersion = parseInt(val.cacheKey, 10);\n logger.once.debug(\n `yarn.lock ${filePath} has __metadata.cacheKey=${lockfileVersion}`,\n );\n } else {\n for (const entry of key.split(', ')) {\n try {\n const { scope, name, range } = structUtils.parseDescriptor(entry);\n const packageName = scope ? `@${scope}/${name}` : name;\n const { selector } = structUtils.parseRange(range);\n\n logger.trace({ entry, version: val.version });\n lockedVersions[packageName + '@' + selector] = parsed[key].version;\n } catch (err) {\n logger.debug(\n { entry, err },\n 'Invalid descriptor or range found in yarn.lock',\n );\n }\n }\n }\n }\n const isYarn1 = !('__metadata' in parsed);\n if (isYarn1) {\n logger.once.debug(\n `yarn.lock ${filePath} is has no __metadata so is yarn 1`,\n );\n } else {\n logger.once.debug(\n `yarn.lock ${filePath} is has __metadata so is yarn 2+`,\n );\n }\n return {\n isYarn1,\n lockfileVersion,\n lockedVersions,\n };\n } catch (err) {\n logger.debug({ filePath, err }, 'Warning: Exception parsing yarn.lock');\n return { isYarn1: true, lockedVersions: {} };\n }\n}\n\nexport function getZeroInstallPaths(yarnrcYml: string): string[] {\n let conf: any;\n try {\n conf = parseSyml(yarnrcYml); /* v8 ignore next -- needs test */\n } catch (err) {\n logger.warn({ err }, 'Error parsing .yarnrc.yml');\n }\n const paths = [\n conf?.cacheFolder ?? './.yarn/cache',\n '.pnp.cjs',\n '.pnp.js',\n '.pnp.loader.mjs',\n ];\n if (\n conf &&\n miscUtils.tryParseOptionalBoolean(conf.pnpEnableInlining) === false\n ) {\n paths.push(conf.pnpDataPath ?? './.pnp.data.json');\n }\n return paths;\n}\n\nexport async function isZeroInstall(yarnrcYmlPath: string): Promise<boolean> {\n const yarnrcYml = await readLocalFile(yarnrcYmlPath, 'utf8');\n if (isString(yarnrcYml)) {\n const paths = getZeroInstallPaths(yarnrcYml);\n for (const p of paths) {\n if (await localPathExists(getSiblingFileName(yarnrcYmlPath, p))) {\n logger.debug(`Detected Yarn zero-install in ${p}`);\n return true;\n }\n }\n }\n return false;\n}\n\nexport function getYarnVersionFromLock(lockfile: LockFile): string {\n const { lockfileVersion, isYarn1 } = lockfile;\n if (isYarn1) {\n return '^1.22.18';\n }\n if (lockfileVersion && lockfileVersion >= 12) {\n // This will probably be v5\n return '>=4.0.0';\n }\n if (lockfileVersion && lockfileVersion >= 10) {\n return '^4.0.0';\n }\n if (lockfileVersion && lockfileVersion >= 8) {\n // https://github.com/yarnpkg/berry/commit/9bcd27ae34aee77a567dd104947407532fa179b3\n return '^3.0.0';\n } else if (lockfileVersion && lockfileVersion >= 6) {\n // https://github.com/yarnpkg/berry/commit/f753790380cbda5b55d028ea84b199445129f9ba\n return '^2.2.0';\n }\n\n return '^2.0.0';\n}\n\nexport async function extractYarnCatalogs(\n catalogs: YarnCatalogs,\n packageFile: string,\n hasPackageManager: boolean,\n): Promise<PackageFileContent<NpmManagerData>> {\n logger.trace(`yarn.extractYarnCatalogs(${packageFile})`);\n\n const yarnCatalogs = yarnCatalogsToArray(catalogs);\n\n const deps = extractCatalogDeps(yarnCatalogs, 'yarn');\n\n let yarnLock: string | undefined;\n const filePath = getSiblingFileName(packageFile, 'yarn.lock');\n\n if (await localPathExists(filePath)) {\n yarnLock = filePath;\n }\n\n return {\n deps,\n managerData: {\n yarnLock,\n hasPackageManager,\n },\n };\n}\n\nfunction yarnCatalogsToArray({\n catalog: defaultCatalogDeps,\n catalogs: namedCatalogs,\n}: YarnCatalogs): Catalog[] {\n const result: Catalog[] = [];\n\n if (defaultCatalogDeps !== undefined) {\n result.push({ name: 'default', dependencies: defaultCatalogDeps });\n }\n\n if (!namedCatalogs) {\n return result;\n }\n\n for (const [name, dependencies] of Object.entries(namedCatalogs)) {\n result.push({\n name,\n dependencies,\n });\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -103,7 +103,7 @@ function splitEscapedSpaces(str) {
|
|
|
103
103
|
function parseModifier(value) {
|
|
104
104
|
const match = regEx("^random(?:\\((\\d+)\\))?$").exec(value);
|
|
105
105
|
if (!match) return null;
|
|
106
|
-
return parseInt(match[1] ?? "1");
|
|
106
|
+
return parseInt(match[1] ?? "1", 10);
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["git.getUrl"],"sources":["../../../../lib/modules/platform/bitbucket-server/utils.ts"],"sourcesContent":["// SEE for the reference https://github.com/renovatebot/renovate/blob/c3e9e572b225085448d94aa121c7ec81c14d3955/lib/platform/bitbucket/utils.js\nimport { isNonEmptyString } from '@sindresorhus/is';\nimport { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { GitOptions, GitProtocol } from '../../../types/git.ts';\nimport type { HostRule } from '../../../types/index.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash, parseUrl } from '../../../util/url.ts';\nimport { getPrBodyStruct } from '../pr-body.ts';\nimport type { GitUrlOption } from '../types.ts';\nimport type { BbsPr, BbsRestPr, BbsRestRepo, BitbucketError } from './types.ts';\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 // v8 ignore else -- TODO: add test #40625\n if (error.exceptionName === BITBUCKET_INVALID_REVIEWERS_EXCEPTION) {\n invalidReviewers = invalidReviewers.concat(\n error.reviewerErrors\n ?.map(({ context }) => context)\n .filter(isNonEmptyString) ?? [],\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 authString =\n opts.username && opts.password\n ? `${opts.username}:${opts.password}`\n : (opts.username ?? '');\n\n const generatedUrl = git.getUrl({\n protocol: url.protocol as GitProtocol,\n // TODO: types (#22198)\n auth: authString,\n host: `${url.host}${ensureTrailingSlash(url.pathname)}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 // v8 ignore else -- TODO: add test #40625\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 switch (gitUrl) {\n case 'endpoint': {\n const generatedUrl = generateUrlFromEndpoint(\n defaultEndpoint,\n opts,\n repository,\n );\n logger.debug(`Using endpoint URL: ${generatedUrl}`);\n return generatedUrl;\n }\n case '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 case undefined:\n case 'default': {\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 (cloneUrl) {\n return cloneUrl.href;\n }\n // SSH urls can be used directly\n return generateUrlFromEndpoint(defaultEndpoint, opts, repository);\n }\n }\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"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utils.js","names":["git.getUrl"],"sources":["../../../../lib/modules/platform/bitbucket-server/utils.ts"],"sourcesContent":["// SEE for the reference https://github.com/renovatebot/renovate/blob/c3e9e572b225085448d94aa121c7ec81c14d3955/lib/platform/bitbucket/utils.js\nimport { isNonEmptyString } from '@sindresorhus/is';\nimport { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { GitOptions, GitProtocol } from '../../../types/git.ts';\nimport type { HostRule } from '../../../types/index.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash, parseUrl } from '../../../util/url.ts';\nimport { getPrBodyStruct } from '../pr-body.ts';\nimport type { GitUrlOption } from '../types.ts';\nimport type { BbsPr, BbsRestPr, BbsRestRepo, BitbucketError } from './types.ts';\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 // v8 ignore else -- TODO: add test #40625\n if (error.exceptionName === BITBUCKET_INVALID_REVIEWERS_EXCEPTION) {\n invalidReviewers = invalidReviewers.concat(\n error.reviewerErrors\n ?.map(({ context }) => context)\n .filter(isNonEmptyString) ?? [],\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 authString =\n opts.username && opts.password\n ? `${opts.username}:${opts.password}`\n : (opts.username ?? '');\n\n const generatedUrl = git.getUrl({\n protocol: url.protocol as GitProtocol,\n // TODO: types (#22198)\n auth: authString,\n host: `${url.host}${ensureTrailingSlash(url.pathname)}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 // v8 ignore else -- TODO: add test #40625\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 switch (gitUrl) {\n case 'endpoint': {\n const generatedUrl = generateUrlFromEndpoint(\n defaultEndpoint,\n opts,\n repository,\n );\n logger.debug(`Using endpoint URL: ${generatedUrl}`);\n return generatedUrl;\n }\n case '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 case undefined:\n case 'default': {\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 (cloneUrl) {\n return cloneUrl.href;\n }\n // SSH urls can be used directly\n return generateUrlFromEndpoint(defaultEndpoint, opts, repository);\n }\n }\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', 10);\n}\n"],"mappings":"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"}
|
|
@@ -118,7 +118,7 @@ async function getPrList() {
|
|
|
118
118
|
destinationCommit: prInfo.pullRequestTargets[0].destinationCommit,
|
|
119
119
|
sourceCommit: prInfo.pullRequestTargets[0].sourceCommit,
|
|
120
120
|
state: prInfo.pullRequestStatus === PullRequestStatusEnum.OPEN ? "open" : "closed",
|
|
121
|
-
number: Number.parseInt(prId),
|
|
121
|
+
number: Number.parseInt(prId, 10),
|
|
122
122
|
title: prInfo.title,
|
|
123
123
|
body: prInfo.description,
|
|
124
124
|
createdAt: prInfo.creationDate?.toISOString()
|
|
@@ -217,7 +217,7 @@ async function createPr({ sourceBranch, targetBranch, prTitle: title, prBody: bo
|
|
|
217
217
|
const prCreateRes = await createPr$1(title, sanitize(description), sourceBranch, targetBranch, config.repository);
|
|
218
218
|
if (!prCreateRes.pullRequest?.title || !prCreateRes.pullRequest?.pullRequestId || !prCreateRes.pullRequest?.description || !prCreateRes.pullRequest?.pullRequestTargets?.length) throw new Error("Could not create pr, missing PR info");
|
|
219
219
|
return {
|
|
220
|
-
number: Number.parseInt(prCreateRes.pullRequest.pullRequestId),
|
|
220
|
+
number: Number.parseInt(prCreateRes.pullRequest.pullRequestId, 10),
|
|
221
221
|
state: "open",
|
|
222
222
|
title: prCreateRes.pullRequest.title,
|
|
223
223
|
sourceBranch,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["client.listRepositories","client.getRepositoryInfo","client.getCodeCommitUrl","git.initRepo","client.listPullRequests","client.getPr","client.getFile","client.createPr","client.updatePrDescription","client.updatePrTitle","client.updatePrStatus","client.createPrApprovalRule","client.getPrComments","client.createPrComment","client.updateComment","client.deleteComment"],"sources":["../../../../lib/modules/platform/codecommit/index.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport type {\n GetCommentsForPullRequestOutput,\n ListRepositoriesOutput,\n} from '@aws-sdk/client-codecommit';\nimport { PullRequestStatusEnum } from '@aws-sdk/client-codecommit';\nimport {\n PLATFORM_BAD_CREDENTIALS,\n REPOSITORY_EMPTY,\n REPOSITORY_NOT_FOUND,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus, PrState } from '../../../types/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\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.ts';\nimport { getNewBranchName, repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport * as client from './codecommit-client.ts';\n\nexport interface CodeCommitPr extends Pr {\n body: string;\n destinationCommit: string;\n sourceCommit: string;\n}\n\ninterface Config {\n repository?: string;\n defaultBranch?: string;\n region?: string;\n prList?: CodeCommitPr[];\n}\n\nexport const id = 'codecommit';\nexport const experimental = true;\n\nconst platformConfig = {\n endpoint: 'https://git-codecommit.us-east-1.amazonaws.com',\n};\n\nlet config: Config = {} as any;\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n token: awsToken,\n}: PlatformParams): Promise<PlatformResult> {\n const accessKeyId = username;\n const secretAccessKey = password;\n const env = process.env;\n let region: string | undefined;\n\n if (accessKeyId) {\n env.AWS_ACCESS_KEY_ID = accessKeyId;\n }\n if (secretAccessKey) {\n env.AWS_SECRET_ACCESS_KEY = secretAccessKey;\n }\n if (awsToken) {\n env.AWS_SESSION_TOKEN = awsToken;\n }\n\n if (endpoint) {\n const regionReg = regEx(/.*codecommit\\.(?<region>.+)\\.amazonaws\\.com/);\n const codeCommitMatch = regionReg.exec(endpoint);\n region = codeCommitMatch?.groups?.region;\n if (region) {\n env.AWS_REGION = region;\n } else {\n logger.warn(\"Can't parse region, make sure your endpoint is correct\");\n }\n }\n\n // If any of the below fails, it will throw an exception stopping the program.\n client.buildCodeCommitClient();\n // To check if we have permission to codecommit, throws exception if failed.\n await client.listRepositories();\n\n platformConfig.endpoint =\n endpoint ??\n `https://git-codecommit.${env.AWS_REGION ?? 'us-east-1'}.amazonaws.com/`;\n\n const platformResult: PlatformResult = {\n endpoint: platformConfig.endpoint,\n };\n return platformResult;\n}\n\nexport async function initRepo({\n repository,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(\"${repository}\")`);\n\n config = { repository } as Config;\n\n let repo;\n try {\n repo = await client.getRepositoryInfo(repository);\n } catch (err) {\n logger.error({ err }, 'Could not find repository');\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n\n if (!repo?.repositoryMetadata) {\n logger.error({ repository }, 'Could not find repository');\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n logger.debug({ repositoryDetails: repo }, 'Repository details');\n const metadata = repo.repositoryMetadata;\n\n const url = client.getCodeCommitUrl(metadata, repository);\n try {\n await git.initRepo({\n url,\n });\n } catch (err) {\n logger.debug({ err }, 'Failed to git init');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n\n if (!metadata.defaultBranch || !metadata.repositoryId) {\n logger.debug('Repo is empty');\n throw new Error(REPOSITORY_EMPTY);\n }\n\n const defaultBranch = metadata.defaultBranch;\n config.defaultBranch = defaultBranch;\n logger.debug(`${repository} default branch = ${defaultBranch}`);\n\n return {\n repoFingerprint: repoFingerprint(\n metadata.repositoryId,\n platformConfig.endpoint,\n ),\n defaultBranch,\n isFork: false,\n };\n}\n\nexport async function getPrList(): Promise<CodeCommitPr[]> {\n logger.debug('getPrList()');\n\n if (config.prList) {\n return config.prList;\n }\n\n const listPrsResponse = await client.listPullRequests(config.repository!);\n const fetchedPrs: CodeCommitPr[] = [];\n\n if (listPrsResponse && !listPrsResponse.pullRequestIds) {\n return fetchedPrs;\n }\n\n const prIds = coerceArray(listPrsResponse.pullRequestIds);\n\n for (const prId of prIds) {\n const prRes = await client.getPr(prId);\n\n if (!prRes?.pullRequest) {\n continue;\n }\n const prInfo = prRes.pullRequest;\n const pr: CodeCommitPr = {\n targetBranch: prInfo.pullRequestTargets![0].destinationReference!,\n sourceBranch: prInfo.pullRequestTargets![0].sourceReference!,\n destinationCommit: prInfo.pullRequestTargets![0].destinationCommit!,\n sourceCommit: prInfo.pullRequestTargets![0].sourceCommit!,\n state:\n prInfo.pullRequestStatus === PullRequestStatusEnum.OPEN\n ? 'open'\n : 'closed',\n number: Number.parseInt(prId),\n title: prInfo.title!,\n body: prInfo.description!,\n createdAt: prInfo.creationDate?.toISOString(),\n };\n fetchedPrs.push(pr);\n }\n\n config.prList = fetchedPrs;\n\n logger.debug(`Retrieved Pull Requests, count: ${fetchedPrs.length}`);\n return fetchedPrs;\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n}: FindPRConfig): Promise<CodeCommitPr | null> {\n let prsFiltered: CodeCommitPr[] = [];\n try {\n const prs = await getPrList();\n const refsHeadBranchName = getNewBranchName(branchName);\n prsFiltered = prs.filter(\n (item) => item.sourceBranch === refsHeadBranchName,\n );\n\n if (prTitle) {\n prsFiltered = prsFiltered.filter(\n (item) => item.title.toUpperCase() === prTitle.toUpperCase(),\n );\n }\n\n switch (state) {\n case 'all':\n break;\n case '!open':\n prsFiltered = prsFiltered.filter((item) => item.state !== 'open');\n break;\n default:\n prsFiltered = prsFiltered.filter((item) => item.state === 'open');\n break;\n }\n } catch (err) {\n logger.error({ err }, 'findPr error');\n }\n if (prsFiltered.length === 0) {\n return null;\n }\n return prsFiltered[0];\n}\n\nexport async function getBranchPr(\n branchName: string,\n): Promise<CodeCommitPr | 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\nexport async function getPr(\n pullRequestId: number,\n): Promise<CodeCommitPr | null> {\n logger.debug(`getPr(${pullRequestId})`);\n const prRes = await client.getPr(`${pullRequestId}`);\n\n if (!prRes?.pullRequest) {\n return null;\n }\n\n const prInfo = prRes.pullRequest;\n let prState: PrState;\n if (prInfo.pullRequestTargets![0].mergeMetadata?.isMerged) {\n prState = 'merged';\n } else {\n prState =\n prInfo.pullRequestStatus === PullRequestStatusEnum.OPEN\n ? 'open'\n : 'closed';\n }\n\n return {\n sourceBranch: prInfo.pullRequestTargets![0].sourceReference!,\n sourceCommit: prInfo.pullRequestTargets![0].sourceCommit!,\n state: prState,\n number: pullRequestId,\n title: prInfo.title!,\n targetBranch: prInfo.pullRequestTargets![0].destinationReference!,\n destinationCommit: prInfo.pullRequestTargets![0].destinationCommit!,\n body: prInfo.description!,\n };\n}\n\nexport async function getRepos(): Promise<string[]> {\n logger.debug('Autodiscovering AWS CodeCommit repositories');\n\n let reposRes: ListRepositoriesOutput;\n try {\n reposRes = await client.listRepositories();\n //todo do we need pagination? maximum number of repos is 1000 without pagination, also the same for free account\n } catch (error) {\n logger.error({ error }, 'Could not retrieve repositories');\n return [];\n }\n\n const res: string[] = [];\n\n const repoNames = coerceArray(reposRes?.repositories);\n\n for (const repo of repoNames) {\n // v8 ignore else -- TODO: add test #40625\n if (repo.repositoryName) {\n res.push(repo.repositoryName);\n }\n }\n\n return res;\n}\n\nexport function massageMarkdown(input: string): string {\n // Remove any HTML we use\n return input\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(/\\]\\(\\.\\.\\/issues\\//g), '](#')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](../../pull-requests/')\n .replace(\n regEx(/(?<hiddenComment><!--renovate-(?:debug|config-hash):.*?-->)/g),\n '[//]: # ($<hiddenComment>)',\n );\n}\n\n/**\n * Unsed, no Dashboard\n */\nexport function maxBodyLength(): number {\n return Infinity;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const fileRes = await client.getFile(\n repoName ?? config.repository,\n fileName,\n branchOrTag,\n );\n if (!fileRes?.fileContent) {\n return null;\n }\n const buf = Buffer.from(fileRes.fileContent);\n return buf.toString();\n}\n\nconst AMAZON_MAX_BODY_LENGTH = 10239;\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle: title,\n prBody: body,\n}: CreatePRConfig): Promise<CodeCommitPr> {\n const description = smartTruncate(sanitize(body), AMAZON_MAX_BODY_LENGTH);\n\n const prCreateRes = await client.createPr(\n title,\n sanitize(description),\n sourceBranch,\n targetBranch,\n config.repository,\n );\n\n if (\n !prCreateRes.pullRequest?.title ||\n !prCreateRes.pullRequest?.pullRequestId ||\n !prCreateRes.pullRequest?.description ||\n !prCreateRes.pullRequest?.pullRequestTargets?.length\n ) {\n throw new Error('Could not create pr, missing PR info');\n }\n\n return {\n number: Number.parseInt(prCreateRes.pullRequest.pullRequestId),\n state: 'open',\n title: prCreateRes.pullRequest.title,\n sourceBranch,\n targetBranch,\n sourceCommit: prCreateRes.pullRequest.pullRequestTargets[0].sourceCommit!,\n destinationCommit:\n prCreateRes.pullRequest.pullRequestTargets[0].destinationCommit!,\n sourceRepo: config.repository,\n body: prCreateRes.pullRequest.description,\n };\n}\n\nexport async function updatePr({\n number: prNo,\n prTitle: title,\n prBody: body,\n state,\n}: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prNo}, ${title}, body)`);\n\n let cachedPr: CodeCommitPr | undefined = undefined;\n const cachedPrs = config.prList ?? [];\n for (const p of cachedPrs) {\n // v8 ignore else -- TODO: add test #40625\n if (p.number === prNo) {\n cachedPr = p;\n }\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (body && cachedPr?.body !== body) {\n await client.updatePrDescription(\n `${prNo}`,\n smartTruncate(sanitize(body), AMAZON_MAX_BODY_LENGTH),\n );\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (title && cachedPr?.title !== title) {\n await client.updatePrTitle(`${prNo}`, title);\n }\n\n const prStatusInput =\n state === 'closed'\n ? PullRequestStatusEnum.CLOSED\n : PullRequestStatusEnum.OPEN;\n // v8 ignore else -- TODO: add test #40625\n if (cachedPr?.state !== prStatusInput) {\n try {\n await client.updatePrStatus(`${prNo}`, prStatusInput);\n } catch {\n // safety check\n // do nothing, it's ok to fail sometimes when trying to update from open to open or from closed to closed.\n }\n }\n}\n\n// Auto-Merge not supported currently.\n/* v8 ignore next */\nexport async function mergePr({\n branchName,\n id: prNo,\n}: MergePRConfig): Promise<boolean> {\n logger.debug(`mergePr(${prNo}, ${branchName!})`);\n await client.getPr(`${prNo}`);\n return Promise.resolve(false);\n //\n // /* v8 ignore next */\n // if (!prOut) {\n // return false;\n // }\n // const pReq = prOut.pullRequest;\n // const targets = pReq?.pullRequestTargets;\n //\n // /* v8 ignore next */\n // if (!targets) {\n // return false;\n // }\n //\n // if (strategy === 'rebase') {\n // logger.warn('CodeCommit does not support a \"rebase\" strategy.');\n // return false;\n // }\n //\n // try {\n // if (strategy === 'auto' || strategy === 'squash') {\n // await client.squashMerge(\n // targets[0].repositoryName!,\n // targets[0].sourceReference!,\n // targets[0].destinationReference!,\n // pReq?.title\n // );\n // } else if (strategy === 'fast-forward') {\n // await client.fastForwardMerge(\n // targets[0].repositoryName!,\n // targets[0].sourceReference!,\n // targets[0].destinationReference!\n // );\n // } else {\n // logger.debug(`unsupported strategy`);\n // return false;\n // }\n // } catch (err) {\n // logger.debug({ err }, `PR merge error`);\n // logger.info({ pr: prNo }, 'PR automerge failed');\n // return false;\n // }\n //\n // logger.trace(`Updating PR ${prNo} to status ${PullRequestStatusEnum.CLOSED}`);\n //\n // try {\n // const response = await client.updatePrStatus(\n // `${prNo}`,\n // PullRequestStatusEnum.CLOSED\n // );\n // const isClosed =\n // response.pullRequest?.pullRequestStatus === PullRequestStatusEnum.CLOSED;\n //\n // if (!isClosed) {\n // logger.warn(\n // {\n // pullRequestId: prNo,\n // status: response.pullRequest?.pullRequestStatus,\n // },\n // `Expected PR to have status`\n // );\n // }\n // return true;\n // } catch (err) {\n // logger.debug({ err }, 'Failed to set the PR as Closed.');\n // return false;\n // }\n}\n\nexport async function addReviewers(\n prNo: number,\n reviewers: string[],\n): Promise<void> {\n const numberOfApprovers = reviewers.length;\n const approvalRuleContents = `{\"Version\":\"2018-11-08\",\"Statements\": [{\"Type\": \"Approvers\",\"NumberOfApprovalsNeeded\":${numberOfApprovers},\"ApprovalPoolMembers\": ${JSON.stringify(\n reviewers,\n )}}]}`;\n const res = await client.createPrApprovalRule(\n `${prNo}`,\n approvalRuleContents,\n );\n // v8 ignore else -- TODO: add test #40625\n if (res) {\n const approvalRule = res.approvalRule;\n logger.debug({ approvalRule }, `Approval Rule Added to PR #${prNo}:`);\n }\n}\n\n/* v8 ignore next */\nexport function addAssignees(\n _iid: number,\n _assignees: string[],\n): Promise<void> {\n // CodeCommit does not support adding reviewers\n return Promise.resolve();\n}\n\n/* v8 ignore next */\nexport function findIssue(_title: string): Promise<Issue | null> {\n // CodeCommit does not have issues\n return Promise.resolve(null);\n}\n\n/* v8 ignore next */\nexport function ensureIssue(\n _cfg: EnsureIssueConfig,\n): Promise<EnsureIssueResult | null> {\n // CodeCommit does not have issues\n return Promise.resolve(null);\n}\n\n/* v8 ignore next */\nexport function getIssueList(): Promise<Issue[]> {\n // CodeCommit does not have issues\n return Promise.resolve([]);\n}\n\n/* v8 ignore next */\nexport function ensureIssueClosing(_title: string): Promise<void> {\n // CodeCommit does not have issues\n return Promise.resolve();\n}\n\n/* v8 ignore next */\nexport function deleteLabel(_prNumber: number, _label: string): Promise<void> {\n return Promise.resolve();\n}\n\n// Returns the combined status for a branch.\n/* v8 ignore next */\nexport function getBranchStatus(branchName: string): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n logger.debug(\n 'returning branch status yellow, because getBranchStatus isnt supported on aws yet',\n );\n return Promise.resolve('yellow');\n}\n\n/* v8 ignore next */\nexport function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n logger.debug(`getBranchStatusCheck(${branchName}, context=${context})`);\n logger.debug(\n 'returning null, because getBranchStatusCheck is not supported on aws yet',\n );\n return Promise.resolve(null);\n}\n\n/* v8 ignore next */\nexport function setBranchStatus(_cfg: BranchStatusConfig): Promise<void> {\n return Promise.resolve();\n}\n\nexport async function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n logger.debug(`ensureComment(${number}, ${topic!}, content)`);\n const header = topic ? `### ${topic}\\n\\n` : '';\n const body = `${header}${sanitize(content)}`;\n let prCommentsResponse: GetCommentsForPullRequestOutput;\n try {\n prCommentsResponse = await client.getPrComments(`${number}`);\n } catch (err) {\n logger.debug({ err }, 'Unable to retrieve pr comments');\n return false;\n }\n\n let commentId: string | undefined = undefined;\n let commentNeedsUpdating = false;\n\n if (!prCommentsResponse?.commentsForPullRequestData) {\n return false;\n }\n\n for (const commentObj of prCommentsResponse.commentsForPullRequestData) {\n if (!commentObj?.comments) {\n continue;\n }\n const firstCommentContent = commentObj.comments[0].content;\n if (\n (topic && firstCommentContent?.startsWith(header)) === true ||\n (!topic && firstCommentContent === body)\n ) {\n commentId = commentObj.comments[0].commentId;\n commentNeedsUpdating = firstCommentContent !== body;\n break;\n }\n }\n\n if (!commentId) {\n const prs = await getPrList();\n const thisPr = prs.filter((item) => item.number === number);\n\n if (!thisPr[0].sourceCommit || !thisPr[0].destinationCommit) {\n return false;\n }\n\n await client.createPrComment(\n `${number}`,\n config.repository,\n body,\n thisPr[0].destinationCommit,\n thisPr[0].sourceCommit,\n );\n logger.info(\n { repository: config.repository, prNo: number, topic },\n 'Comment added',\n );\n } else if (commentNeedsUpdating && commentId) {\n await client.updateComment(commentId, body);\n\n logger.debug(\n { repository: config.repository, prNo: number, topic },\n 'Comment updated',\n );\n } else {\n logger.debug(\n { repository: config.repository, prNo: number, topic },\n 'Comment is already up-to-date',\n );\n }\n\n return true;\n}\n\nexport async function ensureCommentRemoval(\n removeConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n const { number: prNo } = removeConfig;\n const key =\n removeConfig.type === 'by-topic'\n ? removeConfig.topic\n : removeConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${prNo} is removed`);\n\n let prCommentsResponse: GetCommentsForPullRequestOutput;\n try {\n prCommentsResponse = await client.getPrComments(`${prNo}`);\n } catch (err) {\n logger.debug({ err }, 'Unable to retrieve pr comments');\n return;\n }\n\n if (!prCommentsResponse?.commentsForPullRequestData) {\n logger.debug('commentsForPullRequestData not found');\n return;\n }\n\n let commentIdToRemove: string | undefined;\n for (const commentObj of prCommentsResponse.commentsForPullRequestData) {\n if (!commentObj?.comments) {\n logger.debug(\n 'comments object not found under commentsForPullRequestData',\n );\n continue;\n }\n\n for (const comment of commentObj.comments) {\n // v8 ignore else -- TODO: add test #40625\n if (\n (removeConfig.type === 'by-topic' &&\n comment.content?.startsWith(`### ${removeConfig.topic}\\n\\n`)) ===\n true ||\n (removeConfig.type === 'by-content' &&\n removeConfig.content === comment.content?.trim())\n ) {\n commentIdToRemove = comment.commentId;\n break;\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (commentIdToRemove) {\n await client.deleteComment(commentIdToRemove);\n logger.debug(`comment \"${key}\" in PR #${prNo} was removed`);\n break;\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["client.listRepositories","client.getRepositoryInfo","client.getCodeCommitUrl","git.initRepo","client.listPullRequests","client.getPr","client.getFile","client.createPr","client.updatePrDescription","client.updatePrTitle","client.updatePrStatus","client.createPrApprovalRule","client.getPrComments","client.createPrComment","client.updateComment","client.deleteComment"],"sources":["../../../../lib/modules/platform/codecommit/index.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport type {\n GetCommentsForPullRequestOutput,\n ListRepositoriesOutput,\n} from '@aws-sdk/client-codecommit';\nimport { PullRequestStatusEnum } from '@aws-sdk/client-codecommit';\nimport {\n PLATFORM_BAD_CREDENTIALS,\n REPOSITORY_EMPTY,\n REPOSITORY_NOT_FOUND,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus, PrState } from '../../../types/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\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.ts';\nimport { getNewBranchName, repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport * as client from './codecommit-client.ts';\n\nexport interface CodeCommitPr extends Pr {\n body: string;\n destinationCommit: string;\n sourceCommit: string;\n}\n\ninterface Config {\n repository?: string;\n defaultBranch?: string;\n region?: string;\n prList?: CodeCommitPr[];\n}\n\nexport const id = 'codecommit';\nexport const experimental = true;\n\nconst platformConfig = {\n endpoint: 'https://git-codecommit.us-east-1.amazonaws.com',\n};\n\nlet config: Config = {} as any;\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n token: awsToken,\n}: PlatformParams): Promise<PlatformResult> {\n const accessKeyId = username;\n const secretAccessKey = password;\n const env = process.env;\n let region: string | undefined;\n\n if (accessKeyId) {\n env.AWS_ACCESS_KEY_ID = accessKeyId;\n }\n if (secretAccessKey) {\n env.AWS_SECRET_ACCESS_KEY = secretAccessKey;\n }\n if (awsToken) {\n env.AWS_SESSION_TOKEN = awsToken;\n }\n\n if (endpoint) {\n const regionReg = regEx(/.*codecommit\\.(?<region>.+)\\.amazonaws\\.com/);\n const codeCommitMatch = regionReg.exec(endpoint);\n region = codeCommitMatch?.groups?.region;\n if (region) {\n env.AWS_REGION = region;\n } else {\n logger.warn(\"Can't parse region, make sure your endpoint is correct\");\n }\n }\n\n // If any of the below fails, it will throw an exception stopping the program.\n client.buildCodeCommitClient();\n // To check if we have permission to codecommit, throws exception if failed.\n await client.listRepositories();\n\n platformConfig.endpoint =\n endpoint ??\n `https://git-codecommit.${env.AWS_REGION ?? 'us-east-1'}.amazonaws.com/`;\n\n const platformResult: PlatformResult = {\n endpoint: platformConfig.endpoint,\n };\n return platformResult;\n}\n\nexport async function initRepo({\n repository,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(\"${repository}\")`);\n\n config = { repository } as Config;\n\n let repo;\n try {\n repo = await client.getRepositoryInfo(repository);\n } catch (err) {\n logger.error({ err }, 'Could not find repository');\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n\n if (!repo?.repositoryMetadata) {\n logger.error({ repository }, 'Could not find repository');\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n logger.debug({ repositoryDetails: repo }, 'Repository details');\n const metadata = repo.repositoryMetadata;\n\n const url = client.getCodeCommitUrl(metadata, repository);\n try {\n await git.initRepo({\n url,\n });\n } catch (err) {\n logger.debug({ err }, 'Failed to git init');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n\n if (!metadata.defaultBranch || !metadata.repositoryId) {\n logger.debug('Repo is empty');\n throw new Error(REPOSITORY_EMPTY);\n }\n\n const defaultBranch = metadata.defaultBranch;\n config.defaultBranch = defaultBranch;\n logger.debug(`${repository} default branch = ${defaultBranch}`);\n\n return {\n repoFingerprint: repoFingerprint(\n metadata.repositoryId,\n platformConfig.endpoint,\n ),\n defaultBranch,\n isFork: false,\n };\n}\n\nexport async function getPrList(): Promise<CodeCommitPr[]> {\n logger.debug('getPrList()');\n\n if (config.prList) {\n return config.prList;\n }\n\n const listPrsResponse = await client.listPullRequests(config.repository!);\n const fetchedPrs: CodeCommitPr[] = [];\n\n if (listPrsResponse && !listPrsResponse.pullRequestIds) {\n return fetchedPrs;\n }\n\n const prIds = coerceArray(listPrsResponse.pullRequestIds);\n\n for (const prId of prIds) {\n const prRes = await client.getPr(prId);\n\n if (!prRes?.pullRequest) {\n continue;\n }\n const prInfo = prRes.pullRequest;\n const pr: CodeCommitPr = {\n targetBranch: prInfo.pullRequestTargets![0].destinationReference!,\n sourceBranch: prInfo.pullRequestTargets![0].sourceReference!,\n destinationCommit: prInfo.pullRequestTargets![0].destinationCommit!,\n sourceCommit: prInfo.pullRequestTargets![0].sourceCommit!,\n state:\n prInfo.pullRequestStatus === PullRequestStatusEnum.OPEN\n ? 'open'\n : 'closed',\n number: Number.parseInt(prId, 10),\n title: prInfo.title!,\n body: prInfo.description!,\n createdAt: prInfo.creationDate?.toISOString(),\n };\n fetchedPrs.push(pr);\n }\n\n config.prList = fetchedPrs;\n\n logger.debug(`Retrieved Pull Requests, count: ${fetchedPrs.length}`);\n return fetchedPrs;\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n}: FindPRConfig): Promise<CodeCommitPr | null> {\n let prsFiltered: CodeCommitPr[] = [];\n try {\n const prs = await getPrList();\n const refsHeadBranchName = getNewBranchName(branchName);\n prsFiltered = prs.filter(\n (item) => item.sourceBranch === refsHeadBranchName,\n );\n\n if (prTitle) {\n prsFiltered = prsFiltered.filter(\n (item) => item.title.toUpperCase() === prTitle.toUpperCase(),\n );\n }\n\n switch (state) {\n case 'all':\n break;\n case '!open':\n prsFiltered = prsFiltered.filter((item) => item.state !== 'open');\n break;\n default:\n prsFiltered = prsFiltered.filter((item) => item.state === 'open');\n break;\n }\n } catch (err) {\n logger.error({ err }, 'findPr error');\n }\n if (prsFiltered.length === 0) {\n return null;\n }\n return prsFiltered[0];\n}\n\nexport async function getBranchPr(\n branchName: string,\n): Promise<CodeCommitPr | 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\nexport async function getPr(\n pullRequestId: number,\n): Promise<CodeCommitPr | null> {\n logger.debug(`getPr(${pullRequestId})`);\n const prRes = await client.getPr(`${pullRequestId}`);\n\n if (!prRes?.pullRequest) {\n return null;\n }\n\n const prInfo = prRes.pullRequest;\n let prState: PrState;\n if (prInfo.pullRequestTargets![0].mergeMetadata?.isMerged) {\n prState = 'merged';\n } else {\n prState =\n prInfo.pullRequestStatus === PullRequestStatusEnum.OPEN\n ? 'open'\n : 'closed';\n }\n\n return {\n sourceBranch: prInfo.pullRequestTargets![0].sourceReference!,\n sourceCommit: prInfo.pullRequestTargets![0].sourceCommit!,\n state: prState,\n number: pullRequestId,\n title: prInfo.title!,\n targetBranch: prInfo.pullRequestTargets![0].destinationReference!,\n destinationCommit: prInfo.pullRequestTargets![0].destinationCommit!,\n body: prInfo.description!,\n };\n}\n\nexport async function getRepos(): Promise<string[]> {\n logger.debug('Autodiscovering AWS CodeCommit repositories');\n\n let reposRes: ListRepositoriesOutput;\n try {\n reposRes = await client.listRepositories();\n //todo do we need pagination? maximum number of repos is 1000 without pagination, also the same for free account\n } catch (error) {\n logger.error({ error }, 'Could not retrieve repositories');\n return [];\n }\n\n const res: string[] = [];\n\n const repoNames = coerceArray(reposRes?.repositories);\n\n for (const repo of repoNames) {\n // v8 ignore else -- TODO: add test #40625\n if (repo.repositoryName) {\n res.push(repo.repositoryName);\n }\n }\n\n return res;\n}\n\nexport function massageMarkdown(input: string): string {\n // Remove any HTML we use\n return input\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(/\\]\\(\\.\\.\\/issues\\//g), '](#')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](../../pull-requests/')\n .replace(\n regEx(/(?<hiddenComment><!--renovate-(?:debug|config-hash):.*?-->)/g),\n '[//]: # ($<hiddenComment>)',\n );\n}\n\n/**\n * Unsed, no Dashboard\n */\nexport function maxBodyLength(): number {\n return Infinity;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const fileRes = await client.getFile(\n repoName ?? config.repository,\n fileName,\n branchOrTag,\n );\n if (!fileRes?.fileContent) {\n return null;\n }\n const buf = Buffer.from(fileRes.fileContent);\n return buf.toString();\n}\n\nconst AMAZON_MAX_BODY_LENGTH = 10239;\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle: title,\n prBody: body,\n}: CreatePRConfig): Promise<CodeCommitPr> {\n const description = smartTruncate(sanitize(body), AMAZON_MAX_BODY_LENGTH);\n\n const prCreateRes = await client.createPr(\n title,\n sanitize(description),\n sourceBranch,\n targetBranch,\n config.repository,\n );\n\n if (\n !prCreateRes.pullRequest?.title ||\n !prCreateRes.pullRequest?.pullRequestId ||\n !prCreateRes.pullRequest?.description ||\n !prCreateRes.pullRequest?.pullRequestTargets?.length\n ) {\n throw new Error('Could not create pr, missing PR info');\n }\n\n return {\n number: Number.parseInt(prCreateRes.pullRequest.pullRequestId, 10),\n state: 'open',\n title: prCreateRes.pullRequest.title,\n sourceBranch,\n targetBranch,\n sourceCommit: prCreateRes.pullRequest.pullRequestTargets[0].sourceCommit!,\n destinationCommit:\n prCreateRes.pullRequest.pullRequestTargets[0].destinationCommit!,\n sourceRepo: config.repository,\n body: prCreateRes.pullRequest.description,\n };\n}\n\nexport async function updatePr({\n number: prNo,\n prTitle: title,\n prBody: body,\n state,\n}: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prNo}, ${title}, body)`);\n\n let cachedPr: CodeCommitPr | undefined = undefined;\n const cachedPrs = config.prList ?? [];\n for (const p of cachedPrs) {\n // v8 ignore else -- TODO: add test #40625\n if (p.number === prNo) {\n cachedPr = p;\n }\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (body && cachedPr?.body !== body) {\n await client.updatePrDescription(\n `${prNo}`,\n smartTruncate(sanitize(body), AMAZON_MAX_BODY_LENGTH),\n );\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (title && cachedPr?.title !== title) {\n await client.updatePrTitle(`${prNo}`, title);\n }\n\n const prStatusInput =\n state === 'closed'\n ? PullRequestStatusEnum.CLOSED\n : PullRequestStatusEnum.OPEN;\n // v8 ignore else -- TODO: add test #40625\n if (cachedPr?.state !== prStatusInput) {\n try {\n await client.updatePrStatus(`${prNo}`, prStatusInput);\n } catch {\n // safety check\n // do nothing, it's ok to fail sometimes when trying to update from open to open or from closed to closed.\n }\n }\n}\n\n// Auto-Merge not supported currently.\n/* v8 ignore next */\nexport async function mergePr({\n branchName,\n id: prNo,\n}: MergePRConfig): Promise<boolean> {\n logger.debug(`mergePr(${prNo}, ${branchName!})`);\n await client.getPr(`${prNo}`);\n return Promise.resolve(false);\n //\n // /* v8 ignore next */\n // if (!prOut) {\n // return false;\n // }\n // const pReq = prOut.pullRequest;\n // const targets = pReq?.pullRequestTargets;\n //\n // /* v8 ignore next */\n // if (!targets) {\n // return false;\n // }\n //\n // if (strategy === 'rebase') {\n // logger.warn('CodeCommit does not support a \"rebase\" strategy.');\n // return false;\n // }\n //\n // try {\n // if (strategy === 'auto' || strategy === 'squash') {\n // await client.squashMerge(\n // targets[0].repositoryName!,\n // targets[0].sourceReference!,\n // targets[0].destinationReference!,\n // pReq?.title\n // );\n // } else if (strategy === 'fast-forward') {\n // await client.fastForwardMerge(\n // targets[0].repositoryName!,\n // targets[0].sourceReference!,\n // targets[0].destinationReference!\n // );\n // } else {\n // logger.debug(`unsupported strategy`);\n // return false;\n // }\n // } catch (err) {\n // logger.debug({ err }, `PR merge error`);\n // logger.info({ pr: prNo }, 'PR automerge failed');\n // return false;\n // }\n //\n // logger.trace(`Updating PR ${prNo} to status ${PullRequestStatusEnum.CLOSED}`);\n //\n // try {\n // const response = await client.updatePrStatus(\n // `${prNo}`,\n // PullRequestStatusEnum.CLOSED\n // );\n // const isClosed =\n // response.pullRequest?.pullRequestStatus === PullRequestStatusEnum.CLOSED;\n //\n // if (!isClosed) {\n // logger.warn(\n // {\n // pullRequestId: prNo,\n // status: response.pullRequest?.pullRequestStatus,\n // },\n // `Expected PR to have status`\n // );\n // }\n // return true;\n // } catch (err) {\n // logger.debug({ err }, 'Failed to set the PR as Closed.');\n // return false;\n // }\n}\n\nexport async function addReviewers(\n prNo: number,\n reviewers: string[],\n): Promise<void> {\n const numberOfApprovers = reviewers.length;\n const approvalRuleContents = `{\"Version\":\"2018-11-08\",\"Statements\": [{\"Type\": \"Approvers\",\"NumberOfApprovalsNeeded\":${numberOfApprovers},\"ApprovalPoolMembers\": ${JSON.stringify(\n reviewers,\n )}}]}`;\n const res = await client.createPrApprovalRule(\n `${prNo}`,\n approvalRuleContents,\n );\n // v8 ignore else -- TODO: add test #40625\n if (res) {\n const approvalRule = res.approvalRule;\n logger.debug({ approvalRule }, `Approval Rule Added to PR #${prNo}:`);\n }\n}\n\n/* v8 ignore next */\nexport function addAssignees(\n _iid: number,\n _assignees: string[],\n): Promise<void> {\n // CodeCommit does not support adding reviewers\n return Promise.resolve();\n}\n\n/* v8 ignore next */\nexport function findIssue(_title: string): Promise<Issue | null> {\n // CodeCommit does not have issues\n return Promise.resolve(null);\n}\n\n/* v8 ignore next */\nexport function ensureIssue(\n _cfg: EnsureIssueConfig,\n): Promise<EnsureIssueResult | null> {\n // CodeCommit does not have issues\n return Promise.resolve(null);\n}\n\n/* v8 ignore next */\nexport function getIssueList(): Promise<Issue[]> {\n // CodeCommit does not have issues\n return Promise.resolve([]);\n}\n\n/* v8 ignore next */\nexport function ensureIssueClosing(_title: string): Promise<void> {\n // CodeCommit does not have issues\n return Promise.resolve();\n}\n\n/* v8 ignore next */\nexport function deleteLabel(_prNumber: number, _label: string): Promise<void> {\n return Promise.resolve();\n}\n\n// Returns the combined status for a branch.\n/* v8 ignore next */\nexport function getBranchStatus(branchName: string): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n logger.debug(\n 'returning branch status yellow, because getBranchStatus isnt supported on aws yet',\n );\n return Promise.resolve('yellow');\n}\n\n/* v8 ignore next */\nexport function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n logger.debug(`getBranchStatusCheck(${branchName}, context=${context})`);\n logger.debug(\n 'returning null, because getBranchStatusCheck is not supported on aws yet',\n );\n return Promise.resolve(null);\n}\n\n/* v8 ignore next */\nexport function setBranchStatus(_cfg: BranchStatusConfig): Promise<void> {\n return Promise.resolve();\n}\n\nexport async function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n logger.debug(`ensureComment(${number}, ${topic!}, content)`);\n const header = topic ? `### ${topic}\\n\\n` : '';\n const body = `${header}${sanitize(content)}`;\n let prCommentsResponse: GetCommentsForPullRequestOutput;\n try {\n prCommentsResponse = await client.getPrComments(`${number}`);\n } catch (err) {\n logger.debug({ err }, 'Unable to retrieve pr comments');\n return false;\n }\n\n let commentId: string | undefined = undefined;\n let commentNeedsUpdating = false;\n\n if (!prCommentsResponse?.commentsForPullRequestData) {\n return false;\n }\n\n for (const commentObj of prCommentsResponse.commentsForPullRequestData) {\n if (!commentObj?.comments) {\n continue;\n }\n const firstCommentContent = commentObj.comments[0].content;\n if (\n (topic && firstCommentContent?.startsWith(header)) === true ||\n (!topic && firstCommentContent === body)\n ) {\n commentId = commentObj.comments[0].commentId;\n commentNeedsUpdating = firstCommentContent !== body;\n break;\n }\n }\n\n if (!commentId) {\n const prs = await getPrList();\n const thisPr = prs.filter((item) => item.number === number);\n\n if (!thisPr[0].sourceCommit || !thisPr[0].destinationCommit) {\n return false;\n }\n\n await client.createPrComment(\n `${number}`,\n config.repository,\n body,\n thisPr[0].destinationCommit,\n thisPr[0].sourceCommit,\n );\n logger.info(\n { repository: config.repository, prNo: number, topic },\n 'Comment added',\n );\n } else if (commentNeedsUpdating && commentId) {\n await client.updateComment(commentId, body);\n\n logger.debug(\n { repository: config.repository, prNo: number, topic },\n 'Comment updated',\n );\n } else {\n logger.debug(\n { repository: config.repository, prNo: number, topic },\n 'Comment is already up-to-date',\n );\n }\n\n return true;\n}\n\nexport async function ensureCommentRemoval(\n removeConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n const { number: prNo } = removeConfig;\n const key =\n removeConfig.type === 'by-topic'\n ? removeConfig.topic\n : removeConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${prNo} is removed`);\n\n let prCommentsResponse: GetCommentsForPullRequestOutput;\n try {\n prCommentsResponse = await client.getPrComments(`${prNo}`);\n } catch (err) {\n logger.debug({ err }, 'Unable to retrieve pr comments');\n return;\n }\n\n if (!prCommentsResponse?.commentsForPullRequestData) {\n logger.debug('commentsForPullRequestData not found');\n return;\n }\n\n let commentIdToRemove: string | undefined;\n for (const commentObj of prCommentsResponse.commentsForPullRequestData) {\n if (!commentObj?.comments) {\n logger.debug(\n 'comments object not found under commentsForPullRequestData',\n );\n continue;\n }\n\n for (const comment of commentObj.comments) {\n // v8 ignore else -- TODO: add test #40625\n if (\n (removeConfig.type === 'by-topic' &&\n comment.content?.startsWith(`### ${removeConfig.topic}\\n\\n`)) ===\n true ||\n (removeConfig.type === 'by-content' &&\n removeConfig.content === comment.content?.trim())\n ) {\n commentIdToRemove = comment.commentId;\n break;\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (commentIdToRemove) {\n await client.deleteComment(commentIdToRemove);\n logger.debug(`comment \"${key}\" in PR #${prNo} was removed`);\n break;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -81,7 +81,7 @@ function findPullRequestBody(change) {
|
|
|
81
81
|
if (msg) return msg.message.replace(/^Patch Set \d+:\n\n/, "");
|
|
82
82
|
}
|
|
83
83
|
function mapBranchStatusToLabel(state, label) {
|
|
84
|
-
const numbers = Object.keys(label.values).map((x) => parseInt(x));
|
|
84
|
+
const numbers = Object.keys(label.values).map((x) => parseInt(x, 10));
|
|
85
85
|
switch (state) {
|
|
86
86
|
case "green": return Math.max(...numbers);
|
|
87
87
|
case "yellow":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["hostRules.find"],"sources":["../../../../lib/modules/platform/gerrit/utils.ts"],"sourcesContent":["import { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus, PrState } from '../../../types/index.ts';\nimport type { LongCommitSha } from '../../../util/git/types.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts, parseUrl } from '../../../util/url.ts';\nimport { hashBody } from '../pr-body.ts';\nimport type { Pr } from '../types.ts';\nimport type {\n GerritChange,\n GerritChangeStatus,\n GerritLabelTypeInfo,\n GerritRequestDetail,\n} from './types.ts';\n\nexport const MIN_GERRIT_VERSION = '3.0.0';\n\nexport const TAG_PULL_REQUEST_BODY = 'pull-request';\n\n/**\n * Max comment size in Gerrit (16kiB by default)\n * https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#change:~:text=change.commentSizeLimit\n */\nexport const MAX_GERRIT_COMMENT_SIZE = 16 * 1024;\n\nexport const REQUEST_DETAILS_FOR_PRS: GerritRequestDetail[] = [\n 'MESSAGES', // to get the pr body\n 'LABELS', // to get the reviewers\n 'DETAILED_ACCOUNTS', // to get the reviewers usernames\n 'CURRENT_REVISION', // to get the commit message\n 'COMMIT_FOOTERS', // to get the commit message\n] as const;\n\nexport function getGerritRepoUrl(repository: string, endpoint: string): string {\n // Find options for current host and determine Git endpoint\n const opts = hostRules.find({\n hostType: 'gerrit',\n url: endpoint,\n });\n\n const url = parseUrl(endpoint);\n if (!url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n if (!(opts.username && opts.password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\n );\n }\n url.username = opts.username;\n url.password = opts.password;\n url.pathname = joinUrlParts(\n url.pathname,\n 'a',\n encodeURIComponent(repository),\n );\n logger.trace(\n { url: url.toString() },\n 'using URL based on configured endpoint',\n );\n return url.toString();\n}\n\nexport function mapPrStateToGerritFilter(state?: PrState): string | null {\n switch (state) {\n case 'merged':\n return 'status:merged';\n case 'open':\n return 'status:open';\n case 'closed':\n return 'status:abandoned';\n case '!open':\n return '-status:open';\n case 'all':\n default:\n return null;\n }\n}\n\nexport function mapGerritChangeToPr(\n change: GerritChange,\n knownProperties?: {\n sourceBranch?: string;\n prBody?: string;\n },\n): Pr | null {\n const sourceBranch =\n knownProperties?.sourceBranch ?? extractSourceBranch(change);\n if (!sourceBranch) {\n return null;\n }\n return {\n number: change._number,\n state: mapGerritChangeStateToPrState(change.status),\n sourceBranch,\n targetBranch: change.branch,\n title: change.subject,\n createdAt: convertGerritDateToISO(change.created),\n labels: change.hashtags,\n reviewers:\n change.reviewers?.REVIEWER?.map((reviewer) => reviewer.username!) ?? [],\n bodyStruct: {\n hash: hashBody(knownProperties?.prBody ?? findPullRequestBody(change)),\n },\n sha: change.current_revision as LongCommitSha,\n };\n}\n\nexport function mapGerritChangeStateToPrState(\n state: GerritChangeStatus,\n): 'merged' | 'open' | 'closed' {\n switch (state) {\n case 'NEW':\n return 'open';\n case 'MERGED':\n return 'merged';\n case 'ABANDONED':\n return 'closed';\n }\n}\n\nexport function extractSourceBranch(change: GerritChange): string | undefined {\n let sourceBranch: string | undefined = undefined;\n\n if (change.current_revision) {\n const re = regEx(/^Renovate-Branch: (.+)$/m);\n const currentRevision = change.revisions![change.current_revision];\n const message = currentRevision.commit_with_footers;\n // v8 ignore else -- TODO: add test #40625\n if (message) {\n sourceBranch = re.exec(message)?.[1];\n }\n }\n\n return sourceBranch ?? undefined;\n}\n\nexport function findPullRequestBody(change: GerritChange): string | undefined {\n const msg = Array.from(change.messages ?? [])\n .reverse()\n .find((msg) => msg.tag === TAG_PULL_REQUEST_BODY);\n if (msg) {\n // Gerrit adds a \"Patch Set X:\" prefix to comments\n return msg.message.replace(/^Patch Set \\d+:\\n\\n/, '');\n }\n return undefined;\n}\n\nexport function mapBranchStatusToLabel(\n state: BranchStatus | 'UNKNOWN', // suppress default path code removal\n label: GerritLabelTypeInfo,\n): number {\n const numbers = Object.keys(label.values).map((x) => parseInt(x));\n switch (state) {\n case 'green':\n return Math.max(...numbers);\n case 'yellow':\n case 'red':\n return Math.min(...numbers);\n }\n /* v8 ignore next */\n return label.default_value;\n}\n\n// Convert Gerrit date format to ISO format\nexport function convertGerritDateToISO(date: string): string {\n return date.replace(' ', 'T');\n}\n"],"mappings":";;;;;;;;AAgBA,MAAa,qBAAqB;AAElC,MAAa,wBAAwB;;;;;AAMrC,MAAa,0BAA0B,KAAK;AAE5C,MAAa,0BAAiD;CAC5D;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,iBAAiB,YAAoB,UAA0B;CAE7E,MAAM,OAAOA,KAAe;EAC1B,UAAU;EACV,KAAK;EACN,CAAC;CAEF,MAAM,MAAM,SAAS,SAAS;AAC9B,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,2BAA2B;AAE7C,KAAI,EAAE,KAAK,YAAY,KAAK,UAC1B,OAAM,IAAI,MACR,6DACD;AAEH,KAAI,WAAW,KAAK;AACpB,KAAI,WAAW,KAAK;AACpB,KAAI,WAAW,aACb,IAAI,UACJ,KACA,mBAAmB,WAAW,CAC/B;AACD,QAAO,MACL,EAAE,KAAK,IAAI,UAAU,EAAE,EACvB,yCACD;AACD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,yBAAyB,OAAgC;AACvE,SAAQ,OAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,QACH,QAAO;EAET,QACE,QAAO;;;AAIb,SAAgB,oBACd,QACA,iBAIW;CACX,MAAM,eACJ,iBAAiB,gBAAgB,oBAAoB,OAAO;AAC9D,KAAI,CAAC,aACH,QAAO;AAET,QAAO;EACL,QAAQ,OAAO;EACf,OAAO,8BAA8B,OAAO,OAAO;EACnD;EACA,cAAc,OAAO;EACrB,OAAO,OAAO;EACd,WAAW,uBAAuB,OAAO,QAAQ;EACjD,QAAQ,OAAO;EACf,WACE,OAAO,WAAW,UAAU,KAAK,aAAa,SAAS,SAAU,IAAI,EAAE;EACzE,YAAY,EACV,MAAM,SAAS,iBAAiB,UAAU,oBAAoB,OAAO,CAAC,EACvE;EACD,KAAK,OAAO;EACb;;AAGH,SAAgB,8BACd,OAC8B;AAC9B,SAAQ,OAAR;EACE,KAAK,MACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,YACH,QAAO;;;AAIb,SAAgB,oBAAoB,QAA0C;CAC5E,IAAI,eAAmC;AAEvC,KAAI,OAAO,kBAAkB;EAC3B,MAAM,KAAK,MAAM,2BAA2B;EAE5C,MAAM,UADkB,OAAO,UAAW,OAAO,kBACjB;;AAEhC,MAAI,QACF,gBAAe,GAAG,KAAK,QAAQ,GAAG;;AAItC,QAAO,gBAAgB;;AAGzB,SAAgB,oBAAoB,QAA0C;CAC5E,MAAM,MAAM,MAAM,KAAK,OAAO,YAAY,EAAE,CAAC,CAC1C,SAAS,CACT,MAAM,QAAQ,IAAI,QAAQ,sBAAsB;AACnD,KAAI,IAEF,QAAO,IAAI,QAAQ,QAAQ,uBAAuB,GAAG;;AAKzD,SAAgB,uBACd,OACA,OACQ;CACR,MAAM,UAAU,OAAO,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"utils.js","names":["hostRules.find"],"sources":["../../../../lib/modules/platform/gerrit/utils.ts"],"sourcesContent":["import { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus, PrState } from '../../../types/index.ts';\nimport type { LongCommitSha } from '../../../util/git/types.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts, parseUrl } from '../../../util/url.ts';\nimport { hashBody } from '../pr-body.ts';\nimport type { Pr } from '../types.ts';\nimport type {\n GerritChange,\n GerritChangeStatus,\n GerritLabelTypeInfo,\n GerritRequestDetail,\n} from './types.ts';\n\nexport const MIN_GERRIT_VERSION = '3.0.0';\n\nexport const TAG_PULL_REQUEST_BODY = 'pull-request';\n\n/**\n * Max comment size in Gerrit (16kiB by default)\n * https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#change:~:text=change.commentSizeLimit\n */\nexport const MAX_GERRIT_COMMENT_SIZE = 16 * 1024;\n\nexport const REQUEST_DETAILS_FOR_PRS: GerritRequestDetail[] = [\n 'MESSAGES', // to get the pr body\n 'LABELS', // to get the reviewers\n 'DETAILED_ACCOUNTS', // to get the reviewers usernames\n 'CURRENT_REVISION', // to get the commit message\n 'COMMIT_FOOTERS', // to get the commit message\n] as const;\n\nexport function getGerritRepoUrl(repository: string, endpoint: string): string {\n // Find options for current host and determine Git endpoint\n const opts = hostRules.find({\n hostType: 'gerrit',\n url: endpoint,\n });\n\n const url = parseUrl(endpoint);\n if (!url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n if (!(opts.username && opts.password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\n );\n }\n url.username = opts.username;\n url.password = opts.password;\n url.pathname = joinUrlParts(\n url.pathname,\n 'a',\n encodeURIComponent(repository),\n );\n logger.trace(\n { url: url.toString() },\n 'using URL based on configured endpoint',\n );\n return url.toString();\n}\n\nexport function mapPrStateToGerritFilter(state?: PrState): string | null {\n switch (state) {\n case 'merged':\n return 'status:merged';\n case 'open':\n return 'status:open';\n case 'closed':\n return 'status:abandoned';\n case '!open':\n return '-status:open';\n case 'all':\n default:\n return null;\n }\n}\n\nexport function mapGerritChangeToPr(\n change: GerritChange,\n knownProperties?: {\n sourceBranch?: string;\n prBody?: string;\n },\n): Pr | null {\n const sourceBranch =\n knownProperties?.sourceBranch ?? extractSourceBranch(change);\n if (!sourceBranch) {\n return null;\n }\n return {\n number: change._number,\n state: mapGerritChangeStateToPrState(change.status),\n sourceBranch,\n targetBranch: change.branch,\n title: change.subject,\n createdAt: convertGerritDateToISO(change.created),\n labels: change.hashtags,\n reviewers:\n change.reviewers?.REVIEWER?.map((reviewer) => reviewer.username!) ?? [],\n bodyStruct: {\n hash: hashBody(knownProperties?.prBody ?? findPullRequestBody(change)),\n },\n sha: change.current_revision as LongCommitSha,\n };\n}\n\nexport function mapGerritChangeStateToPrState(\n state: GerritChangeStatus,\n): 'merged' | 'open' | 'closed' {\n switch (state) {\n case 'NEW':\n return 'open';\n case 'MERGED':\n return 'merged';\n case 'ABANDONED':\n return 'closed';\n }\n}\n\nexport function extractSourceBranch(change: GerritChange): string | undefined {\n let sourceBranch: string | undefined = undefined;\n\n if (change.current_revision) {\n const re = regEx(/^Renovate-Branch: (.+)$/m);\n const currentRevision = change.revisions![change.current_revision];\n const message = currentRevision.commit_with_footers;\n // v8 ignore else -- TODO: add test #40625\n if (message) {\n sourceBranch = re.exec(message)?.[1];\n }\n }\n\n return sourceBranch ?? undefined;\n}\n\nexport function findPullRequestBody(change: GerritChange): string | undefined {\n const msg = Array.from(change.messages ?? [])\n .reverse()\n .find((msg) => msg.tag === TAG_PULL_REQUEST_BODY);\n if (msg) {\n // Gerrit adds a \"Patch Set X:\" prefix to comments\n return msg.message.replace(/^Patch Set \\d+:\\n\\n/, '');\n }\n return undefined;\n}\n\nexport function mapBranchStatusToLabel(\n state: BranchStatus | 'UNKNOWN', // suppress default path code removal\n label: GerritLabelTypeInfo,\n): number {\n const numbers = Object.keys(label.values).map((x) => parseInt(x, 10));\n switch (state) {\n case 'green':\n return Math.max(...numbers);\n case 'yellow':\n case 'red':\n return Math.min(...numbers);\n }\n /* v8 ignore next */\n return label.default_value;\n}\n\n// Convert Gerrit date format to ISO format\nexport function convertGerritDateToISO(date: string): string {\n return date.replace(' ', 'T');\n}\n"],"mappings":";;;;;;;;AAgBA,MAAa,qBAAqB;AAElC,MAAa,wBAAwB;;;;;AAMrC,MAAa,0BAA0B,KAAK;AAE5C,MAAa,0BAAiD;CAC5D;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,iBAAiB,YAAoB,UAA0B;CAE7E,MAAM,OAAOA,KAAe;EAC1B,UAAU;EACV,KAAK;EACN,CAAC;CAEF,MAAM,MAAM,SAAS,SAAS;AAC9B,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,2BAA2B;AAE7C,KAAI,EAAE,KAAK,YAAY,KAAK,UAC1B,OAAM,IAAI,MACR,6DACD;AAEH,KAAI,WAAW,KAAK;AACpB,KAAI,WAAW,KAAK;AACpB,KAAI,WAAW,aACb,IAAI,UACJ,KACA,mBAAmB,WAAW,CAC/B;AACD,QAAO,MACL,EAAE,KAAK,IAAI,UAAU,EAAE,EACvB,yCACD;AACD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,yBAAyB,OAAgC;AACvE,SAAQ,OAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,QACH,QAAO;EAET,QACE,QAAO;;;AAIb,SAAgB,oBACd,QACA,iBAIW;CACX,MAAM,eACJ,iBAAiB,gBAAgB,oBAAoB,OAAO;AAC9D,KAAI,CAAC,aACH,QAAO;AAET,QAAO;EACL,QAAQ,OAAO;EACf,OAAO,8BAA8B,OAAO,OAAO;EACnD;EACA,cAAc,OAAO;EACrB,OAAO,OAAO;EACd,WAAW,uBAAuB,OAAO,QAAQ;EACjD,QAAQ,OAAO;EACf,WACE,OAAO,WAAW,UAAU,KAAK,aAAa,SAAS,SAAU,IAAI,EAAE;EACzE,YAAY,EACV,MAAM,SAAS,iBAAiB,UAAU,oBAAoB,OAAO,CAAC,EACvE;EACD,KAAK,OAAO;EACb;;AAGH,SAAgB,8BACd,OAC8B;AAC9B,SAAQ,OAAR;EACE,KAAK,MACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,YACH,QAAO;;;AAIb,SAAgB,oBAAoB,QAA0C;CAC5E,IAAI,eAAmC;AAEvC,KAAI,OAAO,kBAAkB;EAC3B,MAAM,KAAK,MAAM,2BAA2B;EAE5C,MAAM,UADkB,OAAO,UAAW,OAAO,kBACjB;;AAEhC,MAAI,QACF,gBAAe,GAAG,KAAK,QAAQ,GAAG;;AAItC,QAAO,gBAAgB;;AAGzB,SAAgB,oBAAoB,QAA0C;CAC5E,MAAM,MAAM,MAAM,KAAK,OAAO,YAAY,EAAE,CAAC,CAC1C,SAAS,CACT,MAAM,QAAQ,IAAI,QAAQ,sBAAsB;AACnD,KAAI,IAEF,QAAO,IAAI,QAAQ,QAAQ,uBAAuB,GAAG;;AAKzD,SAAgB,uBACd,OACA,OACQ;CACR,MAAM,UAAU,OAAO,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,SAAS,GAAG,GAAG,CAAC;AACrE,SAAQ,OAAR;EACE,KAAK,QACH,QAAO,KAAK,IAAI,GAAG,QAAQ;EAC7B,KAAK;EACL,KAAK,MACH,QAAO,KAAK,IAAI,GAAG,QAAQ;;;AAG/B,QAAO,MAAM;;AAIf,SAAgB,uBAAuB,MAAsB;AAC3D,QAAO,KAAK,QAAQ,KAAK,IAAI"}
|
|
@@ -7,7 +7,7 @@ function mapPrFromScmToRenovate(pr) {
|
|
|
7
7
|
closedAt: pr.closeDate ?? void 0,
|
|
8
8
|
hasAssignees: !!pr.reviewer?.length,
|
|
9
9
|
labels: pr.labels,
|
|
10
|
-
number: parseInt(pr.id),
|
|
10
|
+
number: parseInt(pr.id, 10),
|
|
11
11
|
reviewers: pr.reviewer?.map((review) => review.displayName) ?? [],
|
|
12
12
|
state: pr.status,
|
|
13
13
|
title: pr.title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapper.js","names":[],"sources":["../../../../lib/modules/platform/scm-manager/mapper.ts"],"sourcesContent":["import type { Pr } from '../types.ts';\nimport type { PullRequest } from './schema.ts';\n\nexport function mapPrFromScmToRenovate(pr: PullRequest): Pr {\n return {\n sourceBranch: pr.source,\n targetBranch: pr.target,\n createdAt: pr.creationDate,\n closedAt: pr.closeDate ?? undefined,\n hasAssignees: !!pr.reviewer?.length,\n labels: pr.labels,\n number: parseInt(pr.id),\n reviewers: pr.reviewer?.map((review) => review.displayName) ?? [],\n state: pr.status,\n title: pr.title,\n isDraft: pr.status === 'DRAFT',\n };\n}\n"],"mappings":";AAGA,SAAgB,uBAAuB,IAAqB;AAC1D,QAAO;EACL,cAAc,GAAG;EACjB,cAAc,GAAG;EACjB,WAAW,GAAG;EACd,UAAU,GAAG,aAAa;EAC1B,cAAc,CAAC,CAAC,GAAG,UAAU;EAC7B,QAAQ,GAAG;EACX,QAAQ,SAAS,GAAG,GAAG;
|
|
1
|
+
{"version":3,"file":"mapper.js","names":[],"sources":["../../../../lib/modules/platform/scm-manager/mapper.ts"],"sourcesContent":["import type { Pr } from '../types.ts';\nimport type { PullRequest } from './schema.ts';\n\nexport function mapPrFromScmToRenovate(pr: PullRequest): Pr {\n return {\n sourceBranch: pr.source,\n targetBranch: pr.target,\n createdAt: pr.creationDate,\n closedAt: pr.closeDate ?? undefined,\n hasAssignees: !!pr.reviewer?.length,\n labels: pr.labels,\n number: parseInt(pr.id, 10),\n reviewers: pr.reviewer?.map((review) => review.displayName) ?? [],\n state: pr.status,\n title: pr.title,\n isDraft: pr.status === 'DRAFT',\n };\n}\n"],"mappings":";AAGA,SAAgB,uBAAuB,IAAqB;AAC1D,QAAO;EACL,cAAc,GAAG;EACjB,cAAc,GAAG;EACjB,WAAW,GAAG;EACd,UAAU,GAAG,aAAa;EAC1B,cAAc,CAAC,CAAC,GAAG,UAAU;EAC7B,QAAQ,GAAG;EACX,QAAQ,SAAS,GAAG,IAAI,GAAG;EAC3B,WAAW,GAAG,UAAU,KAAK,WAAW,OAAO,YAAY,IAAI,EAAE;EACjE,OAAO,GAAG;EACV,OAAO,GAAG;EACV,SAAS,GAAG,WAAW;EACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/azure-rest-api/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\n\nexport const id = 'azure-rest-api';\nexport const displayName = 'azure-rest-api';\n\nexport const urls = [\n 'https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md#api-versioning',\n];\n\nexport const supportsRanges = false;\n\nconst AZURE_REST_API_VERSION_REGEX = regEx(\n /^(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})(?<prerelease>-[a-z]+)?$/,\n);\n\nclass AzureRestApiVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (!version) {\n return null;\n }\n\n const matchGroups = AZURE_REST_API_VERSION_REGEX.exec(version)?.groups;\n\n if (!matchGroups) {\n return null;\n }\n\n const { year, month, day, prerelease } = matchGroups;\n\n return {\n release: [parseInt(`${year}${month}${day}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/azure-rest-api/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport type { GenericVersion } from '../generic.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\n\nexport const id = 'azure-rest-api';\nexport const displayName = 'azure-rest-api';\n\nexport const urls = [\n 'https://github.com/microsoft/api-guidelines/blob/vNext/azure/Guidelines.md#api-versioning',\n];\n\nexport const supportsRanges = false;\n\nconst AZURE_REST_API_VERSION_REGEX = regEx(\n /^(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})(?<prerelease>-[a-z]+)?$/,\n);\n\nclass AzureRestApiVersioningApi extends GenericVersioningApi {\n protected _parse(version: string): GenericVersion | null {\n if (!version) {\n return null;\n }\n\n const matchGroups = AZURE_REST_API_VERSION_REGEX.exec(version)?.groups;\n\n if (!matchGroups) {\n return null;\n }\n\n const { year, month, day, prerelease } = matchGroups;\n\n return {\n release: [parseInt(`${year}${month}${day}`, 10), 0, 0],\n prerelease,\n };\n }\n\n protected override _compare(_version: string, _other: string): number {\n if (_version === _other) {\n return 0;\n }\n\n return _version > _other ? 1 : -1;\n }\n}\n\nexport const api: VersioningApi = new AzureRestApiVersioningApi();\n\nexport default api;\n"],"mappings":";;;;AAKA,MAAa,KAAK;AASlB,MAAM,+BAA+B,MACnC,wEACD;AAED,IAAM,4BAAN,cAAwC,qBAAqB;CAC3D,AAAU,OAAO,SAAwC;AACvD,MAAI,CAAC,QACH,QAAO;EAGT,MAAM,cAAc,6BAA6B,KAAK,QAAQ,EAAE;AAEhE,MAAI,CAAC,YACH,QAAO;EAGT,MAAM,EAAE,MAAM,OAAO,KAAK,eAAe;AAEzC,SAAO;GACL,SAAS;IAAC,SAAS,GAAG,OAAO,QAAQ,OAAO,GAAG;IAAE;IAAG;IAAE;GACtD;GACD;;CAGH,AAAmB,SAAS,UAAkB,QAAwB;AACpE,MAAI,aAAa,OACf,QAAO;AAGT,SAAO,WAAW,SAAS,IAAI;;;AAInC,MAAa,MAAqB,IAAI,2BAA2B"}
|
|
@@ -33,7 +33,7 @@ var Identifier = class Identifier {
|
|
|
33
33
|
this.asString = value;
|
|
34
34
|
if (Identifier.digitsOnlyMatcher.test(value)) {
|
|
35
35
|
this.isDigitsOnly = true;
|
|
36
|
-
this.asNumber = parseInt(value);
|
|
36
|
+
this.asNumber = parseInt(value, 10);
|
|
37
37
|
} else {
|
|
38
38
|
this.isDigitsOnly = false;
|
|
39
39
|
this.asNumber = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bzlmod-version.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/bzlmod-version.ts"],"sourcesContent":["/**\n * @fileoverview Contains classes that represent a Bazel module version.\n */\n\n/**\n * Represents a single value in a VersionPart. For example, the version string\n * `1.2.3` has three identifiers: `1`, `2`, `3`.\n */\nexport class Identifier {\n /**\n * Returns the identifier as a string.\n */\n readonly asString: string;\n\n /**\n * If the identifier only contains digits, this is the numeric value.\n * Otherwise, it is `0`.\n */\n readonly asNumber: number;\n\n /**\n * Specifies whether the identifier only contains digits.\n */\n readonly isDigitsOnly: boolean;\n\n /**\n * Regular expression used to identify whether an identifier value only\n * contains digits.\n */\n static readonly digitsOnlyMatcher = /^[0-9]+$/;\n\n /**\n * @param value The value that is parsed for the Bazel module version parts.\n */\n constructor(value: string) {\n if (value === '') {\n throw new Error('Identifier value cannot be empty.');\n }\n this.asString = value;\n if (Identifier.digitsOnlyMatcher.test(value)) {\n this.isDigitsOnly = true;\n this.asNumber = parseInt(value);\n } else {\n this.isDigitsOnly = false;\n this.asNumber = 0;\n }\n }\n\n /**\n * Determines whether this identifier and another identifier are equal.\n */\n equals(other: Identifier): boolean {\n return this.asString === other.asString;\n }\n\n /**\n * Determines whether this identifier comes before the other identifier.\n */\n isLessThan(other: Identifier): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n // isDigitsOnly: true first\n if (this.isDigitsOnly !== other.isDigitsOnly) {\n return this.isDigitsOnly;\n }\n if (this.asNumber !== other.asNumber) {\n return this.asNumber < other.asNumber;\n }\n return this.asString < other.asString;\n }\n}\n\n/**\n * A collection of {@link Identifier} values that represent a portion of a\n * Bazel module version.\n */\nexport class VersionPart extends Array<Identifier> {\n /**\n * Creates a {@link VersionPart} populated with the provided identifiers.\n */\n static create(...items: (Identifier | string)[]): VersionPart {\n const idents = items.map((item) => {\n if (typeof item === 'string') {\n return new Identifier(item);\n }\n return item;\n });\n const vp = new VersionPart();\n vp.push(...idents);\n return vp;\n }\n\n /**\n * The string representation of the version part.\n */\n get asString(): string {\n return this.map((ident) => ident.asString).join('.');\n }\n\n /**\n * Specifies whether this contains any identifiers.\n */\n get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Returns the equivalent of the a Semver major value.\n */\n get major(): number {\n return this.length > 0 ? this[0].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver minor value.\n */\n get minor(): number {\n return this.length > 1 ? this[1].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver patch value.\n */\n get patch(): number {\n return this.length > 2 ? this[2].asNumber : 0;\n }\n\n /**\n * Determines whether this version part is equal to the other.\n */\n equals(other: VersionPart): boolean {\n if (this.length !== other.length) {\n return false;\n }\n for (let i = 0; i < this.length; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Determines whether this version part comes before the other.\n */\n isLessThan(other: VersionPart): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.equals(other)) {\n return false;\n }\n // Non-empty are first\n if (this.length === 0 && other.length !== 0) {\n return false;\n }\n if (other.length === 0 && this.length !== 0) {\n return true;\n }\n const shortestLen = this.length < other.length ? this.length : other.length;\n for (let i = 0; i < shortestLen; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return a.isLessThan(b);\n }\n }\n return this.length < other.length;\n }\n}\n\n// Represents the capture groups produced by BzlmodVersion.versionMatcher.\ninterface VersionRegexResult {\n release: string;\n prerelease: string | undefined;\n build: string | undefined;\n}\n\n/**\n * Represents a version in the Bazel module system. The version format we support is\n * `RELEASE[-PRERELEASE][+BUILD]`, where `RELEASE`, `PRERELEASE`, and `BUILD` are\n * each a sequence of \"identifiers\" (defined as a non-empty sequence of ASCII alphanumerical\n * characters and hyphens) separated by dots. The `RELEASE` part may not contain hyphens.\n *\n * Otherwise, this format is identical to SemVer, especially in terms of the comparison algorithm\n * (https://semver.org/#spec-item-11). In other words, this format is intentionally looser than\n * SemVer; in particular:\n *\n * - the \"release\" part isn't limited to exactly 3 segments (major, minor, patch), but can be\n * fewer or more;\n * - each segment in the \"release\" part can be identifiers instead of just numbers (so letters\n * are also allowed -- although hyphens are not).\n *\n * Any valid SemVer version is a valid Bazel module version. Additionally, two SemVer versions\n * `a` and `b` compare `a < b` iff the same holds when they're compared as Bazel * module versions.\n *\n * The special \"empty string\" version can also be used, and compares higher than everything else.\n * It signifies that there is a NonRegistryOverride for a module.\n */\nexport class BzlmodVersion {\n readonly original: string;\n readonly release: VersionPart;\n readonly prerelease: VersionPart;\n readonly build: VersionPart;\n\n /**\n * The regular expression that identifies a valid Bazel module version.\n */\n static readonly versionMatcher =\n /^(?<release>[a-zA-Z0-9.]+)(?:-(?<prerelease>[a-zA-Z0-9.-]+))?(?:\\+(?<build>[a-zA-Z0-9.-]+))?$/;\n\n /**\n * @param version The string that is parsed for the Bazel module version\n * values.\n */\n constructor(version: string) {\n this.original = version;\n if (version === '') {\n this.release = VersionPart.create();\n this.prerelease = VersionPart.create();\n this.build = VersionPart.create();\n return;\n }\n const vparts: Partial<VersionRegexResult> | undefined =\n BzlmodVersion.versionMatcher.exec(version)?.groups;\n if (!vparts) {\n throw new Error(`Invalid Bazel module version: ${version}`);\n }\n // The regex check above ensures that we will have a release group.\n const rparts = vparts.release!.split('.');\n this.release = VersionPart.create(...rparts);\n const pparts = vparts.prerelease ? vparts.prerelease.split('.') : [];\n this.prerelease = VersionPart.create(...pparts);\n // Do not parse the build value. Treat it as a single value.\n const bparts = vparts.build ? [vparts.build] : [];\n this.build = VersionPart.create(...bparts);\n }\n\n /**\n * Specifies whether this is a pre-release version.\n */\n get isPrerelease(): boolean {\n return !this.prerelease.isEmpty;\n }\n\n // Comparison\n\n /**\n * Determines whether this Bazel module version is equal to the other.\n *\n * @param other The other version for the comparison.\n * @param ignoreBuild? If specified, determines whether the build value is\n * evaluated as part of the equality check. This is useful when\n * determining precedence.\n */\n equals(other: BzlmodVersion, ignoreBuild?: boolean): boolean {\n if (ignoreBuild) {\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease)\n );\n }\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease) &&\n this.build.equals(other.build)\n );\n }\n\n /**\n * Determines whether this Bazel module version comes before the other.\n */\n isLessThan(other: BzlmodVersion): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.release.isLessThan(other.release)) {\n return true;\n }\n // Ensure that prerelease is listed before regular releases\n if (this.isPrerelease && !other.isPrerelease) {\n return true;\n }\n if (this.prerelease.isLessThan(other.prerelease)) {\n return true;\n }\n // NOTE: We ignore the build value for precedence comparison per the Semver spec.\n // https://semver.org/#spec-item-10\n return false;\n }\n\n /**\n * Determines whether this Bazel module version comes after the other.\n */\n isGreaterThan(other: BzlmodVersion): boolean {\n return BzlmodVersion.defaultCompare(this, other) === 1;\n }\n\n /**\n * Evaluates two Bazel module versions and returns a value specifying whether\n * a < b (-1), a == b (0), or a > b (1).\n */\n static defaultCompare(a: BzlmodVersion, b: BzlmodVersion): number {\n if (a.equals(b, true)) {\n return 0;\n }\n if (a.isLessThan(b)) {\n return -1;\n }\n return 1;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bzlmod-version.js","names":[],"sources":["../../../../lib/modules/versioning/bazel-module/bzlmod-version.ts"],"sourcesContent":["/**\n * @fileoverview Contains classes that represent a Bazel module version.\n */\n\n/**\n * Represents a single value in a VersionPart. For example, the version string\n * `1.2.3` has three identifiers: `1`, `2`, `3`.\n */\nexport class Identifier {\n /**\n * Returns the identifier as a string.\n */\n readonly asString: string;\n\n /**\n * If the identifier only contains digits, this is the numeric value.\n * Otherwise, it is `0`.\n */\n readonly asNumber: number;\n\n /**\n * Specifies whether the identifier only contains digits.\n */\n readonly isDigitsOnly: boolean;\n\n /**\n * Regular expression used to identify whether an identifier value only\n * contains digits.\n */\n static readonly digitsOnlyMatcher = /^[0-9]+$/;\n\n /**\n * @param value The value that is parsed for the Bazel module version parts.\n */\n constructor(value: string) {\n if (value === '') {\n throw new Error('Identifier value cannot be empty.');\n }\n this.asString = value;\n if (Identifier.digitsOnlyMatcher.test(value)) {\n this.isDigitsOnly = true;\n this.asNumber = parseInt(value, 10);\n } else {\n this.isDigitsOnly = false;\n this.asNumber = 0;\n }\n }\n\n /**\n * Determines whether this identifier and another identifier are equal.\n */\n equals(other: Identifier): boolean {\n return this.asString === other.asString;\n }\n\n /**\n * Determines whether this identifier comes before the other identifier.\n */\n isLessThan(other: Identifier): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n // isDigitsOnly: true first\n if (this.isDigitsOnly !== other.isDigitsOnly) {\n return this.isDigitsOnly;\n }\n if (this.asNumber !== other.asNumber) {\n return this.asNumber < other.asNumber;\n }\n return this.asString < other.asString;\n }\n}\n\n/**\n * A collection of {@link Identifier} values that represent a portion of a\n * Bazel module version.\n */\nexport class VersionPart extends Array<Identifier> {\n /**\n * Creates a {@link VersionPart} populated with the provided identifiers.\n */\n static create(...items: (Identifier | string)[]): VersionPart {\n const idents = items.map((item) => {\n if (typeof item === 'string') {\n return new Identifier(item);\n }\n return item;\n });\n const vp = new VersionPart();\n vp.push(...idents);\n return vp;\n }\n\n /**\n * The string representation of the version part.\n */\n get asString(): string {\n return this.map((ident) => ident.asString).join('.');\n }\n\n /**\n * Specifies whether this contains any identifiers.\n */\n get isEmpty(): boolean {\n return this.length === 0;\n }\n\n /**\n * Returns the equivalent of the a Semver major value.\n */\n get major(): number {\n return this.length > 0 ? this[0].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver minor value.\n */\n get minor(): number {\n return this.length > 1 ? this[1].asNumber : 0;\n }\n\n /**\n * Returns the equivalent of the a Semver patch value.\n */\n get patch(): number {\n return this.length > 2 ? this[2].asNumber : 0;\n }\n\n /**\n * Determines whether this version part is equal to the other.\n */\n equals(other: VersionPart): boolean {\n if (this.length !== other.length) {\n return false;\n }\n for (let i = 0; i < this.length; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Determines whether this version part comes before the other.\n */\n isLessThan(other: VersionPart): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.equals(other)) {\n return false;\n }\n // Non-empty are first\n if (this.length === 0 && other.length !== 0) {\n return false;\n }\n if (other.length === 0 && this.length !== 0) {\n return true;\n }\n const shortestLen = this.length < other.length ? this.length : other.length;\n for (let i = 0; i < shortestLen; i++) {\n const a = this[i];\n const b = other[i];\n if (!a.equals(b)) {\n return a.isLessThan(b);\n }\n }\n return this.length < other.length;\n }\n}\n\n// Represents the capture groups produced by BzlmodVersion.versionMatcher.\ninterface VersionRegexResult {\n release: string;\n prerelease: string | undefined;\n build: string | undefined;\n}\n\n/**\n * Represents a version in the Bazel module system. The version format we support is\n * `RELEASE[-PRERELEASE][+BUILD]`, where `RELEASE`, `PRERELEASE`, and `BUILD` are\n * each a sequence of \"identifiers\" (defined as a non-empty sequence of ASCII alphanumerical\n * characters and hyphens) separated by dots. The `RELEASE` part may not contain hyphens.\n *\n * Otherwise, this format is identical to SemVer, especially in terms of the comparison algorithm\n * (https://semver.org/#spec-item-11). In other words, this format is intentionally looser than\n * SemVer; in particular:\n *\n * - the \"release\" part isn't limited to exactly 3 segments (major, minor, patch), but can be\n * fewer or more;\n * - each segment in the \"release\" part can be identifiers instead of just numbers (so letters\n * are also allowed -- although hyphens are not).\n *\n * Any valid SemVer version is a valid Bazel module version. Additionally, two SemVer versions\n * `a` and `b` compare `a < b` iff the same holds when they're compared as Bazel * module versions.\n *\n * The special \"empty string\" version can also be used, and compares higher than everything else.\n * It signifies that there is a NonRegistryOverride for a module.\n */\nexport class BzlmodVersion {\n readonly original: string;\n readonly release: VersionPart;\n readonly prerelease: VersionPart;\n readonly build: VersionPart;\n\n /**\n * The regular expression that identifies a valid Bazel module version.\n */\n static readonly versionMatcher =\n /^(?<release>[a-zA-Z0-9.]+)(?:-(?<prerelease>[a-zA-Z0-9.-]+))?(?:\\+(?<build>[a-zA-Z0-9.-]+))?$/;\n\n /**\n * @param version The string that is parsed for the Bazel module version\n * values.\n */\n constructor(version: string) {\n this.original = version;\n if (version === '') {\n this.release = VersionPart.create();\n this.prerelease = VersionPart.create();\n this.build = VersionPart.create();\n return;\n }\n const vparts: Partial<VersionRegexResult> | undefined =\n BzlmodVersion.versionMatcher.exec(version)?.groups;\n if (!vparts) {\n throw new Error(`Invalid Bazel module version: ${version}`);\n }\n // The regex check above ensures that we will have a release group.\n const rparts = vparts.release!.split('.');\n this.release = VersionPart.create(...rparts);\n const pparts = vparts.prerelease ? vparts.prerelease.split('.') : [];\n this.prerelease = VersionPart.create(...pparts);\n // Do not parse the build value. Treat it as a single value.\n const bparts = vparts.build ? [vparts.build] : [];\n this.build = VersionPart.create(...bparts);\n }\n\n /**\n * Specifies whether this is a pre-release version.\n */\n get isPrerelease(): boolean {\n return !this.prerelease.isEmpty;\n }\n\n // Comparison\n\n /**\n * Determines whether this Bazel module version is equal to the other.\n *\n * @param other The other version for the comparison.\n * @param ignoreBuild? If specified, determines whether the build value is\n * evaluated as part of the equality check. This is useful when\n * determining precedence.\n */\n equals(other: BzlmodVersion, ignoreBuild?: boolean): boolean {\n if (ignoreBuild) {\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease)\n );\n }\n return (\n this.release.equals(other.release) &&\n this.prerelease.equals(other.prerelease) &&\n this.build.equals(other.build)\n );\n }\n\n /**\n * Determines whether this Bazel module version comes before the other.\n */\n isLessThan(other: BzlmodVersion): boolean {\n // This logic mirrors the comparison logic in\n // https://cs.opensource.google/bazel/bazel/+/refs/heads/master:src/main/java/com/google/devtools/build/lib/bazel/bzlmod/Version.java\n if (this.release.isLessThan(other.release)) {\n return true;\n }\n // Ensure that prerelease is listed before regular releases\n if (this.isPrerelease && !other.isPrerelease) {\n return true;\n }\n if (this.prerelease.isLessThan(other.prerelease)) {\n return true;\n }\n // NOTE: We ignore the build value for precedence comparison per the Semver spec.\n // https://semver.org/#spec-item-10\n return false;\n }\n\n /**\n * Determines whether this Bazel module version comes after the other.\n */\n isGreaterThan(other: BzlmodVersion): boolean {\n return BzlmodVersion.defaultCompare(this, other) === 1;\n }\n\n /**\n * Evaluates two Bazel module versions and returns a value specifying whether\n * a < b (-1), a == b (0), or a > b (1).\n */\n static defaultCompare(a: BzlmodVersion, b: BzlmodVersion): number {\n if (a.equals(b, true)) {\n return 0;\n }\n if (a.isLessThan(b)) {\n return -1;\n }\n return 1;\n }\n}\n"],"mappings":"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"}
|