renovate 43.271.0 → 43.271.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.
Files changed (134) hide show
  1. package/dist/config/options/index.js +1 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/presets/util.js +3 -1
  4. package/dist/config/presets/util.js.map +1 -1
  5. package/dist/global-config-option-defaults.generated.js +1 -1
  6. package/dist/global-config-option-defaults.generated.js.map +1 -1
  7. package/dist/logger/renovate-logger.js.map +1 -1
  8. package/dist/logger/with-sanitizer.js +2 -2
  9. package/dist/logger/with-sanitizer.js.map +1 -1
  10. package/dist/modules/datasource/docker/index.js +3 -1
  11. package/dist/modules/datasource/docker/index.js.map +1 -1
  12. package/dist/modules/datasource/index.d.ts +2 -2
  13. package/dist/modules/datasource/index.js +6 -2
  14. package/dist/modules/datasource/index.js.map +1 -1
  15. package/dist/modules/datasource/rubygems/metadata-cache.js +9 -7
  16. package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
  17. package/dist/modules/datasource/sbt-package/index.js +5 -3
  18. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  19. package/dist/modules/datasource/sbt-plugin/index.js +2 -2
  20. package/dist/modules/datasource/sbt-plugin/index.js.map +1 -1
  21. package/dist/modules/manager/bazel/artifacts.js +2 -2
  22. package/dist/modules/manager/bazel/artifacts.js.map +1 -1
  23. package/dist/modules/manager/custom/index.js.map +1 -1
  24. package/dist/modules/manager/deno/update.js +4 -2
  25. package/dist/modules/manager/deno/update.js.map +1 -1
  26. package/dist/modules/manager/deps-edn/parser.js +2 -2
  27. package/dist/modules/manager/deps-edn/parser.js.map +1 -1
  28. package/dist/modules/manager/fingerprint.generated.js +14 -14
  29. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  30. package/dist/modules/manager/gomod/artifacts.js +3 -1
  31. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  32. package/dist/modules/manager/gradle/parser/assignments.js +22 -18
  33. package/dist/modules/manager/gradle/parser/assignments.js.map +1 -1
  34. package/dist/modules/manager/gradle/parser/common.js +12 -8
  35. package/dist/modules/manager/gradle/parser/common.js.map +1 -1
  36. package/dist/modules/manager/gradle/parser/objects.js +11 -9
  37. package/dist/modules/manager/gradle/parser/objects.js.map +1 -1
  38. package/dist/modules/manager/gradle/parser/registry-urls.js +6 -6
  39. package/dist/modules/manager/gradle/parser/registry-urls.js.map +1 -1
  40. package/dist/modules/manager/index.d.ts +2 -2
  41. package/dist/modules/manager/index.js +6 -2
  42. package/dist/modules/manager/index.js.map +1 -1
  43. package/dist/modules/manager/leiningen/extract.js +8 -4
  44. package/dist/modules/manager/leiningen/extract.js.map +1 -1
  45. package/dist/modules/manager/maven/extract.js +13 -11
  46. package/dist/modules/manager/maven/extract.js.map +1 -1
  47. package/dist/modules/manager/npm/post-update/index.js +3 -1
  48. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  49. package/dist/modules/platform/azure/azure-helper.js +2 -2
  50. package/dist/modules/platform/azure/azure-helper.js.map +1 -1
  51. package/dist/modules/platform/bitbucket/comments.js +10 -4
  52. package/dist/modules/platform/bitbucket/comments.js.map +1 -1
  53. package/dist/modules/platform/bitbucket/index.js +3 -1
  54. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  55. package/dist/modules/platform/bitbucket-server/index.js +13 -5
  56. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  57. package/dist/modules/platform/forgejo/forgejo-helper.js +3 -1
  58. package/dist/modules/platform/forgejo/forgejo-helper.js.map +1 -1
  59. package/dist/modules/platform/gitea/gitea-helper.js +3 -1
  60. package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
  61. package/dist/modules/platform/github/index.js +10 -4
  62. package/dist/modules/platform/github/index.js.map +1 -1
  63. package/dist/modules/platform/github/massage-markdown-links.js +2 -2
  64. package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
  65. package/dist/modules/platform/gitlab/index.js +10 -4
  66. package/dist/modules/platform/gitlab/index.js.map +1 -1
  67. package/dist/modules/platform/index.d.ts +1 -1
  68. package/dist/modules/platform/index.js +3 -1
  69. package/dist/modules/platform/index.js.map +1 -1
  70. package/dist/modules/versioning/cargo/index.js +15 -5
  71. package/dist/modules/versioning/cargo/index.js.map +1 -1
  72. package/dist/modules/versioning/go-mod-directive/index.js +9 -3
  73. package/dist/modules/versioning/go-mod-directive/index.js.map +1 -1
  74. package/dist/modules/versioning/gradle/index.js +17 -15
  75. package/dist/modules/versioning/gradle/index.js.map +1 -1
  76. package/dist/modules/versioning/hex/index.js +6 -2
  77. package/dist/modules/versioning/hex/index.js.map +1 -1
  78. package/dist/modules/versioning/index.d.ts +2 -2
  79. package/dist/modules/versioning/index.js +6 -2
  80. package/dist/modules/versioning/index.js.map +1 -1
  81. package/dist/modules/versioning/maven/compare.js +5 -3
  82. package/dist/modules/versioning/maven/compare.js.map +1 -1
  83. package/dist/modules/versioning/maven/index.js +23 -17
  84. package/dist/modules/versioning/maven/index.js.map +1 -1
  85. package/dist/modules/versioning/npm/index.js +6 -2
  86. package/dist/modules/versioning/npm/index.js.map +1 -1
  87. package/dist/modules/versioning/pep440/index.js +5 -3
  88. package/dist/modules/versioning/pep440/index.js.map +1 -1
  89. package/dist/modules/versioning/ruby/index.js +39 -19
  90. package/dist/modules/versioning/ruby/index.js.map +1 -1
  91. package/dist/modules/versioning/ruby/operator.js +6 -2
  92. package/dist/modules/versioning/ruby/operator.js.map +1 -1
  93. package/dist/modules/versioning/ruby/range.js +4 -4
  94. package/dist/modules/versioning/ruby/range.js.map +1 -1
  95. package/dist/modules/versioning/ruby/version.js +35 -23
  96. package/dist/modules/versioning/ruby/version.js.map +1 -1
  97. package/dist/modules/versioning/semver/index.js +3 -1
  98. package/dist/modules/versioning/semver/index.js.map +1 -1
  99. package/dist/modules/versioning/semver-coerced/index.d.ts +1 -1
  100. package/dist/modules/versioning/semver-coerced/index.js +3 -1
  101. package/dist/modules/versioning/semver-coerced/index.js.map +1 -1
  102. package/dist/modules/versioning/swift/index.js +6 -2
  103. package/dist/modules/versioning/swift/index.js.map +1 -1
  104. package/dist/util/cache/package/with-cache.js +4 -2
  105. package/dist/util/cache/package/with-cache.js.map +1 -1
  106. package/dist/util/exec/common.d.ts +1 -1
  107. package/dist/util/exec/common.js +3 -1
  108. package/dist/util/exec/common.js.map +1 -1
  109. package/dist/util/git/index.js +2 -2
  110. package/dist/util/git/index.js.map +1 -1
  111. package/dist/util/http/bitbucket-server.js +2 -2
  112. package/dist/util/http/bitbucket-server.js.map +1 -1
  113. package/dist/util/http/forgejo.js +2 -2
  114. package/dist/util/http/forgejo.js.map +1 -1
  115. package/dist/util/http/gitea.js +2 -2
  116. package/dist/util/http/gitea.js.map +1 -1
  117. package/dist/util/http/github.d.ts +1 -1
  118. package/dist/util/http/github.js +2 -2
  119. package/dist/util/http/github.js.map +1 -1
  120. package/dist/util/http/gitlab.d.ts +1 -1
  121. package/dist/util/http/gitlab.js +2 -2
  122. package/dist/util/http/gitlab.js.map +1 -1
  123. package/dist/util/http/scm-manager.js +5 -3
  124. package/dist/util/http/scm-manager.js.map +1 -1
  125. package/dist/workers/repository/extract/index.js +2 -2
  126. package/dist/workers/repository/extract/index.js.map +1 -1
  127. package/dist/workers/repository/update/pr/changelog/source.js +3 -1
  128. package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
  129. package/dist/workers/repository/updates/flatten.js +3 -1
  130. package/dist/workers/repository/updates/flatten.js.map +1 -1
  131. package/dist/workers/repository/updates/generate.js +3 -1
  132. package/dist/workers/repository/updates/generate.js.map +1 -1
  133. package/package.json +2 -2
  134. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","names":["hostRules.find","p.all"],"sources":["../../../lib/util/http/github.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyObject,\n isNullOrUndefined,\n isPlainObject,\n} from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { z } from 'zod/v4';\nimport { GlobalConfig } from '../../config/global.ts';\nimport {\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { getCache } from '../cache/repository/index.ts';\nimport { getEnv } from '../env.ts';\nimport * as hostRules from '../host-rules.ts';\nimport { maskToken } from '../mask.ts';\nimport * as p from '../promises.ts';\nimport { range } from '../range.ts';\nimport { regEx } from '../regex.ts';\nimport { LooseArray } from '../schema-utils/index.ts';\nimport { joinUrlParts, parseLinkHeader, parseUrl } from '../url.ts';\nimport { findMatchingRule } from './host-rules.ts';\nimport {\n HttpBase,\n type InternalHttpOptions,\n type InternalJsonUnsafeOptions,\n} from './http.ts';\nimport type { GotLegacyError } from './legacy.ts';\nimport type {\n GraphqlOptions,\n HttpMethod,\n HttpOptions,\n HttpResponse,\n} from './types.ts';\n\nconst githubBaseUrl = 'https://api.github.com/';\nlet baseUrl = githubBaseUrl;\nexport const setBaseUrl = (url: string): void => {\n baseUrl = url;\n};\n\nexport interface GithubBaseHttpOptions extends HttpOptions {\n repository?: string;\n}\n\nexport interface GithubHttpOptions extends GithubBaseHttpOptions {\n paginate?: boolean | string;\n paginationField?: string;\n pageLimit?: number;\n}\n\ninterface GithubGraphqlRepoData<T = unknown> {\n repository?: T;\n}\n\nexport type GithubGraphqlResponse<T = unknown> =\n | {\n data: T;\n errors?: never;\n }\n | {\n data?: never;\n errors: {\n type?: string;\n message: string;\n }[];\n };\n\nconst GithubError = z.object({\n field: z.string().optional(),\n code: z.string().optional(),\n message: z.string().optional(),\n});\n\n/**\n * GitHub usually returns `errors` as an array, but not always - normalize it\n * into an array of error objects, dropping anything that doesn't fit.\n */\nconst GithubErrors = z\n .union([LooseArray(GithubError), GithubError.transform((error) => [error])])\n .catch([]);\n\nfunction handleGotError(\n err: GotLegacyError,\n url: string | URL,\n opts: GithubBaseHttpOptions,\n): Error {\n const path = url.toString();\n let message = err.message || '';\n const body = err.response?.body;\n if (isPlainObject(body) && 'message' in body) {\n message = String(body.message);\n }\n if (\n err.code === 'ERR_HTTP2_STREAM_ERROR' ||\n err.code === 'ENOTFOUND' ||\n err.code === 'ETIMEDOUT' ||\n err.code === 'EAI_AGAIN' ||\n err.code === 'ECONNRESET'\n ) {\n logger.debug({ err }, 'GitHub failure: RequestError');\n return new ExternalHostError(err, 'github');\n }\n if (err.name === 'ParseError') {\n logger.debug({ err }, '');\n return new ExternalHostError(err, 'github');\n }\n if (err.statusCode && err.statusCode >= 500 && err.statusCode < 600) {\n logger.debug({ err }, 'GitHub failure: 5xx');\n return new ExternalHostError(err, 'github');\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('You have triggered an abuse detection mechanism')\n ) {\n logger.debug({ err }, 'GitHub failure: abuse detection');\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('You have exceeded a secondary rate limit')\n ) {\n logger.warn({ err }, 'GitHub failure: secondary rate limit');\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (err.statusCode === 403 && message.includes('Upgrade to GitHub Pro')) {\n logger.debug(`Endpoint: ${path}, needs paid GitHub plan`);\n return err;\n }\n if (err.statusCode === 403 && message.includes('rate limit exceeded')) {\n logger.debug({ err }, 'GitHub failure: rate limit');\n\n const parsed = parseUrl(baseUrl);\n\n const rule = hostRules.find({ url: baseUrl });\n if (rule.token || rule.password) {\n logger.once.warn(\n 'Rate limit exceeded for api.github.com, even though we are authenticated',\n );\n } else {\n if (parsed?.hostname === 'api.github.com') {\n logger.once.warn(\n {\n documentationUrl: `${GlobalConfig.get('productLinks').documentation}getting-started/running/#githubcom-token-for-changelogs-and-tools`,\n },\n 'Rate limit exceeded for api.github.com, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN',\n );\n } else {\n logger.once.warn(\n { host: parsed!.host },\n 'Rate limit exceeded, as no hostRules set for this host',\n );\n }\n }\n\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('Resource not accessible by integration')\n ) {\n logger.debug(\n { err },\n 'GitHub failure: Resource not accessible by integration',\n );\n return new Error(PLATFORM_INTEGRATION_UNAUTHORIZED);\n }\n if (err.statusCode === 401) {\n // Warn once for github.com token if unauthorized\n const hostname = parseUrl(url)?.hostname;\n // v8 ignore else -- TODO: add test #40625\n if (hostname === 'github.com' || hostname === 'api.github.com') {\n logger.once.warn('github.com token 401 unauthorized');\n }\n if (message.includes('Bad credentials')) {\n const rateLimit = err.headers?.['x-ratelimit-limit'] ?? -1;\n logger.debug(\n {\n token: maskToken(opts.token),\n err,\n },\n 'GitHub failure: Bad credentials',\n );\n if (rateLimit === '60') {\n return new ExternalHostError(err, 'github');\n }\n return new Error(PLATFORM_BAD_CREDENTIALS);\n }\n }\n if (err.statusCode === 422) {\n if (\n message.includes('Review cannot be requested from pull request author')\n ) {\n return err;\n }\n\n const errors = GithubErrors.parse(err.body?.errors);\n if (errors.some((e) => e.field === 'milestone')) {\n return err;\n }\n if (errors.some((e) => e.code === 'invalid')) {\n logger.debug({ err }, 'Received invalid response - aborting');\n return new Error(REPOSITORY_CHANGED);\n }\n if (\n errors.some((e) => e.message?.startsWith('A pull request already exists'))\n ) {\n return err;\n }\n logger.debug({ err }, '422 Error thrown from GitHub');\n return new ExternalHostError(err, 'github');\n }\n if (\n err.statusCode === 410 &&\n err.body?.message === 'Issues are disabled for this repo'\n ) {\n return err;\n }\n return err;\n}\n\ninterface GraphqlPaginatedContent<T = unknown> {\n nodes?: T[];\n edges?: T[];\n pageInfo: { hasNextPage: boolean; endCursor: string };\n}\n\nfunction constructAcceptString(input?: unknown): string {\n const defaultAccept = 'application/vnd.github.v3+json';\n const acceptStrings =\n typeof input === 'string' ? input.split(regEx(/\\s*,\\s*/)) : [];\n\n // TODO: regression of #6736\n // v8 ignore else -- TODO: add test #40625\n if (\n !acceptStrings.some((x) => x === defaultAccept) &&\n (!acceptStrings.some((x) => x.startsWith('application/vnd.github.')) ||\n acceptStrings.length < 2)\n ) {\n acceptStrings.push(defaultAccept);\n }\n return acceptStrings.join(', ');\n}\n\nconst MAX_GRAPHQL_PAGE_SIZE = 100;\n\ninterface GraphqlPageCacheItem {\n pageLastResizedAt: string;\n pageSize: number;\n}\n\nexport type GraphqlPageCache = Record<string, GraphqlPageCacheItem>;\n\nfunction getGraphqlPageSize(\n fieldName: string,\n defaultPageSize = MAX_GRAPHQL_PAGE_SIZE,\n): number {\n const cache = getCache();\n const graphqlPageCache = cache?.platform?.github\n ?.graphqlPageCache as GraphqlPageCache;\n const cachedRecord = graphqlPageCache?.[fieldName];\n\n if (graphqlPageCache && cachedRecord) {\n logger.debug(\n { fieldName, ...cachedRecord },\n 'GraphQL page size: found cached value',\n );\n\n const oldPageSize = cachedRecord.pageSize;\n\n const now = DateTime.local();\n const then = DateTime.fromISO(cachedRecord.pageLastResizedAt);\n const expiry = then.plus({ hours: 24 });\n if (now > expiry) {\n const newPageSize = Math.min(oldPageSize * 2, MAX_GRAPHQL_PAGE_SIZE);\n if (newPageSize < MAX_GRAPHQL_PAGE_SIZE) {\n const timestamp = now.toISO();\n\n logger.debug(\n { fieldName, oldPageSize, newPageSize, timestamp },\n 'GraphQL page size: expanding',\n );\n\n cachedRecord.pageLastResizedAt = timestamp;\n cachedRecord.pageSize = newPageSize;\n } else {\n logger.debug(\n { fieldName, oldPageSize, newPageSize },\n 'GraphQL page size: expanded to default page size',\n );\n\n delete graphqlPageCache[fieldName];\n }\n\n return newPageSize;\n }\n\n return oldPageSize;\n }\n\n return defaultPageSize;\n}\n\nfunction setGraphqlPageSize(fieldName: string, newPageSize: number): void {\n const oldPageSize = getGraphqlPageSize(fieldName);\n if (newPageSize !== oldPageSize) {\n const now = DateTime.local();\n const pageLastResizedAt = now.toISO();\n logger.debug(\n { fieldName, oldPageSize, newPageSize, timestamp: pageLastResizedAt },\n 'GraphQL page size: shrinking',\n );\n const cache = getCache();\n cache.platform ??= {};\n cache.platform.github ??= {};\n cache.platform.github.graphqlPageCache ??= {};\n const graphqlPageCache = cache.platform.github\n .graphqlPageCache as GraphqlPageCache;\n graphqlPageCache[fieldName] = {\n pageLastResizedAt,\n pageSize: newPageSize,\n };\n }\n}\n\nfunction replaceUrlBase(url: URL, baseUrl: string): URL {\n const relativeUrl = `${url.pathname}${url.search}`;\n return new URL(relativeUrl, baseUrl);\n}\n\nexport class GithubHttp extends HttpBase<GithubHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(hostType = 'github', options?: HttpOptions) {\n super(hostType, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat([\n 'pageLimit',\n 'paginate',\n 'paginationField',\n 'repository',\n ] as (keyof GithubHttpOptions)[]);\n }\n\n protected override processOptions(\n url: URL,\n opts: InternalHttpOptions & GithubBaseHttpOptions,\n ): void {\n if (!opts.token) {\n // create a mutable copy of `url`\n const authUrl = parseUrl(url.toString())!;\n\n if (opts.repository) {\n // set authUrl to https://api.github.com/repos/org/repo or https://gihub.domain.com/api/v3/repos/org/repo\n authUrl.hash = '';\n authUrl.search = '';\n authUrl.pathname = joinUrlParts(\n authUrl.pathname.startsWith('/api/v3') ? '/api/v3' : '',\n 'repos',\n `${opts.repository}`,\n );\n }\n\n let readOnly = opts.readOnly;\n const { method = 'get' } = opts;\n if (\n readOnly === undefined &&\n ['get', 'head'].includes(method.toLowerCase())\n ) {\n readOnly = true;\n }\n const { token } = findMatchingRule(authUrl.toString(), {\n hostType: this.hostType,\n readOnly,\n });\n opts.token = token;\n }\n\n const accept = constructAcceptString(opts.headers?.accept);\n\n opts.headers = {\n ...opts.headers,\n accept,\n };\n }\n\n protected override handleError(\n url: string | URL,\n opts: HttpOptions,\n err: GotLegacyError,\n ): never {\n throw handleGotError(err, url, opts);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GithubHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const httpOptions = options.httpOptions ?? {};\n const resolvedUrl = this.resolveUrl(options.url, httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n\n const result = await super.requestJsonUnsafe<T>(method, opts);\n if (httpOptions.paginate) {\n delete httpOptions.cacheProvider;\n httpOptions.memCache = false;\n // Check if result is paginated\n const pageLimit = httpOptions.pageLimit ?? 10;\n const linkHeader = parseLinkHeader(result?.headers?.link);\n const next = linkHeader?.next;\n const env = getEnv();\n if (next?.url && linkHeader?.last?.page) {\n let lastPage = parseInt(linkHeader.last.page, 10);\n // v8 ignore else -- TODO: add test #40625\n if (!env.RENOVATE_PAGINATE_ALL && httpOptions.paginate !== 'all') {\n lastPage = Math.min(pageLimit, lastPage);\n }\n const baseUrl = httpOptions.baseUrl ?? this.baseUrl;\n const parsedUrl = new URL(next.url, baseUrl);\n const rebasePagination =\n !!baseUrl &&\n !!env.RENOVATE_X_REBASE_PAGINATION_LINKS &&\n // Preserve github.com URLs for use cases like release notes\n parsedUrl.origin !== 'https://api.github.com';\n const firstPageUrl = rebasePagination\n ? replaceUrlBase(parsedUrl, baseUrl)\n : parsedUrl;\n const queue = [...range(2, lastPage)].map(\n (pageNumber) => (): Promise<HttpResponse<T>> => {\n // copy before modifying searchParams\n const nextUrl = parseUrl(firstPageUrl.toString())!;\n nextUrl.searchParams.set('page', String(pageNumber));\n return super.requestJsonUnsafe<T>(method, {\n ...opts,\n url: nextUrl,\n });\n },\n );\n const pages = await p.all(queue);\n // v8 ignore else -- TODO: add test #40625\n if (httpOptions.paginationField && isPlainObject(result.body)) {\n const paginatedResult = result.body[httpOptions.paginationField];\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(paginatedResult)) {\n for (const nextPage of pages) {\n // v8 ignore else -- TODO: add test #40625\n if (isPlainObject(nextPage.body)) {\n const nextPageResults =\n nextPage.body[httpOptions.paginationField];\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(nextPageResults)) {\n paginatedResult.push(...nextPageResults);\n }\n }\n }\n }\n } else if (isArray<T>(result.body)) {\n for (const nextPage of pages) {\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(nextPage.body)) {\n result.body.push(...nextPage.body);\n }\n }\n }\n }\n }\n return result;\n }\n\n public async requestGraphql<T = unknown>(\n query: string,\n options: GraphqlOptions = {},\n ): Promise<GithubGraphqlResponse<T> | null> {\n const path = 'graphql';\n\n const { paginate, count = MAX_GRAPHQL_PAGE_SIZE, cursor = null } = options;\n let { variables } = options;\n if (paginate) {\n variables = {\n ...variables,\n count,\n cursor,\n };\n }\n const body = variables ? { query, variables } : { query };\n\n const opts: GithubBaseHttpOptions = {\n baseUrl: baseUrl.replace('/v3/', '/'), // GHE uses unversioned graphql path\n body,\n headers: { accept: options?.acceptHeader },\n readOnly: options.readOnly,\n };\n if (options.token) {\n opts.token = options.token;\n }\n logger.trace(`Performing Github GraphQL request`);\n\n try {\n const res = await this.postJson<GithubGraphqlResponse<T>>(path, opts);\n return res?.body;\n } catch (err) {\n logger.debug({ err, query, options }, 'Unexpected GraphQL Error');\n if (err instanceof ExternalHostError && count && count > 10) {\n logger.info('Reducing pagination count to workaround graphql errors');\n return null;\n }\n throw handleGotError(err, path, opts);\n }\n }\n\n async queryRepoField<T = Record<string, unknown>>(\n query: string,\n fieldName: string,\n options: GraphqlOptions = {},\n ): Promise<T[]> {\n const result: T[] = [];\n\n const { paginate = true } = options;\n\n let optimalCount: null | number = null;\n let count = getGraphqlPageSize(\n fieldName,\n options.count ?? MAX_GRAPHQL_PAGE_SIZE,\n );\n let limit = options.limit ?? 1000;\n let cursor: string | null = null;\n\n let isIterating = true;\n while (isIterating) {\n const res = await this.requestGraphql<GithubGraphqlRepoData<T>>(query, {\n ...options,\n count: Math.min(count, limit),\n cursor,\n paginate,\n });\n const repositoryData = res?.data?.repository;\n if (\n isNonEmptyObject(repositoryData) &&\n !isNullOrUndefined(repositoryData[fieldName])\n ) {\n optimalCount = count;\n\n const {\n nodes = [],\n edges = [],\n pageInfo,\n } = repositoryData[fieldName] as GraphqlPaginatedContent<T>;\n result.push(...nodes);\n result.push(...edges);\n\n limit = Math.max(0, limit - nodes.length - edges.length);\n\n if (limit === 0) {\n isIterating = false;\n } else if (paginate && pageInfo) {\n const { hasNextPage, endCursor } = pageInfo;\n if (hasNextPage && endCursor) {\n cursor = endCursor;\n } else {\n isIterating = false;\n }\n }\n } else {\n count = Math.floor(count / 2);\n if (count === 0) {\n logger.warn({ query, options, res }, 'Error fetching GraphQL nodes');\n isIterating = false;\n }\n }\n\n if (!paginate) {\n isIterating = false;\n }\n }\n\n if (optimalCount && optimalCount < MAX_GRAPHQL_PAGE_SIZE) {\n setGraphqlPageSize(fieldName, optimalCount);\n }\n\n return result;\n }\n\n /**\n * Get the raw text file from a URL.\n * Only use this method to fetch text files.\n *\n * @param url Full API URL, contents path or path inside the repository to the file\n * @param options\n *\n * @example url = 'https://api.github.com/repos/renovatebot/renovate/contents/package.json'\n * @example url = 'renovatebot/renovate/contents/package.json'\n * @example url = 'package.json' & options.repository = 'renovatebot/renovate'\n */\n public async getRawTextFile(\n url: string,\n options: InternalHttpOptions & GithubBaseHttpOptions = {},\n ): Promise<HttpResponse> {\n const newOptions: InternalHttpOptions & GithubBaseHttpOptions = {\n ...options,\n headers: {\n accept: 'application/vnd.github.raw+json',\n },\n };\n\n let newURL = url;\n const httpRegex = regEx(/^https?:\\/\\//);\n if (options.repository && !httpRegex.test(options.repository)) {\n newURL = joinUrlParts(options.repository, 'contents', url);\n }\n\n return await this.getText(newURL, newOptions);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAyCA,IAAI,UAAU;AACd,MAAa,cAAc,QAAsB;CAC/C,UAAU;AACZ;AA6BA,MAAM,cAAc,EAAE,OAAO;CAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;AAC/B,CAAC;;;;;AAMD,MAAM,eAAe,EAClB,MAAM,CAAC,WAAW,WAAW,GAAG,YAAY,WAAW,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC3E,MAAM,CAAC,CAAC;AAEX,SAAS,eACP,KACA,KACA,MACO;CACP,MAAM,OAAO,IAAI,SAAS;CAC1B,IAAI,UAAU,IAAI,WAAW;CAC7B,MAAM,OAAO,IAAI,UAAU;CAC3B,IAAI,cAAc,IAAI,KAAK,aAAa,MACtC,UAAU,OAAO,KAAK,OAAO;CAE/B,IACE,IAAI,SAAS,4BACb,IAAI,SAAS,eACb,IAAI,SAAS,eACb,IAAI,SAAS,eACb,IAAI,SAAS,cACb;EACA,OAAO,MAAM,EAAE,IAAI,GAAG,8BAA8B;EACpD,OAAO,IAAI,kBAAkB,KAAK,QAAQ;CAC5C;CACA,IAAI,IAAI,SAAS,cAAc;EAC7B,OAAO,MAAM,EAAE,IAAI,GAAG,EAAE;EACxB,OAAO,IAAI,kBAAkB,KAAK,QAAQ;CAC5C;CACA,IAAI,IAAI,cAAc,IAAI,cAAc,OAAO,IAAI,aAAa,KAAK;EACnE,OAAO,MAAM,EAAE,IAAI,GAAG,qBAAqB;EAC3C,OAAO,IAAI,kBAAkB,KAAK,QAAQ;CAC5C;CACA,IACE,IAAI,eAAe,OACnB,QAAQ,WAAW,iDAAiD,GACpE;EACA,OAAO,MAAM,EAAE,IAAI,GAAG,iCAAiC;EACvD,OAAO,IAAI,MAAM,4BAA4B;CAC/C;CACA,IACE,IAAI,eAAe,OACnB,QAAQ,WAAW,0CAA0C,GAC7D;EACA,OAAO,KAAK,EAAE,IAAI,GAAG,sCAAsC;EAC3D,OAAO,IAAI,MAAM,4BAA4B;CAC/C;CACA,IAAI,IAAI,eAAe,OAAO,QAAQ,SAAS,uBAAuB,GAAG;EACvE,OAAO,MAAM,aAAa,KAAK,yBAAyB;EACxD,OAAO;CACT;CACA,IAAI,IAAI,eAAe,OAAO,QAAQ,SAAS,qBAAqB,GAAG;EACrE,OAAO,MAAM,EAAE,IAAI,GAAG,4BAA4B;EAElD,MAAM,SAAS,SAAS,OAAO;EAE/B,MAAM,OAAOA,KAAe,EAAE,KAAK,QAAQ,CAAC;EAC5C,IAAI,KAAK,SAAS,KAAK,UACrB,OAAO,KAAK,KACV,0EACF;OAEA,IAAI,QAAQ,aAAa,kBACvB,OAAO,KAAK,KACV,EACE,kBAAkB,GAAG,aAAa,IAAI,cAAc,CAAC,CAAC,cAAc,mEACtE,GACA,0GACF;OAEA,OAAO,KAAK,KACV,EAAE,MAAM,OAAQ,KAAK,GACrB,wDACF;EAIJ,OAAO,IAAI,MAAM,4BAA4B;CAC/C;CACA,IACE,IAAI,eAAe,OACnB,QAAQ,WAAW,wCAAwC,GAC3D;EACA,OAAO,MACL,EAAE,IAAI,GACN,wDACF;EACA,OAAO,IAAI,MAAM,iCAAiC;CACpD;CACA,IAAI,IAAI,eAAe,KAAK;EAE1B,MAAM,WAAW,SAAS,GAAG,CAAC,EAAE;;EAEhC,IAAI,aAAa,gBAAgB,aAAa,kBAC5C,OAAO,KAAK,KAAK,mCAAmC;EAEtD,IAAI,QAAQ,SAAS,iBAAiB,GAAG;GACvC,MAAM,YAAY,IAAI,UAAU,wBAAwB;GACxD,OAAO,MACL;IACE,OAAO,UAAU,KAAK,KAAK;IAC3B;GACF,GACA,iCACF;GACA,IAAI,cAAc,MAChB,OAAO,IAAI,kBAAkB,KAAK,QAAQ;GAE5C,OAAO,IAAI,MAAM,wBAAwB;EAC3C;CACF;CACA,IAAI,IAAI,eAAe,KAAK;EAC1B,IACE,QAAQ,SAAS,qDAAqD,GAEtE,OAAO;EAGT,MAAM,SAAS,aAAa,MAAM,IAAI,MAAM,MAAM;EAClD,IAAI,OAAO,MAAM,MAAM,EAAE,UAAU,WAAW,GAC5C,OAAO;EAET,IAAI,OAAO,MAAM,MAAM,EAAE,SAAS,SAAS,GAAG;GAC5C,OAAO,MAAM,EAAE,IAAI,GAAG,sCAAsC;GAC5D,OAAO,IAAI,MAAM,kBAAkB;EACrC;EACA,IACE,OAAO,MAAM,MAAM,EAAE,SAAS,WAAW,+BAA+B,CAAC,GAEzE,OAAO;EAET,OAAO,MAAM,EAAE,IAAI,GAAG,8BAA8B;EACpD,OAAO,IAAI,kBAAkB,KAAK,QAAQ;CAC5C;CACA,IACE,IAAI,eAAe,OACnB,IAAI,MAAM,YAAY,qCAEtB,OAAO;CAET,OAAO;AACT;AAQA,SAAS,sBAAsB,OAAyB;CACtD,MAAM,gBAAgB;CACtB,MAAM,gBACJ,OAAO,UAAU,WAAW,MAAM,MAAM,MAAM,SAAS,CAAC,IAAI,CAAC;;CAI/D,IACE,CAAC,cAAc,MAAM,MAAM,MAAM,aAAa,MAC7C,CAAC,cAAc,MAAM,MAAM,EAAE,WAAW,yBAAyB,CAAC,KACjE,cAAc,SAAS,IAEzB,cAAc,KAAK,aAAa;CAElC,OAAO,cAAc,KAAK,IAAI;AAChC;AAEA,MAAM,wBAAwB;AAS9B,SAAS,mBACP,WACA,kBAAkB,uBACV;CAER,MAAM,mBADQ,SACe,CAAC,EAAE,UAAU,QACtC;CACJ,MAAM,eAAe,mBAAmB;CAExC,IAAI,oBAAoB,cAAc;EACpC,OAAO,MACL;GAAE;GAAW,GAAG;EAAa,GAC7B,uCACF;EAEA,MAAM,cAAc,aAAa;EAEjC,MAAM,MAAM,SAAS,MAAM;EAG3B,IAAI,MAFS,SAAS,QAAQ,aAAa,iBACzB,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,CACtB,GAAG;GAChB,MAAM,cAAc,KAAK,IAAI,cAAc,GAAG,qBAAqB;GACnE,IAAI,cAAc,uBAAuB;IACvC,MAAM,YAAY,IAAI,MAAM;IAE5B,OAAO,MACL;KAAE;KAAW;KAAa;KAAa;IAAU,GACjD,8BACF;IAEA,aAAa,oBAAoB;IACjC,aAAa,WAAW;GAC1B,OAAO;IACL,OAAO,MACL;KAAE;KAAW;KAAa;IAAY,GACtC,kDACF;IAEA,OAAO,iBAAiB;GAC1B;GAEA,OAAO;EACT;EAEA,OAAO;CACT;CAEA,OAAO;AACT;AAEA,SAAS,mBAAmB,WAAmB,aAA2B;CACxE,MAAM,cAAc,mBAAmB,SAAS;CAChD,IAAI,gBAAgB,aAAa;EAE/B,MAAM,oBADM,SAAS,MACO,CAAC,CAAC,MAAM;EACpC,OAAO,MACL;GAAE;GAAW;GAAa;GAAa,WAAW;EAAkB,GACpE,8BACF;EACA,MAAM,QAAQ,SAAS;EACvB,MAAM,aAAa,CAAC;EACpB,MAAM,SAAS,WAAW,CAAC;EAC3B,MAAM,SAAS,OAAO,qBAAqB,CAAC;EAC5C,MAAM,mBAAmB,MAAM,SAAS,OACrC;EACH,iBAAiB,aAAa;GAC5B;GACA,UAAU;EACZ;CACF;AACF;AAEA,SAAS,eAAe,KAAU,SAAsB;CACtD,MAAM,cAAc,GAAG,IAAI,WAAW,IAAI;CAC1C,OAAO,IAAI,IAAI,aAAa,OAAO;AACrC;AAEA,IAAa,aAAb,cAAgC,SAA4B;CAC1D,IAAuB,UAA8B;EACnD,OAAO;CACT;CAEA,YAAY,WAAW,UAAU,SAAuB;EACtD,MAAM,UAAU,OAAO;CACzB;CAEA,eAAqD;EACnD,OAAO,MACJ,aAAa,CAAC,CACd,OAAO;GACN;GACA;GACA;GACA;EACF,CAAgC;CACpC;CAEA,eACE,KACA,MACM;EACN,IAAI,CAAC,KAAK,OAAO;GAEf,MAAM,UAAU,SAAS,IAAI,SAAS,CAAC;GAEvC,IAAI,KAAK,YAAY;IAEnB,QAAQ,OAAO;IACf,QAAQ,SAAS;IACjB,QAAQ,WAAW,aACjB,QAAQ,SAAS,WAAW,SAAS,IAAI,YAAY,IACrD,SACA,GAAG,KAAK,YACV;GACF;GAEA,IAAI,WAAW,KAAK;GACpB,MAAM,EAAE,SAAS,UAAU;GAC3B,IACE,aAAa,KAAA,KACb,CAAC,OAAO,MAAM,CAAC,CAAC,SAAS,OAAO,YAAY,CAAC,GAE7C,WAAW;GAEb,MAAM,EAAE,UAAU,iBAAiB,QAAQ,SAAS,GAAG;IACrD,UAAU,KAAK;IACf;GACF,CAAC;GACD,KAAK,QAAQ;EACf;EAEA,MAAM,SAAS,sBAAsB,KAAK,SAAS,MAAM;EAEzD,KAAK,UAAU;GACb,GAAG,KAAK;GACR;EACF;CACF;CAEA,YACE,KACA,MACA,KACO;EACP,MAAM,eAAe,KAAK,KAAK,IAAI;CACrC;CAEA,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,QAAQ,eAAe,CAAC;EAC5C,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,WAAW;EAC5D,MAAM,OAAO;GACX,GAAG;GACH,KAAK;EACP;EAEA,MAAM,SAAS,MAAM,MAAM,kBAAqB,QAAQ,IAAI;EAC5D,IAAI,YAAY,UAAU;GACxB,OAAO,YAAY;GACnB,YAAY,WAAW;GAEvB,MAAM,YAAY,YAAY,aAAa;GAC3C,MAAM,aAAa,gBAAgB,QAAQ,SAAS,IAAI;GACxD,MAAM,OAAO,YAAY;GACzB,MAAM,MAAM,OAAO;GACnB,IAAI,MAAM,OAAO,YAAY,MAAM,MAAM;IACvC,IAAI,WAAW,SAAS,WAAW,KAAK,MAAM,EAAE;;IAEhD,IAAI,CAAC,IAAI,yBAAyB,YAAY,aAAa,OACzD,WAAW,KAAK,IAAI,WAAW,QAAQ;IAEzC,MAAM,UAAU,YAAY,WAAW,KAAK;IAC5C,MAAM,YAAY,IAAI,IAAI,KAAK,KAAK,OAAO;IAM3C,MAAM,eAJJ,CAAC,CAAC,WACF,CAAC,CAAC,IAAI,sCAEN,UAAU,WAAW,2BAEnB,eAAe,WAAW,OAAO,IACjC;IAYJ,MAAM,QAAQ,MAAMC,IAXN,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,KACnC,qBAA+C;KAE9C,MAAM,UAAU,SAAS,aAAa,SAAS,CAAC;KAChD,QAAQ,aAAa,IAAI,QAAQ,OAAO,UAAU,CAAC;KACnD,OAAO,MAAM,kBAAqB,QAAQ;MACxC,GAAG;MACH,KAAK;KACP,CAAC;IACH,CAEwB,CAAK;;IAE/B,IAAI,YAAY,mBAAmB,cAAc,OAAO,IAAI,GAAG;KAC7D,MAAM,kBAAkB,OAAO,KAAK,YAAY;;KAEhD,IAAI,QAAW,eAAe;WACvB,MAAM,YAAY;;MAErB,IAAI,cAAc,SAAS,IAAI,GAAG;OAChC,MAAM,kBACJ,SAAS,KAAK,YAAY;;OAE5B,IAAI,QAAW,eAAe,GAC5B,gBAAgB,KAAK,GAAG,eAAe;MAE3C;;IAGN,OAAO,IAAI,QAAW,OAAO,IAAI;UAC1B,MAAM,YAAY;;KAErB,IAAI,QAAW,SAAS,IAAI,GAC1B,OAAO,KAAK,KAAK,GAAG,SAAS,IAAI;IAAA;GAIzC;EACF;EACA,OAAO;CACT;CAEA,MAAa,eACX,OACA,UAA0B,CAAC,GACe;EAC1C,MAAM,OAAO;EAEb,MAAM,EAAE,UAAU,QAAQ,uBAAuB,SAAS,SAAS;EACnE,IAAI,EAAE,cAAc;EACpB,IAAI,UACF,YAAY;GACV,GAAG;GACH;GACA;EACF;EAEF,MAAM,OAAO,YAAY;GAAE;GAAO;EAAU,IAAI,EAAE,MAAM;EAExD,MAAM,OAA8B;GAClC,SAAS,QAAQ,QAAQ,QAAQ,GAAG;GACpC;GACA,SAAS,EAAE,QAAQ,SAAS,aAAa;GACzC,UAAU,QAAQ;EACpB;EACA,IAAI,QAAQ,OACV,KAAK,QAAQ,QAAQ;EAEvB,OAAO,MAAM,mCAAmC;EAEhD,IAAI;GAEF,QAAO,MADW,KAAK,SAAmC,MAAM,IAAI,EAAA,EACxD;EACd,SAAS,KAAK;GACZ,OAAO,MAAM;IAAE;IAAK;IAAO;GAAQ,GAAG,0BAA0B;GAChE,IAAI,eAAe,qBAAqB,SAAS,QAAQ,IAAI;IAC3D,OAAO,KAAK,wDAAwD;IACpE,OAAO;GACT;GACA,MAAM,eAAe,KAAK,MAAM,IAAI;EACtC;CACF;CAEA,MAAM,eACJ,OACA,WACA,UAA0B,CAAC,GACb;EACd,MAAM,SAAc,CAAC;EAErB,MAAM,EAAE,WAAW,SAAS;EAE5B,IAAI,eAA8B;EAClC,IAAI,QAAQ,mBACV,WACA,QAAQ,SAAS,qBACnB;EACA,IAAI,QAAQ,QAAQ,SAAS;EAC7B,IAAI,SAAwB;EAE5B,IAAI,cAAc;EAClB,OAAO,aAAa;GAClB,MAAM,MAAM,MAAM,KAAK,eAAyC,OAAO;IACrE,GAAG;IACH,OAAO,KAAK,IAAI,OAAO,KAAK;IAC5B;IACA;GACF,CAAC;GACD,MAAM,iBAAiB,KAAK,MAAM;GAClC,IACE,iBAAiB,cAAc,KAC/B,CAAC,kBAAkB,eAAe,UAAU,GAC5C;IACA,eAAe;IAEf,MAAM,EACJ,QAAQ,CAAC,GACT,QAAQ,CAAC,GACT,aACE,eAAe;IACnB,OAAO,KAAK,GAAG,KAAK;IACpB,OAAO,KAAK,GAAG,KAAK;IAEpB,QAAQ,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,MAAM,MAAM;IAEvD,IAAI,UAAU,GACZ,cAAc;SACT,IAAI,YAAY,UAAU;KAC/B,MAAM,EAAE,aAAa,cAAc;KACnC,IAAI,eAAe,WACjB,SAAS;UAET,cAAc;IAElB;GACF,OAAO;IACL,QAAQ,KAAK,MAAM,QAAQ,CAAC;IAC5B,IAAI,UAAU,GAAG;KACf,OAAO,KAAK;MAAE;MAAO;MAAS;KAAI,GAAG,8BAA8B;KACnE,cAAc;IAChB;GACF;GAEA,IAAI,CAAC,UACH,cAAc;EAElB;EAEA,IAAI,gBAAgB,eAAe,uBACjC,mBAAmB,WAAW,YAAY;EAG5C,OAAO;CACT;;;;;;;;;;;;CAaA,MAAa,eACX,KACA,UAAuD,CAAC,GACjC;EACvB,MAAM,aAA0D;GAC9D,GAAG;GACH,SAAS,EACP,QAAQ,kCACV;EACF;EAEA,IAAI,SAAS;EACb,MAAM,YAAY,MAAM,cAAc;EACtC,IAAI,QAAQ,cAAc,CAAC,UAAU,KAAK,QAAQ,UAAU,GAC1D,SAAS,aAAa,QAAQ,YAAY,YAAY,GAAG;EAG3D,OAAO,MAAM,KAAK,QAAQ,QAAQ,UAAU;CAC9C;AACF"}
1
+ {"version":3,"file":"github.js","names":["hostRules.find","p.all"],"sources":["../../../lib/util/http/github.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyObject,\n isNullOrUndefined,\n isPlainObject,\n} from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { z } from 'zod/v4';\nimport { GlobalConfig } from '../../config/global.ts';\nimport {\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { getCache } from '../cache/repository/index.ts';\nimport { getEnv } from '../env.ts';\nimport * as hostRules from '../host-rules.ts';\nimport { maskToken } from '../mask.ts';\nimport * as p from '../promises.ts';\nimport { range } from '../range.ts';\nimport { regEx } from '../regex.ts';\nimport { LooseArray } from '../schema-utils/index.ts';\nimport { joinUrlParts, parseLinkHeader, parseUrl } from '../url.ts';\nimport { findMatchingRule } from './host-rules.ts';\nimport {\n HttpBase,\n type InternalHttpOptions,\n type InternalJsonUnsafeOptions,\n} from './http.ts';\nimport type { GotLegacyError } from './legacy.ts';\nimport type {\n GraphqlOptions,\n HttpMethod,\n HttpOptions,\n HttpResponse,\n} from './types.ts';\n\nconst githubBaseUrl = 'https://api.github.com/';\nlet baseUrl = githubBaseUrl;\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport interface GithubBaseHttpOptions extends HttpOptions {\n repository?: string;\n}\n\nexport interface GithubHttpOptions extends GithubBaseHttpOptions {\n paginate?: boolean | string;\n paginationField?: string;\n pageLimit?: number;\n}\n\ninterface GithubGraphqlRepoData<T = unknown> {\n repository?: T;\n}\n\nexport type GithubGraphqlResponse<T = unknown> =\n | {\n data: T;\n errors?: never;\n }\n | {\n data?: never;\n errors: {\n type?: string;\n message: string;\n }[];\n };\n\nconst GithubError = z.object({\n field: z.string().optional(),\n code: z.string().optional(),\n message: z.string().optional(),\n});\n\n/**\n * GitHub usually returns `errors` as an array, but not always - normalize it\n * into an array of error objects, dropping anything that doesn't fit.\n */\nconst GithubErrors = z\n .union([LooseArray(GithubError), GithubError.transform((error) => [error])])\n .catch([]);\n\nfunction handleGotError(\n err: GotLegacyError,\n url: string | URL,\n opts: GithubBaseHttpOptions,\n): Error {\n const path = url.toString();\n let message = err.message || '';\n const body = err.response?.body;\n if (isPlainObject(body) && 'message' in body) {\n message = String(body.message);\n }\n if (\n err.code === 'ERR_HTTP2_STREAM_ERROR' ||\n err.code === 'ENOTFOUND' ||\n err.code === 'ETIMEDOUT' ||\n err.code === 'EAI_AGAIN' ||\n err.code === 'ECONNRESET'\n ) {\n logger.debug({ err }, 'GitHub failure: RequestError');\n return new ExternalHostError(err, 'github');\n }\n if (err.name === 'ParseError') {\n logger.debug({ err }, '');\n return new ExternalHostError(err, 'github');\n }\n if (err.statusCode && err.statusCode >= 500 && err.statusCode < 600) {\n logger.debug({ err }, 'GitHub failure: 5xx');\n return new ExternalHostError(err, 'github');\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('You have triggered an abuse detection mechanism')\n ) {\n logger.debug({ err }, 'GitHub failure: abuse detection');\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('You have exceeded a secondary rate limit')\n ) {\n logger.warn({ err }, 'GitHub failure: secondary rate limit');\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (err.statusCode === 403 && message.includes('Upgrade to GitHub Pro')) {\n logger.debug(`Endpoint: ${path}, needs paid GitHub plan`);\n return err;\n }\n if (err.statusCode === 403 && message.includes('rate limit exceeded')) {\n logger.debug({ err }, 'GitHub failure: rate limit');\n\n const parsed = parseUrl(baseUrl);\n\n const rule = hostRules.find({ url: baseUrl });\n if (rule.token || rule.password) {\n logger.once.warn(\n 'Rate limit exceeded for api.github.com, even though we are authenticated',\n );\n } else {\n if (parsed?.hostname === 'api.github.com') {\n logger.once.warn(\n {\n documentationUrl: `${GlobalConfig.get('productLinks').documentation}getting-started/running/#githubcom-token-for-changelogs-and-tools`,\n },\n 'Rate limit exceeded for api.github.com, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN',\n );\n } else {\n logger.once.warn(\n { host: parsed!.host },\n 'Rate limit exceeded, as no hostRules set for this host',\n );\n }\n }\n\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('Resource not accessible by integration')\n ) {\n logger.debug(\n { err },\n 'GitHub failure: Resource not accessible by integration',\n );\n return new Error(PLATFORM_INTEGRATION_UNAUTHORIZED);\n }\n if (err.statusCode === 401) {\n // Warn once for github.com token if unauthorized\n const hostname = parseUrl(url)?.hostname;\n // v8 ignore else -- TODO: add test #40625\n if (hostname === 'github.com' || hostname === 'api.github.com') {\n logger.once.warn('github.com token 401 unauthorized');\n }\n if (message.includes('Bad credentials')) {\n const rateLimit = err.headers?.['x-ratelimit-limit'] ?? -1;\n logger.debug(\n {\n token: maskToken(opts.token),\n err,\n },\n 'GitHub failure: Bad credentials',\n );\n if (rateLimit === '60') {\n return new ExternalHostError(err, 'github');\n }\n return new Error(PLATFORM_BAD_CREDENTIALS);\n }\n }\n if (err.statusCode === 422) {\n if (\n message.includes('Review cannot be requested from pull request author')\n ) {\n return err;\n }\n\n const errors = GithubErrors.parse(err.body?.errors);\n if (errors.some((e) => e.field === 'milestone')) {\n return err;\n }\n if (errors.some((e) => e.code === 'invalid')) {\n logger.debug({ err }, 'Received invalid response - aborting');\n return new Error(REPOSITORY_CHANGED);\n }\n if (\n errors.some((e) => e.message?.startsWith('A pull request already exists'))\n ) {\n return err;\n }\n logger.debug({ err }, '422 Error thrown from GitHub');\n return new ExternalHostError(err, 'github');\n }\n if (\n err.statusCode === 410 &&\n err.body?.message === 'Issues are disabled for this repo'\n ) {\n return err;\n }\n return err;\n}\n\ninterface GraphqlPaginatedContent<T = unknown> {\n nodes?: T[];\n edges?: T[];\n pageInfo: { hasNextPage: boolean; endCursor: string };\n}\n\nfunction constructAcceptString(input?: unknown): string {\n const defaultAccept = 'application/vnd.github.v3+json';\n const acceptStrings =\n typeof input === 'string' ? input.split(regEx(/\\s*,\\s*/)) : [];\n\n // TODO: regression of #6736\n // v8 ignore else -- TODO: add test #40625\n if (\n !acceptStrings.some((x) => x === defaultAccept) &&\n (!acceptStrings.some((x) => x.startsWith('application/vnd.github.')) ||\n acceptStrings.length < 2)\n ) {\n acceptStrings.push(defaultAccept);\n }\n return acceptStrings.join(', ');\n}\n\nconst MAX_GRAPHQL_PAGE_SIZE = 100;\n\ninterface GraphqlPageCacheItem {\n pageLastResizedAt: string;\n pageSize: number;\n}\n\nexport type GraphqlPageCache = Record<string, GraphqlPageCacheItem>;\n\nfunction getGraphqlPageSize(\n fieldName: string,\n defaultPageSize = MAX_GRAPHQL_PAGE_SIZE,\n): number {\n const cache = getCache();\n const graphqlPageCache = cache?.platform?.github\n ?.graphqlPageCache as GraphqlPageCache;\n const cachedRecord = graphqlPageCache?.[fieldName];\n\n if (graphqlPageCache && cachedRecord) {\n logger.debug(\n { fieldName, ...cachedRecord },\n 'GraphQL page size: found cached value',\n );\n\n const oldPageSize = cachedRecord.pageSize;\n\n const now = DateTime.local();\n const then = DateTime.fromISO(cachedRecord.pageLastResizedAt);\n const expiry = then.plus({ hours: 24 });\n if (now > expiry) {\n const newPageSize = Math.min(oldPageSize * 2, MAX_GRAPHQL_PAGE_SIZE);\n if (newPageSize < MAX_GRAPHQL_PAGE_SIZE) {\n const timestamp = now.toISO();\n\n logger.debug(\n { fieldName, oldPageSize, newPageSize, timestamp },\n 'GraphQL page size: expanding',\n );\n\n cachedRecord.pageLastResizedAt = timestamp;\n cachedRecord.pageSize = newPageSize;\n } else {\n logger.debug(\n { fieldName, oldPageSize, newPageSize },\n 'GraphQL page size: expanded to default page size',\n );\n\n delete graphqlPageCache[fieldName];\n }\n\n return newPageSize;\n }\n\n return oldPageSize;\n }\n\n return defaultPageSize;\n}\n\nfunction setGraphqlPageSize(fieldName: string, newPageSize: number): void {\n const oldPageSize = getGraphqlPageSize(fieldName);\n if (newPageSize !== oldPageSize) {\n const now = DateTime.local();\n const pageLastResizedAt = now.toISO();\n logger.debug(\n { fieldName, oldPageSize, newPageSize, timestamp: pageLastResizedAt },\n 'GraphQL page size: shrinking',\n );\n const cache = getCache();\n cache.platform ??= {};\n cache.platform.github ??= {};\n cache.platform.github.graphqlPageCache ??= {};\n const graphqlPageCache = cache.platform.github\n .graphqlPageCache as GraphqlPageCache;\n graphqlPageCache[fieldName] = {\n pageLastResizedAt,\n pageSize: newPageSize,\n };\n }\n}\n\nfunction replaceUrlBase(url: URL, baseUrl: string): URL {\n const relativeUrl = `${url.pathname}${url.search}`;\n return new URL(relativeUrl, baseUrl);\n}\n\nexport class GithubHttp extends HttpBase<GithubHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(hostType = 'github', options?: HttpOptions) {\n super(hostType, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat([\n 'pageLimit',\n 'paginate',\n 'paginationField',\n 'repository',\n ] as (keyof GithubHttpOptions)[]);\n }\n\n protected override processOptions(\n url: URL,\n opts: InternalHttpOptions & GithubBaseHttpOptions,\n ): void {\n if (!opts.token) {\n // create a mutable copy of `url`\n const authUrl = parseUrl(url.toString())!;\n\n if (opts.repository) {\n // set authUrl to https://api.github.com/repos/org/repo or https://gihub.domain.com/api/v3/repos/org/repo\n authUrl.hash = '';\n authUrl.search = '';\n authUrl.pathname = joinUrlParts(\n authUrl.pathname.startsWith('/api/v3') ? '/api/v3' : '',\n 'repos',\n `${opts.repository}`,\n );\n }\n\n let readOnly = opts.readOnly;\n const { method = 'get' } = opts;\n if (\n readOnly === undefined &&\n ['get', 'head'].includes(method.toLowerCase())\n ) {\n readOnly = true;\n }\n const { token } = findMatchingRule(authUrl.toString(), {\n hostType: this.hostType,\n readOnly,\n });\n opts.token = token;\n }\n\n const accept = constructAcceptString(opts.headers?.accept);\n\n opts.headers = {\n ...opts.headers,\n accept,\n };\n }\n\n protected override handleError(\n url: string | URL,\n opts: HttpOptions,\n err: GotLegacyError,\n ): never {\n throw handleGotError(err, url, opts);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GithubHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const httpOptions = options.httpOptions ?? {};\n const resolvedUrl = this.resolveUrl(options.url, httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n\n const result = await super.requestJsonUnsafe<T>(method, opts);\n if (httpOptions.paginate) {\n delete httpOptions.cacheProvider;\n httpOptions.memCache = false;\n // Check if result is paginated\n const pageLimit = httpOptions.pageLimit ?? 10;\n const linkHeader = parseLinkHeader(result?.headers?.link);\n const next = linkHeader?.next;\n const env = getEnv();\n if (next?.url && linkHeader?.last?.page) {\n let lastPage = parseInt(linkHeader.last.page, 10);\n // v8 ignore else -- TODO: add test #40625\n if (!env.RENOVATE_PAGINATE_ALL && httpOptions.paginate !== 'all') {\n lastPage = Math.min(pageLimit, lastPage);\n }\n const baseUrl = httpOptions.baseUrl ?? this.baseUrl;\n const parsedUrl = new URL(next.url, baseUrl);\n const rebasePagination =\n !!baseUrl &&\n !!env.RENOVATE_X_REBASE_PAGINATION_LINKS &&\n // Preserve github.com URLs for use cases like release notes\n parsedUrl.origin !== 'https://api.github.com';\n const firstPageUrl = rebasePagination\n ? replaceUrlBase(parsedUrl, baseUrl)\n : parsedUrl;\n const queue = [...range(2, lastPage)].map(\n (pageNumber) => (): Promise<HttpResponse<T>> => {\n // copy before modifying searchParams\n const nextUrl = parseUrl(firstPageUrl.toString())!;\n nextUrl.searchParams.set('page', String(pageNumber));\n return super.requestJsonUnsafe<T>(method, {\n ...opts,\n url: nextUrl,\n });\n },\n );\n const pages = await p.all(queue);\n // v8 ignore else -- TODO: add test #40625\n if (httpOptions.paginationField && isPlainObject(result.body)) {\n const paginatedResult = result.body[httpOptions.paginationField];\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(paginatedResult)) {\n for (const nextPage of pages) {\n // v8 ignore else -- TODO: add test #40625\n if (isPlainObject(nextPage.body)) {\n const nextPageResults =\n nextPage.body[httpOptions.paginationField];\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(nextPageResults)) {\n paginatedResult.push(...nextPageResults);\n }\n }\n }\n }\n } else if (isArray<T>(result.body)) {\n for (const nextPage of pages) {\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(nextPage.body)) {\n result.body.push(...nextPage.body);\n }\n }\n }\n }\n }\n return result;\n }\n\n public async requestGraphql<T = unknown>(\n query: string,\n options: GraphqlOptions = {},\n ): Promise<GithubGraphqlResponse<T> | null> {\n const path = 'graphql';\n\n const { paginate, count = MAX_GRAPHQL_PAGE_SIZE, cursor = null } = options;\n let { variables } = options;\n if (paginate) {\n variables = {\n ...variables,\n count,\n cursor,\n };\n }\n const body = variables ? { query, variables } : { query };\n\n const opts: GithubBaseHttpOptions = {\n baseUrl: baseUrl.replace('/v3/', '/'), // GHE uses unversioned graphql path\n body,\n headers: { accept: options?.acceptHeader },\n readOnly: options.readOnly,\n };\n if (options.token) {\n opts.token = options.token;\n }\n logger.trace(`Performing Github GraphQL request`);\n\n try {\n const res = await this.postJson<GithubGraphqlResponse<T>>(path, opts);\n return res?.body;\n } catch (err) {\n logger.debug({ err, query, options }, 'Unexpected GraphQL Error');\n if (err instanceof ExternalHostError && count && count > 10) {\n logger.info('Reducing pagination count to workaround graphql errors');\n return null;\n }\n throw handleGotError(err, path, opts);\n }\n }\n\n async queryRepoField<T = Record<string, unknown>>(\n query: string,\n fieldName: string,\n options: GraphqlOptions = {},\n ): Promise<T[]> {\n const result: T[] = [];\n\n const { paginate = true } = options;\n\n let optimalCount: null | number = null;\n let count = getGraphqlPageSize(\n fieldName,\n options.count ?? MAX_GRAPHQL_PAGE_SIZE,\n );\n let limit = options.limit ?? 1000;\n let cursor: string | null = null;\n\n let isIterating = true;\n while (isIterating) {\n const res = await this.requestGraphql<GithubGraphqlRepoData<T>>(query, {\n ...options,\n count: Math.min(count, limit),\n cursor,\n paginate,\n });\n const repositoryData = res?.data?.repository;\n if (\n isNonEmptyObject(repositoryData) &&\n !isNullOrUndefined(repositoryData[fieldName])\n ) {\n optimalCount = count;\n\n const {\n nodes = [],\n edges = [],\n pageInfo,\n } = repositoryData[fieldName] as GraphqlPaginatedContent<T>;\n result.push(...nodes);\n result.push(...edges);\n\n limit = Math.max(0, limit - nodes.length - edges.length);\n\n if (limit === 0) {\n isIterating = false;\n } else if (paginate && pageInfo) {\n const { hasNextPage, endCursor } = pageInfo;\n if (hasNextPage && endCursor) {\n cursor = endCursor;\n } else {\n isIterating = false;\n }\n }\n } else {\n count = Math.floor(count / 2);\n if (count === 0) {\n logger.warn({ query, options, res }, 'Error fetching GraphQL nodes');\n isIterating = false;\n }\n }\n\n if (!paginate) {\n isIterating = false;\n }\n }\n\n if (optimalCount && optimalCount < MAX_GRAPHQL_PAGE_SIZE) {\n setGraphqlPageSize(fieldName, optimalCount);\n }\n\n return result;\n }\n\n /**\n * Get the raw text file from a URL.\n * Only use this method to fetch text files.\n *\n * @param url Full API URL, contents path or path inside the repository to the file\n * @param options\n *\n * @example url = 'https://api.github.com/repos/renovatebot/renovate/contents/package.json'\n * @example url = 'renovatebot/renovate/contents/package.json'\n * @example url = 'package.json' & options.repository = 'renovatebot/renovate'\n */\n public async getRawTextFile(\n url: string,\n options: InternalHttpOptions & GithubBaseHttpOptions = {},\n ): Promise<HttpResponse> {\n const newOptions: InternalHttpOptions & GithubBaseHttpOptions = {\n ...options,\n headers: {\n accept: 'application/vnd.github.raw+json',\n },\n };\n\n let newURL = url;\n const httpRegex = regEx(/^https?:\\/\\//);\n if (options.repository && !httpRegex.test(options.repository)) {\n newURL = joinUrlParts(options.repository, 'contents', url);\n }\n\n return await this.getText(newURL, newOptions);\n }\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { HttpMethod, HttpOptions, HttpResponse } from "./types.js";
2
2
  import { HttpBase, InternalJsonUnsafeOptions } from "./http.js";
3
3
  import { RetryObject } from "got";
4
4
  //#region lib/util/http/gitlab.d.ts
5
- declare const setBaseUrl: (url: string) => void;
5
+ declare function setBaseUrl(url: string): void;
6
6
  interface GitlabHttpOptions extends HttpOptions {
7
7
  paginate?: boolean;
8
8
  }
@@ -7,9 +7,9 @@ import { isArray, isString } from "@sindresorhus/is";
7
7
  import { RequestError } from "got";
8
8
  //#region lib/util/http/gitlab.ts
9
9
  let baseUrl = "https://gitlab.com/api/v4/";
10
- const setBaseUrl = (url) => {
10
+ function setBaseUrl(url) {
11
11
  baseUrl = url;
12
- };
12
+ }
13
13
  var GitlabHttp = class extends HttpBase {
14
14
  get baseUrl() {
15
15
  return baseUrl;
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab.js","names":[],"sources":["../../../lib/util/http/gitlab.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { RequestError, type RetryObject } from 'got';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { getEnv } from '../env.ts';\nimport { parseLinkHeader, parseUrl } from '../url.ts';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nlet baseUrl = 'https://gitlab.com/api/v4/';\nexport const setBaseUrl = (url: string): void => {\n baseUrl = url;\n};\n\nexport interface GitlabHttpOptions extends HttpOptions {\n paginate?: boolean;\n}\n\nexport class GitlabHttp extends HttpBase<GitlabHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'gitlab', options?: GitlabHttpOptions) {\n super(type, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat(['paginate'] as (keyof GitlabHttpOptions)[]);\n }\n\n protected override async requestJsonUnsafe<T = unknown>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GitlabHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n opts.httpOptions ??= {};\n opts.httpOptions.throwHttpErrors = true;\n\n const result = await super.requestJsonUnsafe<T>(method, opts);\n if (opts.httpOptions.paginate && isArray(result.body)) {\n opts.httpOptions.memCache = false;\n\n // Check if result is paginated\n try {\n const linkHeader = parseLinkHeader(result.headers.link);\n const nextUrl = linkHeader?.next?.url\n ? parseUrl(linkHeader.next.url)\n : null;\n if (nextUrl) {\n if (getEnv().GITLAB_IGNORE_REPO_URL) {\n const defaultEndpoint = parseUrl(baseUrl)!;\n nextUrl.protocol = defaultEndpoint.protocol;\n nextUrl.host = defaultEndpoint.host;\n }\n\n opts.url = nextUrl;\n\n const nextResult = await this.requestJsonUnsafe<T>(method, opts);\n // v8 ignore else -- TODO: add test #40625\n if (isArray(nextResult.body)) {\n result.body.push(...nextResult.body);\n }\n }\n } catch (err) {\n logger.warn({ err }, 'Pagination error');\n }\n }\n return result;\n }\n\n protected override handleError(\n url: string | URL,\n _httpOptions: HttpOptions,\n err: Error,\n ): never {\n if (err instanceof RequestError && err.response?.statusCode) {\n if (err.response.statusCode === 404) {\n logger.trace({ err }, 'GitLab 404');\n logger.debug({ url }, 'GitLab API 404');\n throw err;\n }\n logger.debug({ err }, 'Gitlab API error');\n if (\n err.response.statusCode === 429 ||\n (err.response.statusCode >= 500 && err.response.statusCode < 600)\n ) {\n throw new ExternalHostError(err, 'gitlab');\n }\n }\n const platformFailureCodes = [\n 'EAI_AGAIN',\n 'ECONNRESET',\n 'ETIMEDOUT',\n 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n ];\n // TODO: fix test, should be `RequestError`\n if (\n 'code' in err &&\n isString(err.code) &&\n platformFailureCodes.includes(err.code)\n ) {\n throw new ExternalHostError(err, 'gitlab');\n }\n if (err.name === 'ParseError') {\n throw new ExternalHostError(err, 'gitlab');\n }\n throw err;\n }\n\n protected override calculateRetryDelay(retryObject: RetryObject): number {\n const { error, attemptCount, retryOptions } = retryObject;\n if (\n attemptCount <= retryOptions.limit &&\n error.options.method === 'POST' &&\n error.response?.statusCode === 409 &&\n error.response.rawBody.toString().includes('Resource lock')\n ) {\n const noise = Math.random() * 100;\n return 2 ** (attemptCount - 1) * 1000 + noise;\n }\n\n return super.calculateRetryDelay(retryObject);\n }\n}\n"],"mappings":";;;;;;;;AASA,IAAI,UAAU;AACd,MAAa,cAAc,QAAsB;CAC/C,UAAU;AACZ;AAMA,IAAa,aAAb,cAAgC,SAA4B;CAC1D,IAAuB,UAA8B;EACnD,OAAO;CACT;CAEA,YAAY,OAAO,UAAU,SAA6B;EACxD,MAAM,MAAM,OAAO;CACrB;CAEA,eAAqD;EACnD,OAAO,MACJ,aAAa,CAAC,CACd,OAAO,CAAC,UAAU,CAAgC;CACvD;CAEA,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,WAAW;EACpE,MAAM,OAAO;GACX,GAAG;GACH,KAAK;EACP;EACA,KAAK,gBAAgB,CAAC;EACtB,KAAK,YAAY,kBAAkB;EAEnC,MAAM,SAAS,MAAM,MAAM,kBAAqB,QAAQ,IAAI;EAC5D,IAAI,KAAK,YAAY,YAAY,QAAQ,OAAO,IAAI,GAAG;GACrD,KAAK,YAAY,WAAW;GAG5B,IAAI;IACF,MAAM,aAAa,gBAAgB,OAAO,QAAQ,IAAI;IACtD,MAAM,UAAU,YAAY,MAAM,MAC9B,SAAS,WAAW,KAAK,GAAG,IAC5B;IACJ,IAAI,SAAS;KACX,IAAI,OAAO,CAAC,CAAC,wBAAwB;MACnC,MAAM,kBAAkB,SAAS,OAAO;MACxC,QAAQ,WAAW,gBAAgB;MACnC,QAAQ,OAAO,gBAAgB;KACjC;KAEA,KAAK,MAAM;KAEX,MAAM,aAAa,MAAM,KAAK,kBAAqB,QAAQ,IAAI;;KAE/D,IAAI,QAAQ,WAAW,IAAI,GACzB,OAAO,KAAK,KAAK,GAAG,WAAW,IAAI;IAEvC;GACF,SAAS,KAAK;IACZ,OAAO,KAAK,EAAE,IAAI,GAAG,kBAAkB;GACzC;EACF;EACA,OAAO;CACT;CAEA,YACE,KACA,cACA,KACO;EACP,IAAI,eAAe,gBAAgB,IAAI,UAAU,YAAY;GAC3D,IAAI,IAAI,SAAS,eAAe,KAAK;IACnC,OAAO,MAAM,EAAE,IAAI,GAAG,YAAY;IAClC,OAAO,MAAM,EAAE,IAAI,GAAG,gBAAgB;IACtC,MAAM;GACR;GACA,OAAO,MAAM,EAAE,IAAI,GAAG,kBAAkB;GACxC,IACE,IAAI,SAAS,eAAe,OAC3B,IAAI,SAAS,cAAc,OAAO,IAAI,SAAS,aAAa,KAE7D,MAAM,IAAI,kBAAkB,KAAK,QAAQ;EAE7C;EAQA,IACE,UAAU,OACV,SAAS,IAAI,IAAI,KACjB;GATA;GACA;GACA;GACA;EAMmB,CAAC,CAAC,SAAS,IAAI,IAAI,GAEtC,MAAM,IAAI,kBAAkB,KAAK,QAAQ;EAE3C,IAAI,IAAI,SAAS,cACf,MAAM,IAAI,kBAAkB,KAAK,QAAQ;EAE3C,MAAM;CACR;CAEA,oBAAuC,aAAkC;EACvE,MAAM,EAAE,OAAO,cAAc,iBAAiB;EAC9C,IACE,gBAAgB,aAAa,SAC7B,MAAM,QAAQ,WAAW,UACzB,MAAM,UAAU,eAAe,OAC/B,MAAM,SAAS,QAAQ,SAAS,CAAC,CAAC,SAAS,eAAe,GAC1D;GACA,MAAM,QAAQ,KAAK,OAAO,IAAI;GAC9B,OAAO,MAAM,eAAe,KAAK,MAAO;EAC1C;EAEA,OAAO,MAAM,oBAAoB,WAAW;CAC9C;AACF"}
1
+ {"version":3,"file":"gitlab.js","names":[],"sources":["../../../lib/util/http/gitlab.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { RequestError, type RetryObject } from 'got';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { getEnv } from '../env.ts';\nimport { parseLinkHeader, parseUrl } from '../url.ts';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nlet baseUrl = 'https://gitlab.com/api/v4/';\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport interface GitlabHttpOptions extends HttpOptions {\n paginate?: boolean;\n}\n\nexport class GitlabHttp extends HttpBase<GitlabHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'gitlab', options?: GitlabHttpOptions) {\n super(type, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat(['paginate'] as (keyof GitlabHttpOptions)[]);\n }\n\n protected override async requestJsonUnsafe<T = unknown>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GitlabHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n opts.httpOptions ??= {};\n opts.httpOptions.throwHttpErrors = true;\n\n const result = await super.requestJsonUnsafe<T>(method, opts);\n if (opts.httpOptions.paginate && isArray(result.body)) {\n opts.httpOptions.memCache = false;\n\n // Check if result is paginated\n try {\n const linkHeader = parseLinkHeader(result.headers.link);\n const nextUrl = linkHeader?.next?.url\n ? parseUrl(linkHeader.next.url)\n : null;\n if (nextUrl) {\n if (getEnv().GITLAB_IGNORE_REPO_URL) {\n const defaultEndpoint = parseUrl(baseUrl)!;\n nextUrl.protocol = defaultEndpoint.protocol;\n nextUrl.host = defaultEndpoint.host;\n }\n\n opts.url = nextUrl;\n\n const nextResult = await this.requestJsonUnsafe<T>(method, opts);\n // v8 ignore else -- TODO: add test #40625\n if (isArray(nextResult.body)) {\n result.body.push(...nextResult.body);\n }\n }\n } catch (err) {\n logger.warn({ err }, 'Pagination error');\n }\n }\n return result;\n }\n\n protected override handleError(\n url: string | URL,\n _httpOptions: HttpOptions,\n err: Error,\n ): never {\n if (err instanceof RequestError && err.response?.statusCode) {\n if (err.response.statusCode === 404) {\n logger.trace({ err }, 'GitLab 404');\n logger.debug({ url }, 'GitLab API 404');\n throw err;\n }\n logger.debug({ err }, 'Gitlab API error');\n if (\n err.response.statusCode === 429 ||\n (err.response.statusCode >= 500 && err.response.statusCode < 600)\n ) {\n throw new ExternalHostError(err, 'gitlab');\n }\n }\n const platformFailureCodes = [\n 'EAI_AGAIN',\n 'ECONNRESET',\n 'ETIMEDOUT',\n 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n ];\n // TODO: fix test, should be `RequestError`\n if (\n 'code' in err &&\n isString(err.code) &&\n platformFailureCodes.includes(err.code)\n ) {\n throw new ExternalHostError(err, 'gitlab');\n }\n if (err.name === 'ParseError') {\n throw new ExternalHostError(err, 'gitlab');\n }\n throw err;\n }\n\n protected override calculateRetryDelay(retryObject: RetryObject): number {\n const { error, attemptCount, retryOptions } = retryObject;\n if (\n attemptCount <= retryOptions.limit &&\n error.options.method === 'POST' &&\n error.response?.statusCode === 409 &&\n error.response.rawBody.toString().includes('Resource lock')\n ) {\n const noise = Math.random() * 100;\n return 2 ** (attemptCount - 1) * 1000 + noise;\n }\n\n return super.calculateRetryDelay(retryObject);\n }\n}\n"],"mappings":";;;;;;;;AASA,IAAI,UAAU;AACd,SAAgB,WAAW,KAAmB;CAC5C,UAAU;AACZ;AAMA,IAAa,aAAb,cAAgC,SAA4B;CAC1D,IAAuB,UAA8B;EACnD,OAAO;CACT;CAEA,YAAY,OAAO,UAAU,SAA6B;EACxD,MAAM,MAAM,OAAO;CACrB;CAEA,eAAqD;EACnD,OAAO,MACJ,aAAa,CAAC,CACd,OAAO,CAAC,UAAU,CAAgC;CACvD;CAEA,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,WAAW;EACpE,MAAM,OAAO;GACX,GAAG;GACH,KAAK;EACP;EACA,KAAK,gBAAgB,CAAC;EACtB,KAAK,YAAY,kBAAkB;EAEnC,MAAM,SAAS,MAAM,MAAM,kBAAqB,QAAQ,IAAI;EAC5D,IAAI,KAAK,YAAY,YAAY,QAAQ,OAAO,IAAI,GAAG;GACrD,KAAK,YAAY,WAAW;GAG5B,IAAI;IACF,MAAM,aAAa,gBAAgB,OAAO,QAAQ,IAAI;IACtD,MAAM,UAAU,YAAY,MAAM,MAC9B,SAAS,WAAW,KAAK,GAAG,IAC5B;IACJ,IAAI,SAAS;KACX,IAAI,OAAO,CAAC,CAAC,wBAAwB;MACnC,MAAM,kBAAkB,SAAS,OAAO;MACxC,QAAQ,WAAW,gBAAgB;MACnC,QAAQ,OAAO,gBAAgB;KACjC;KAEA,KAAK,MAAM;KAEX,MAAM,aAAa,MAAM,KAAK,kBAAqB,QAAQ,IAAI;;KAE/D,IAAI,QAAQ,WAAW,IAAI,GACzB,OAAO,KAAK,KAAK,GAAG,WAAW,IAAI;IAEvC;GACF,SAAS,KAAK;IACZ,OAAO,KAAK,EAAE,IAAI,GAAG,kBAAkB;GACzC;EACF;EACA,OAAO;CACT;CAEA,YACE,KACA,cACA,KACO;EACP,IAAI,eAAe,gBAAgB,IAAI,UAAU,YAAY;GAC3D,IAAI,IAAI,SAAS,eAAe,KAAK;IACnC,OAAO,MAAM,EAAE,IAAI,GAAG,YAAY;IAClC,OAAO,MAAM,EAAE,IAAI,GAAG,gBAAgB;IACtC,MAAM;GACR;GACA,OAAO,MAAM,EAAE,IAAI,GAAG,kBAAkB;GACxC,IACE,IAAI,SAAS,eAAe,OAC3B,IAAI,SAAS,cAAc,OAAO,IAAI,SAAS,aAAa,KAE7D,MAAM,IAAI,kBAAkB,KAAK,QAAQ;EAE7C;EAQA,IACE,UAAU,OACV,SAAS,IAAI,IAAI,KACjB;GATA;GACA;GACA;GACA;EAMmB,CAAC,CAAC,SAAS,IAAI,IAAI,GAEtC,MAAM,IAAI,kBAAkB,KAAK,QAAQ;EAE3C,IAAI,IAAI,SAAS,cACf,MAAM,IAAI,kBAAkB,KAAK,QAAQ;EAE3C,MAAM;CACR;CAEA,oBAAuC,aAAkC;EACvE,MAAM,EAAE,OAAO,cAAc,iBAAiB;EAC9C,IACE,gBAAgB,aAAa,SAC7B,MAAM,QAAQ,WAAW,UACzB,MAAM,UAAU,eAAe,OAC/B,MAAM,SAAS,QAAQ,SAAS,CAAC,CAAC,SAAS,eAAe,GAC1D;GACA,MAAM,QAAQ,KAAK,OAAO,IAAI;GAC9B,OAAO,MAAM,eAAe,KAAK,MAAO;EAC1C;EAEA,OAAO,MAAM,oBAAoB,WAAW;CAC9C;AACF"}
@@ -2,10 +2,12 @@ import { ensureTrailingSlash } from "../url.js";
2
2
  import { HttpBase } from "./http.js";
3
3
  //#region lib/util/http/scm-manager.ts
4
4
  let baseUrl;
5
- const setBaseUrl = (newBaseUrl) => {
5
+ function setBaseUrl(newBaseUrl) {
6
6
  baseUrl = ensureTrailingSlash(newBaseUrl);
7
- };
8
- const getBaseUrl = () => baseUrl;
7
+ }
8
+ function getBaseUrl() {
9
+ return baseUrl;
10
+ }
9
11
  var ScmManagerHttp = class extends HttpBase {
10
12
  constructor() {
11
13
  super("scm-manager");
@@ -1 +1 @@
1
- {"version":3,"file":"scm-manager.js","names":[],"sources":["../../../lib/util/http/scm-manager.ts"],"sourcesContent":["import { ensureTrailingSlash } from '../url.ts';\nimport { HttpBase } from './http.ts';\n\nlet baseUrl: string;\nexport const setBaseUrl = (newBaseUrl: string): void => {\n baseUrl = ensureTrailingSlash(newBaseUrl);\n};\nexport const getBaseUrl = (): string => baseUrl;\n\nexport class ScmManagerHttp extends HttpBase {\n constructor() {\n super('scm-manager');\n }\n\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n}\n"],"mappings":";;;AAGA,IAAI;AACJ,MAAa,cAAc,eAA6B;CACtD,UAAU,oBAAoB,UAAU;AAC1C;AACA,MAAa,mBAA2B;AAExC,IAAa,iBAAb,cAAoC,SAAS;CAC3C,cAAc;EACZ,MAAM,aAAa;CACrB;CAEA,IAAuB,UAA8B;EACnD,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"scm-manager.js","names":[],"sources":["../../../lib/util/http/scm-manager.ts"],"sourcesContent":["import { ensureTrailingSlash } from '../url.ts';\nimport { HttpBase } from './http.ts';\n\nlet baseUrl: string;\nexport function setBaseUrl(newBaseUrl: string): void {\n baseUrl = ensureTrailingSlash(newBaseUrl);\n}\nexport function getBaseUrl(): string {\n return baseUrl;\n}\n\nexport class ScmManagerHttp extends HttpBase {\n constructor() {\n super('scm-manager');\n }\n\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n}\n"],"mappings":";;;AAGA,IAAI;AACJ,SAAgB,WAAW,YAA0B;CACnD,UAAU,oBAAoB,UAAU;AAC1C;AACA,SAAgB,aAAqB;CACnC,OAAO;AACT;AAEA,IAAa,iBAAb,cAAoC,SAAS;CAC3C,cAAc;EACZ,MAAM,aAAa;CACrB;CAEA,IAAuB,UAA8B;EACnD,OAAO;CACT;AACF"}
@@ -15,13 +15,13 @@ async function extractAllDependencies(config) {
15
15
  const managerList = getEnabledManagersList(config.enabledManagers);
16
16
  const extractList = [];
17
17
  const fileList = await scm.getFileList();
18
- const tryConfig = (managerConfig) => {
18
+ function tryConfig(managerConfig) {
19
19
  const matchingFileList = getMatchingFiles(managerConfig, fileList);
20
20
  if (matchingFileList.length) extractList.push({
21
21
  ...managerConfig,
22
22
  fileList: matchingFileList
23
23
  });
24
- };
24
+ }
25
25
  instrument("filter packageFiles for managers", () => {
26
26
  for (const manager of managerList) {
27
27
  const managerConfig = getManagerConfig(config, manager);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/workers/repository/extract/index.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { ManagerConfig, RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { isCustomManager } from '../../../modules/manager/custom/index.ts';\nimport {\n getEnabledManagersList,\n hashMap,\n} from '../../../modules/manager/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport type { ExtractResult, WorkerExtractConfig } from '../../types.ts';\nimport { getMatchingFiles } from './file-match.ts';\nimport { getManagerPackageFiles } from './manager-files.ts';\nimport { processSupersedesManagers } from './supersedes.ts';\n\nexport async function extractAllDependencies(\n config: RenovateConfig,\n): Promise<ExtractResult> {\n const managerList = getEnabledManagersList(config.enabledManagers);\n const extractList: WorkerExtractConfig[] = [];\n const fileList = await scm.getFileList();\n\n const tryConfig = (managerConfig: ManagerConfig): void => {\n const matchingFileList = getMatchingFiles(managerConfig, fileList);\n if (matchingFileList.length) {\n extractList.push({ ...managerConfig, fileList: matchingFileList });\n }\n };\n\n instrument('filter packageFiles for managers', () => {\n for (const manager of managerList) {\n const managerConfig = getManagerConfig(config, manager);\n managerConfig.manager = manager;\n if (isCustomManager(manager)) {\n const filteredCustomManagers = (config.customManagers ?? []).filter(\n (mgr) => mgr.customType === manager,\n );\n for (const customManager of filteredCustomManagers) {\n tryConfig(mergeChildConfig(managerConfig, customManager));\n }\n } else {\n tryConfig(managerConfig);\n }\n }\n });\n\n const extractResult: ExtractResult = {\n packageFiles: {},\n extractionFingerprints: {},\n };\n\n // Store the fingerprint of all managers which match any file (even if they do not find any dependencies)\n // The cached result needs to be invalidated if the fingerprint of any matching manager changes\n for (const { manager } of extractList) {\n extractResult.extractionFingerprints[manager] = hashMap.get(manager);\n }\n\n const extractDurations: Record<string, number> = {};\n const extractResults = await Promise.all(\n extractList.map(async (managerConfig) => {\n const start = Date.now();\n const packageFiles = await instrument(\n managerConfig.manager,\n async () => await getManagerPackageFiles(managerConfig),\n );\n const durationMs = Math.round(Date.now() - start);\n extractDurations[managerConfig.manager] = durationMs;\n return { manager: managerConfig.manager, packageFiles };\n }),\n );\n\n // De-duplicate results using supersedesManagers\n processSupersedesManagers(extractResults);\n\n // Sort alphabetically for stable log output. See #40091\n const sortedExtractDurations = Object.keys(extractDurations)\n .sort()\n .reduce<Record<string, number>>((acc, key) => {\n acc[key] = extractDurations[key];\n return acc;\n }, {});\n\n logger.debug(\n { managers: sortedExtractDurations },\n 'manager extract durations (ms)',\n );\n let fileCount = 0;\n for (const { manager, packageFiles } of extractResults) {\n if (packageFiles?.length) {\n fileCount += packageFiles.length;\n logger.debug(`Found ${manager} package files`);\n extractResult.packageFiles[manager] = (\n extractResult.packageFiles[manager] || []\n ).concat(packageFiles);\n }\n }\n logger.debug(`Found ${fileCount} package file(s)`);\n\n // If enabledManagers is non-empty, check that each of them has at least one extraction.\n // If not, log a warning to indicate possible misconfiguration.\n if (isNonEmptyArray(config.enabledManagers)) {\n for (const enabledManager of config.enabledManagers) {\n if (\n !(enabledManager.replace('custom.', '') in extractResult.packageFiles)\n ) {\n logger.debug(\n { manager: enabledManager },\n `Manager explicitly enabled in \"enabledManagers\" config, but found no results. Possible config error?`,\n );\n }\n }\n }\n\n return extractResult;\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,eAAsB,uBACpB,QACwB;CACxB,MAAM,cAAc,uBAAuB,OAAO,eAAe;CACjE,MAAM,cAAqC,CAAC;CAC5C,MAAM,WAAW,MAAM,IAAI,YAAY;CAEvC,MAAM,aAAa,kBAAuC;EACxD,MAAM,mBAAmB,iBAAiB,eAAe,QAAQ;EACjE,IAAI,iBAAiB,QACnB,YAAY,KAAK;GAAE,GAAG;GAAe,UAAU;EAAiB,CAAC;CAErE;CAEA,WAAW,0CAA0C;EACnD,KAAK,MAAM,WAAW,aAAa;GACjC,MAAM,gBAAgB,iBAAiB,QAAQ,OAAO;GACtD,cAAc,UAAU;GACxB,IAAI,gBAAgB,OAAO,GAAG;IAC5B,MAAM,0BAA0B,OAAO,kBAAkB,CAAC,EAAA,CAAG,QAC1D,QAAQ,IAAI,eAAe,OAC9B;IACA,KAAK,MAAM,iBAAiB,wBAC1B,UAAU,iBAAiB,eAAe,aAAa,CAAC;GAE5D,OACE,UAAU,aAAa;EAE3B;CACF,CAAC;CAED,MAAM,gBAA+B;EACnC,cAAc,CAAC;EACf,wBAAwB,CAAC;CAC3B;CAIA,KAAK,MAAM,EAAE,aAAa,aACxB,cAAc,uBAAuB,WAAW,QAAQ,IAAI,OAAO;CAGrE,MAAM,mBAA2C,CAAC;CAClD,MAAM,iBAAiB,MAAM,QAAQ,IACnC,YAAY,IAAI,OAAO,kBAAkB;EACvC,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,eAAe,MAAM,WACzB,cAAc,SACd,YAAY,MAAM,uBAAuB,aAAa,CACxD;EACA,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,KAAK;EAChD,iBAAiB,cAAc,WAAW;EAC1C,OAAO;GAAE,SAAS,cAAc;GAAS;EAAa;CACxD,CAAC,CACH;CAGA,0BAA0B,cAAc;CAGxC,MAAM,yBAAyB,OAAO,KAAK,gBAAgB,CAAC,CACzD,KAAK,CAAC,CACN,QAAgC,KAAK,QAAQ;EAC5C,IAAI,OAAO,iBAAiB;EAC5B,OAAO;CACT,GAAG,CAAC,CAAC;CAEP,OAAO,MACL,EAAE,UAAU,uBAAuB,GACnC,gCACF;CACA,IAAI,YAAY;CAChB,KAAK,MAAM,EAAE,SAAS,kBAAkB,gBACtC,IAAI,cAAc,QAAQ;EACxB,aAAa,aAAa;EAC1B,OAAO,MAAM,SAAS,QAAQ,eAAe;EAC7C,cAAc,aAAa,YACzB,cAAc,aAAa,YAAY,CAAC,EAAA,CACxC,OAAO,YAAY;CACvB;CAEF,OAAO,MAAM,SAAS,UAAU,iBAAiB;CAIjD,IAAI,gBAAgB,OAAO,eAAe;OACnC,MAAM,kBAAkB,OAAO,iBAClC,IACE,EAAE,eAAe,QAAQ,WAAW,EAAE,KAAK,cAAc,eAEzD,OAAO,MACL,EAAE,SAAS,eAAe,GAC1B,sGACF;CAAA;CAKN,OAAO;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/workers/repository/extract/index.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { ManagerConfig, RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { isCustomManager } from '../../../modules/manager/custom/index.ts';\nimport {\n getEnabledManagersList,\n hashMap,\n} from '../../../modules/manager/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport type { ExtractResult, WorkerExtractConfig } from '../../types.ts';\nimport { getMatchingFiles } from './file-match.ts';\nimport { getManagerPackageFiles } from './manager-files.ts';\nimport { processSupersedesManagers } from './supersedes.ts';\n\nexport async function extractAllDependencies(\n config: RenovateConfig,\n): Promise<ExtractResult> {\n const managerList = getEnabledManagersList(config.enabledManagers);\n const extractList: WorkerExtractConfig[] = [];\n const fileList = await scm.getFileList();\n\n function tryConfig(managerConfig: ManagerConfig): void {\n const matchingFileList = getMatchingFiles(managerConfig, fileList);\n if (matchingFileList.length) {\n extractList.push({ ...managerConfig, fileList: matchingFileList });\n }\n }\n\n instrument('filter packageFiles for managers', () => {\n for (const manager of managerList) {\n const managerConfig = getManagerConfig(config, manager);\n managerConfig.manager = manager;\n if (isCustomManager(manager)) {\n const filteredCustomManagers = (config.customManagers ?? []).filter(\n (mgr) => mgr.customType === manager,\n );\n for (const customManager of filteredCustomManagers) {\n tryConfig(mergeChildConfig(managerConfig, customManager));\n }\n } else {\n tryConfig(managerConfig);\n }\n }\n });\n\n const extractResult: ExtractResult = {\n packageFiles: {},\n extractionFingerprints: {},\n };\n\n // Store the fingerprint of all managers which match any file (even if they do not find any dependencies)\n // The cached result needs to be invalidated if the fingerprint of any matching manager changes\n for (const { manager } of extractList) {\n extractResult.extractionFingerprints[manager] = hashMap.get(manager);\n }\n\n const extractDurations: Record<string, number> = {};\n const extractResults = await Promise.all(\n extractList.map(async (managerConfig) => {\n const start = Date.now();\n const packageFiles = await instrument(\n managerConfig.manager,\n async () => await getManagerPackageFiles(managerConfig),\n );\n const durationMs = Math.round(Date.now() - start);\n extractDurations[managerConfig.manager] = durationMs;\n return { manager: managerConfig.manager, packageFiles };\n }),\n );\n\n // De-duplicate results using supersedesManagers\n processSupersedesManagers(extractResults);\n\n // Sort alphabetically for stable log output. See #40091\n const sortedExtractDurations = Object.keys(extractDurations)\n .sort()\n .reduce<Record<string, number>>((acc, key) => {\n acc[key] = extractDurations[key];\n return acc;\n }, {});\n\n logger.debug(\n { managers: sortedExtractDurations },\n 'manager extract durations (ms)',\n );\n let fileCount = 0;\n for (const { manager, packageFiles } of extractResults) {\n if (packageFiles?.length) {\n fileCount += packageFiles.length;\n logger.debug(`Found ${manager} package files`);\n extractResult.packageFiles[manager] = (\n extractResult.packageFiles[manager] || []\n ).concat(packageFiles);\n }\n }\n logger.debug(`Found ${fileCount} package file(s)`);\n\n // If enabledManagers is non-empty, check that each of them has at least one extraction.\n // If not, log a warning to indicate possible misconfiguration.\n if (isNonEmptyArray(config.enabledManagers)) {\n for (const enabledManager of config.enabledManagers) {\n if (\n !(enabledManager.replace('custom.', '') in extractResult.packageFiles)\n ) {\n logger.debug(\n { manager: enabledManager },\n `Manager explicitly enabled in \"enabledManagers\" config, but found no results. Possible config error?`,\n );\n }\n }\n }\n\n return extractResult;\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,eAAsB,uBACpB,QACwB;CACxB,MAAM,cAAc,uBAAuB,OAAO,eAAe;CACjE,MAAM,cAAqC,CAAC;CAC5C,MAAM,WAAW,MAAM,IAAI,YAAY;CAEvC,SAAS,UAAU,eAAoC;EACrD,MAAM,mBAAmB,iBAAiB,eAAe,QAAQ;EACjE,IAAI,iBAAiB,QACnB,YAAY,KAAK;GAAE,GAAG;GAAe,UAAU;EAAiB,CAAC;CAErE;CAEA,WAAW,0CAA0C;EACnD,KAAK,MAAM,WAAW,aAAa;GACjC,MAAM,gBAAgB,iBAAiB,QAAQ,OAAO;GACtD,cAAc,UAAU;GACxB,IAAI,gBAAgB,OAAO,GAAG;IAC5B,MAAM,0BAA0B,OAAO,kBAAkB,CAAC,EAAA,CAAG,QAC1D,QAAQ,IAAI,eAAe,OAC9B;IACA,KAAK,MAAM,iBAAiB,wBAC1B,UAAU,iBAAiB,eAAe,aAAa,CAAC;GAE5D,OACE,UAAU,aAAa;EAE3B;CACF,CAAC;CAED,MAAM,gBAA+B;EACnC,cAAc,CAAC;EACf,wBAAwB,CAAC;CAC3B;CAIA,KAAK,MAAM,EAAE,aAAa,aACxB,cAAc,uBAAuB,WAAW,QAAQ,IAAI,OAAO;CAGrE,MAAM,mBAA2C,CAAC;CAClD,MAAM,iBAAiB,MAAM,QAAQ,IACnC,YAAY,IAAI,OAAO,kBAAkB;EACvC,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,eAAe,MAAM,WACzB,cAAc,SACd,YAAY,MAAM,uBAAuB,aAAa,CACxD;EACA,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,KAAK;EAChD,iBAAiB,cAAc,WAAW;EAC1C,OAAO;GAAE,SAAS,cAAc;GAAS;EAAa;CACxD,CAAC,CACH;CAGA,0BAA0B,cAAc;CAGxC,MAAM,yBAAyB,OAAO,KAAK,gBAAgB,CAAC,CACzD,KAAK,CAAC,CACN,QAAgC,KAAK,QAAQ;EAC5C,IAAI,OAAO,iBAAiB;EAC5B,OAAO;CACT,GAAG,CAAC,CAAC;CAEP,OAAO,MACL,EAAE,UAAU,uBAAuB,GACnC,gCACF;CACA,IAAI,YAAY;CAChB,KAAK,MAAM,EAAE,SAAS,kBAAkB,gBACtC,IAAI,cAAc,QAAQ;EACxB,aAAa,aAAa;EAC1B,OAAO,MAAM,SAAS,QAAQ,eAAe;EAC7C,cAAc,aAAa,YACzB,cAAc,aAAa,YAAY,CAAC,EAAA,CACxC,OAAO,YAAY;CACvB;CAEF,OAAO,MAAM,SAAS,UAAU,iBAAiB;CAIjD,IAAI,gBAAgB,OAAO,eAAe;OACnC,MAAM,kBAAkB,OAAO,iBAClC,IACE,EAAE,eAAe,QAAQ,WAAW,EAAE,KAAK,cAAc,eAEzD,OAAO,MACL,EAAE,SAAS,eAAe,GAC1B,sGACF;CAAA;CAKN,OAAO;AACT"}
@@ -66,7 +66,9 @@ var ChangeLogSource = class {
66
66
  return null;
67
67
  }
68
68
  const changelogReleases = [];
69
- const inRange = (v) => versioningApi.isGreaterThan(v, currentVersion) && !versioningApi.isGreaterThan(v, newVersion);
69
+ function inRange(v) {
70
+ return versioningApi.isGreaterThan(v, currentVersion) && !versioningApi.isGreaterThan(v, newVersion);
71
+ }
70
72
  const getTags = memoize(() => this.getAllTags(apiBaseUrl, repository));
71
73
  for (let i = 1; i < validReleases.length; i += 1) {
72
74
  const prev = validReleases[i - 1];
@@ -1 +1 @@
1
- {"version":3,"file":"source.js","names":["allVersioning.get","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/source.ts"],"sourcesContent":["import {\n isEmptyArray,\n isFalsy,\n isNonEmptyString,\n isNullOrUndefined,\n} from '@sindresorhus/is';\nimport { logger } from '../../../../../logger/index.ts';\nimport { getPkgReleases } from '../../../../../modules/datasource/index.ts';\nimport type { Release } from '../../../../../modules/datasource/types.ts';\nimport * as allVersioning from '../../../../../modules/versioning/index.ts';\nimport * as packageCache from '../../../../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types.ts';\nimport { memoize } from '../../../../../util/memoize.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport { parseUrl, trimSlashes } from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport { slugifyUrl } from './common.ts';\nimport { addReleaseNotes } from './release-notes.ts';\nimport { getInRangeReleases } from './releases.ts';\nimport type {\n ChangeLogError,\n ChangeLogPlatform,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\nexport abstract class ChangeLogSource {\n private readonly cacheNamespace: PackageCacheNamespace;\n private readonly platform: ChangeLogPlatform;\n private readonly datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags';\n\n constructor(\n platform: ChangeLogPlatform,\n datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags',\n ) {\n this.platform = platform;\n this.datasource = datasource;\n this.cacheNamespace = `changelog-${platform}-release`;\n }\n\n abstract getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string;\n\n abstract getAPIBaseUrl(config: BranchUpgradeConfig): string;\n\n async getAllTags(endpoint: string, repository: string): Promise<string[]> {\n const tags = (\n await getPkgReleases({\n registryUrls: [endpoint],\n datasource: this.datasource,\n packageName: repository,\n versioning:\n 'regex:(?<major>\\\\d+)(\\\\.(?<minor>\\\\d+))?(\\\\.(?<patch>\\\\d+))?',\n })\n )?.releases;\n\n if (isNullOrUndefined(tags) || isEmptyArray(tags)) {\n logger.debug(\n `No ${this.datasource} tags found for repository: ${repository}`,\n );\n\n return [];\n }\n\n return tags.map(({ version }) => version);\n }\n\n public async getChangeLogJSON(\n config: BranchUpgradeConfig,\n ): Promise<ChangeLogResult | null> {\n logger.trace(`getChangeLogJSON for ${this.platform}`);\n\n const versioning = config.versioning!;\n const currentVersion = config.currentVersion!;\n const newVersion = config.newVersion!;\n const sourceUrl = config.sourceUrl!;\n const packageName = config.packageName!;\n const depName = config.depName!;\n const sourceDirectory = config.sourceDirectory;\n const versioningApi = allVersioning.get(versioning);\n\n if (this.shouldSkipPackage(config)) {\n return null;\n }\n\n const baseUrl = this.getBaseUrl(config);\n const apiBaseUrl = this.getAPIBaseUrl(config);\n const repository = this.getRepositoryFromUrl(config);\n\n const tokenResponse = this.hasValidToken(config);\n if (!tokenResponse.isValid) {\n if (tokenResponse.error) {\n return {\n error: tokenResponse.error,\n };\n }\n return null;\n }\n\n if (isFalsy(this.hasValidRepository(repository))) {\n logger.debug(`Invalid ${this.platform} URL found: ${sourceUrl}`);\n return null;\n }\n\n const releases = config.releases ?? (await getInRangeReleases(config));\n if (!releases?.length) {\n logger.debug('No releases');\n return null;\n }\n // This extra filter/sort should not be necessary, but better safe than sorry\n const validReleases = [...releases]\n .filter((release) => versioningApi.isVersion(release.version))\n .sort((a, b) => versioningApi.sortVersions(a.version, b.version));\n\n if (validReleases.length < 2) {\n logger.debug(\n `Not enough valid releases for dep ${depName} (${packageName})`,\n );\n return null;\n }\n\n const changelogReleases: ChangeLogRelease[] = [];\n\n // Check if `v` belongs to the range (currentVersion, newVersion]\n const inRange = (v: string): boolean =>\n versioningApi.isGreaterThan(v, currentVersion) &&\n !versioningApi.isGreaterThan(v, newVersion);\n\n const getTags = memoize(() => this.getAllTags(apiBaseUrl, repository));\n for (let i = 1; i < validReleases.length; i += 1) {\n const prev = validReleases[i - 1];\n const next = validReleases[i];\n if (!inRange(next.version)) {\n continue;\n }\n let release = await packageCache.get(\n this.cacheNamespace,\n this.getCacheKey(sourceUrl, packageName, prev.version, next.version),\n );\n if (!release) {\n release = {\n version: next.version,\n date: next.releaseTimestamp,\n gitRef: next.gitRef,\n // put empty changes so that existing templates won't break\n changes: [],\n compare: {},\n };\n const tags = await getTags();\n const prevHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n prev,\n tags,\n );\n const nextHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n next,\n tags,\n );\n if (isNonEmptyString(prevHead) && isNonEmptyString(nextHead)) {\n release.compare.url = this.getCompareURL(\n baseUrl,\n repository,\n prevHead,\n nextHead,\n );\n }\n const cacheMinutes = 55;\n await packageCache.set(\n this.cacheNamespace,\n this.getCacheKey(sourceUrl, packageName, prev.version, next.version),\n release,\n cacheMinutes,\n );\n }\n changelogReleases.unshift(release);\n }\n\n let res: ChangeLogResult | null = {\n project: {\n apiBaseUrl,\n baseUrl,\n type: this.platform,\n repository,\n sourceUrl,\n sourceDirectory,\n packageName,\n depName,\n },\n versions: changelogReleases,\n };\n\n res = await addReleaseNotes(res, config);\n\n return res;\n }\n\n private findTagOfRelease(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n depNewVersion: string,\n tags: string[],\n ): string | undefined {\n const releaseRegexPrefix = `^(?:${packageName}|${depName}|release)[@_-]v?`;\n const regex = regEx(releaseRegexPrefix, undefined, false);\n const exactReleaseRegex = regEx(`${releaseRegexPrefix}${depNewVersion}`);\n const exactTagsList = tags.filter((tag) => {\n return exactReleaseRegex.test(tag);\n });\n const tagList = exactTagsList.length ? exactTagsList : tags;\n return tagList\n .filter((tag) => versioningApi.isVersion(tag.replace(regex, '')))\n .find((tag) =>\n versioningApi.equals(tag.replace(regex, ''), depNewVersion),\n );\n }\n\n private getRef(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n release: Release,\n tags: string[],\n ): string | null {\n const tagName = this.findTagOfRelease(\n versioningApi,\n packageName,\n depName,\n release.version,\n tags,\n );\n if (isNonEmptyString(tagName)) {\n return tagName;\n }\n if (isNonEmptyString(release.gitRef)) {\n return release.gitRef;\n }\n return null;\n }\n\n private getCacheKey(\n sourceUrl: string,\n packageName: string,\n prev: string,\n next: string,\n ): string {\n return `${slugifyUrl(sourceUrl)}:${packageName}:${prev}:${next}`;\n }\n\n getBaseUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const protocol = parsedUrl.protocol.replace(regEx(/^git\\+/), '');\n const host = parsedUrl.host;\n return `${protocol}//${host}/`;\n }\n\n getRepositoryFromUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const pathname = parsedUrl.pathname;\n return trimSlashes(pathname).replace(regEx(/\\.git$/), '');\n }\n\n protected hasValidToken(_config: BranchUpgradeConfig): {\n isValid: boolean;\n error?: ChangeLogError;\n } {\n return { isValid: true };\n }\n\n protected shouldSkipPackage(_config: BranchUpgradeConfig): boolean {\n return false;\n }\n\n hasValidRepository(repository: string): boolean {\n return repository.split('/').length === 2;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"source.js","names":["allVersioning.get","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/source.ts"],"sourcesContent":["import {\n isEmptyArray,\n isFalsy,\n isNonEmptyString,\n isNullOrUndefined,\n} from '@sindresorhus/is';\nimport { logger } from '../../../../../logger/index.ts';\nimport { getPkgReleases } from '../../../../../modules/datasource/index.ts';\nimport type { Release } from '../../../../../modules/datasource/types.ts';\nimport * as allVersioning from '../../../../../modules/versioning/index.ts';\nimport * as packageCache from '../../../../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types.ts';\nimport { memoize } from '../../../../../util/memoize.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport { parseUrl, trimSlashes } from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport { slugifyUrl } from './common.ts';\nimport { addReleaseNotes } from './release-notes.ts';\nimport { getInRangeReleases } from './releases.ts';\nimport type {\n ChangeLogError,\n ChangeLogPlatform,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\nexport abstract class ChangeLogSource {\n private readonly cacheNamespace: PackageCacheNamespace;\n private readonly platform: ChangeLogPlatform;\n private readonly datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags';\n\n constructor(\n platform: ChangeLogPlatform,\n datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags',\n ) {\n this.platform = platform;\n this.datasource = datasource;\n this.cacheNamespace = `changelog-${platform}-release`;\n }\n\n abstract getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string;\n\n abstract getAPIBaseUrl(config: BranchUpgradeConfig): string;\n\n async getAllTags(endpoint: string, repository: string): Promise<string[]> {\n const tags = (\n await getPkgReleases({\n registryUrls: [endpoint],\n datasource: this.datasource,\n packageName: repository,\n versioning:\n 'regex:(?<major>\\\\d+)(\\\\.(?<minor>\\\\d+))?(\\\\.(?<patch>\\\\d+))?',\n })\n )?.releases;\n\n if (isNullOrUndefined(tags) || isEmptyArray(tags)) {\n logger.debug(\n `No ${this.datasource} tags found for repository: ${repository}`,\n );\n\n return [];\n }\n\n return tags.map(({ version }) => version);\n }\n\n public async getChangeLogJSON(\n config: BranchUpgradeConfig,\n ): Promise<ChangeLogResult | null> {\n logger.trace(`getChangeLogJSON for ${this.platform}`);\n\n const versioning = config.versioning!;\n const currentVersion = config.currentVersion!;\n const newVersion = config.newVersion!;\n const sourceUrl = config.sourceUrl!;\n const packageName = config.packageName!;\n const depName = config.depName!;\n const sourceDirectory = config.sourceDirectory;\n const versioningApi = allVersioning.get(versioning);\n\n if (this.shouldSkipPackage(config)) {\n return null;\n }\n\n const baseUrl = this.getBaseUrl(config);\n const apiBaseUrl = this.getAPIBaseUrl(config);\n const repository = this.getRepositoryFromUrl(config);\n\n const tokenResponse = this.hasValidToken(config);\n if (!tokenResponse.isValid) {\n if (tokenResponse.error) {\n return {\n error: tokenResponse.error,\n };\n }\n return null;\n }\n\n if (isFalsy(this.hasValidRepository(repository))) {\n logger.debug(`Invalid ${this.platform} URL found: ${sourceUrl}`);\n return null;\n }\n\n const releases = config.releases ?? (await getInRangeReleases(config));\n if (!releases?.length) {\n logger.debug('No releases');\n return null;\n }\n // This extra filter/sort should not be necessary, but better safe than sorry\n const validReleases = [...releases]\n .filter((release) => versioningApi.isVersion(release.version))\n .sort((a, b) => versioningApi.sortVersions(a.version, b.version));\n\n if (validReleases.length < 2) {\n logger.debug(\n `Not enough valid releases for dep ${depName} (${packageName})`,\n );\n return null;\n }\n\n const changelogReleases: ChangeLogRelease[] = [];\n\n // Check if `v` belongs to the range (currentVersion, newVersion]\n function inRange(v: string): boolean {\n return (\n versioningApi.isGreaterThan(v, currentVersion) &&\n !versioningApi.isGreaterThan(v, newVersion)\n );\n }\n\n const getTags = memoize(() => this.getAllTags(apiBaseUrl, repository));\n for (let i = 1; i < validReleases.length; i += 1) {\n const prev = validReleases[i - 1];\n const next = validReleases[i];\n if (!inRange(next.version)) {\n continue;\n }\n let release = await packageCache.get(\n this.cacheNamespace,\n this.getCacheKey(sourceUrl, packageName, prev.version, next.version),\n );\n if (!release) {\n release = {\n version: next.version,\n date: next.releaseTimestamp,\n gitRef: next.gitRef,\n // put empty changes so that existing templates won't break\n changes: [],\n compare: {},\n };\n const tags = await getTags();\n const prevHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n prev,\n tags,\n );\n const nextHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n next,\n tags,\n );\n if (isNonEmptyString(prevHead) && isNonEmptyString(nextHead)) {\n release.compare.url = this.getCompareURL(\n baseUrl,\n repository,\n prevHead,\n nextHead,\n );\n }\n const cacheMinutes = 55;\n await packageCache.set(\n this.cacheNamespace,\n this.getCacheKey(sourceUrl, packageName, prev.version, next.version),\n release,\n cacheMinutes,\n );\n }\n changelogReleases.unshift(release);\n }\n\n let res: ChangeLogResult | null = {\n project: {\n apiBaseUrl,\n baseUrl,\n type: this.platform,\n repository,\n sourceUrl,\n sourceDirectory,\n packageName,\n depName,\n },\n versions: changelogReleases,\n };\n\n res = await addReleaseNotes(res, config);\n\n return res;\n }\n\n private findTagOfRelease(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n depNewVersion: string,\n tags: string[],\n ): string | undefined {\n const releaseRegexPrefix = `^(?:${packageName}|${depName}|release)[@_-]v?`;\n const regex = regEx(releaseRegexPrefix, undefined, false);\n const exactReleaseRegex = regEx(`${releaseRegexPrefix}${depNewVersion}`);\n const exactTagsList = tags.filter((tag) => {\n return exactReleaseRegex.test(tag);\n });\n const tagList = exactTagsList.length ? exactTagsList : tags;\n return tagList\n .filter((tag) => versioningApi.isVersion(tag.replace(regex, '')))\n .find((tag) =>\n versioningApi.equals(tag.replace(regex, ''), depNewVersion),\n );\n }\n\n private getRef(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n release: Release,\n tags: string[],\n ): string | null {\n const tagName = this.findTagOfRelease(\n versioningApi,\n packageName,\n depName,\n release.version,\n tags,\n );\n if (isNonEmptyString(tagName)) {\n return tagName;\n }\n if (isNonEmptyString(release.gitRef)) {\n return release.gitRef;\n }\n return null;\n }\n\n private getCacheKey(\n sourceUrl: string,\n packageName: string,\n prev: string,\n next: string,\n ): string {\n return `${slugifyUrl(sourceUrl)}:${packageName}:${prev}:${next}`;\n }\n\n getBaseUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const protocol = parsedUrl.protocol.replace(regEx(/^git\\+/), '');\n const host = parsedUrl.host;\n return `${protocol}//${host}/`;\n }\n\n getRepositoryFromUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const pathname = parsedUrl.pathname;\n return trimSlashes(pathname).replace(regEx(/\\.git$/), '');\n }\n\n protected hasValidToken(_config: BranchUpgradeConfig): {\n isValid: boolean;\n error?: ChangeLogError;\n } {\n return { isValid: true };\n }\n\n protected shouldSkipPackage(_config: BranchUpgradeConfig): boolean {\n return false;\n }\n\n hasValidRepository(repository: string): boolean {\n return repository.split('/').length === 2;\n }\n}\n"],"mappings":"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"}
@@ -12,7 +12,9 @@ import { applyPackageRules } from "../../../util/package-rules/index.js";
12
12
  import { generateBranchName } from "./branch-name.js";
13
13
  import { isUndefined } from "@sindresorhus/is";
14
14
  //#region lib/workers/repository/updates/flatten.ts
15
- const upper = (str) => str.charAt(0).toUpperCase() + str.substring(1);
15
+ function upper(str) {
16
+ return str.charAt(0).toUpperCase() + str.substring(1);
17
+ }
16
18
  function sanitizeDepName(depName) {
17
19
  return depName.replace("@types/", "").replace("@", "").replace(regEx(/\//g), "-").replace(regEx(/\s+/g), "-").replace(regEx(/:/g), "-").replace(regEx(/-+/), "-").toLowerCase();
18
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"flatten.js","names":["template.compile"],"sources":["../../../../lib/workers/repository/updates/flatten.ts"],"sourcesContent":["import { isUndefined } from '@sindresorhus/is';\nimport {\n filterConfig,\n getManagerConfig,\n mergeChildConfig,\n} from '../../../config/index.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { getDefaultConfig } from '../../../modules/datasource/index.ts';\nimport { get } from '../../../modules/manager/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { detectSemanticCommits } from '../../../util/git/semantic.ts';\nimport { applyPackageRules } from '../../../util/package-rules/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport * as template from '../../../util/template/index.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../types.ts';\nimport { replacementAlreadyExists } from '../common.ts';\nimport { generateBranchName } from './branch-name.ts';\n\nconst upper = (str: string): string =>\n str.charAt(0).toUpperCase() + str.substring(1);\n\nexport function sanitizeDepName(depName: string): string {\n return depName\n .replace('@types/', '')\n .replace('@', '')\n .replace(regEx(/\\//g), '-')\n .replace(regEx(/\\s+/g), '-')\n .replace(regEx(/:/g), '-')\n .replace(regEx(/-+/), '-')\n .toLowerCase();\n}\n\nexport function applyUpdateConfig(input: BranchUpgradeConfig): any {\n const updateConfig = { ...input };\n delete updateConfig.packageRules;\n // TODO: Remove next line once #8075 is complete\n updateConfig.depNameSanitized = updateConfig.depName\n ? sanitizeDepName(updateConfig.depName)\n : undefined;\n updateConfig.newNameSanitized = updateConfig.newName\n ? sanitizeDepName(updateConfig.newName)\n : undefined;\n if (updateConfig.sourceUrl) {\n const parsedSourceUrl = parseUrl(updateConfig.sourceUrl);\n if (parsedSourceUrl?.pathname) {\n updateConfig.sourceRepoSlug = parsedSourceUrl.pathname\n .replace(regEx(/^\\//), '') // remove leading slash\n .replace(regEx(/\\//g), '-') // change slashes to hyphens\n .replace(regEx(/-+/g), '-'); // remove multiple hyphens\n updateConfig.sourceRepo = parsedSourceUrl.pathname.replace(\n regEx(/^\\//),\n '',\n ); // remove leading slash\n updateConfig.sourceRepoOrg = updateConfig.sourceRepo.replace(\n regEx(/\\/.*/g),\n '',\n ); // remove everything after first slash\n updateConfig.sourceRepoName = updateConfig.sourceRepo.replace(\n regEx(/.*\\//g),\n '',\n ); // remove everything up to the last slash\n }\n }\n if (updateConfig.sourceDirectory) {\n updateConfig.sourceDirectory = template.compile(\n updateConfig.sourceDirectory,\n updateConfig,\n );\n }\n generateBranchName(updateConfig);\n return updateConfig;\n}\n\nexport async function flattenUpdates(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<BranchUpgradeConfig[]> {\n const updates = [];\n const updateTypes = [\n 'major',\n 'minor',\n 'patch',\n 'pin',\n 'digest',\n 'lockFileMaintenance',\n 'replacement',\n ];\n for (const [manager, files] of Object.entries(packageFiles)) {\n const managerConfig = getManagerConfig(config, manager);\n for (const packageFile of files) {\n const packageFileConfig: BranchUpgradeConfig = mergeChildConfig(\n managerConfig,\n packageFile,\n ) as never;\n const packagePath = packageFile.packageFile?.split('/');\n if (packagePath.length > 0) {\n packagePath.splice(-1, 1);\n }\n if (packagePath.length > 0) {\n packageFileConfig.parentDir = packagePath.at(-1);\n packageFileConfig.packageFileDir = packagePath.join('/');\n } else {\n packageFileConfig.parentDir = '';\n packageFileConfig.packageFileDir = '';\n }\n let depIndex = 0;\n for (const dep of packageFile.deps) {\n if (dep.updates!.length) {\n const depConfig = mergeChildConfig(packageFileConfig, dep);\n // @ts-expect-error -- not easily typed\n delete depConfig.deps;\n depConfig.depIndex = depIndex; // used for autoreplace\n for (const update of dep.updates!) {\n if (\n update.updateType === 'replacement' &&\n update.newName &&\n replacementAlreadyExists(packageFile.deps, dep, update.newName)\n ) {\n logger.debug(\n { fileName: packageFile.packageFile },\n `Skipping replacement of ${dep.depName} with ${update.newName}: replacement already exists in ${packageFile.packageFile}`,\n );\n continue;\n }\n let updateConfig = mergeChildConfig(depConfig, update);\n delete updateConfig.updates;\n if (updateConfig.updateType) {\n // @ts-expect-error -- not easily typed\n updateConfig[`is${upper(updateConfig.updateType)}`] = true;\n }\n if (updateConfig.updateTypes) {\n updateConfig.updateTypes.forEach((updateType: string) => {\n // @ts-expect-error -- not easily typed\n updateConfig[`is${upper(updateType)}`] = true;\n });\n }\n // apply config from datasource\n const datasourceConfig = await getDefaultConfig(\n depConfig.datasource!,\n );\n updateConfig = mergeChildConfig(updateConfig, datasourceConfig);\n updateConfig = await applyPackageRules(\n updateConfig,\n 'datasource-merge',\n );\n // apply major/minor/patch/pin/digest\n updateConfig = mergeChildConfig(\n updateConfig,\n // @ts-expect-error -- not easily typed\n updateConfig[updateConfig.updateType],\n );\n for (const updateType of updateTypes) {\n // @ts-expect-error -- not easily typed\n delete updateConfig[updateType];\n }\n // Apply again in case any were added by the updateType config\n updateConfig = await applyPackageRules(\n updateConfig,\n 'update-type-merge',\n );\n updateConfig = applyUpdateConfig(updateConfig);\n updateConfig.baseDeps = packageFile.deps;\n update.branchName = updateConfig.branchName;\n\n // make sure that we use the dependency's current state of attestation, rather than using the new update's value\n updateConfig.hasAttestation = depConfig.hasAttestation;\n\n updates.push(updateConfig);\n }\n }\n depIndex += 1;\n }\n if (\n get(manager, 'supportsLockFileMaintenance') &&\n packageFileConfig.lockFileMaintenance!.enabled\n ) {\n // Apply lockFileMaintenance config before packageRules\n let lockFileConfig = mergeChildConfig(\n packageFileConfig,\n packageFileConfig.lockFileMaintenance!,\n );\n lockFileConfig.updateType = 'lockFileMaintenance';\n lockFileConfig.isLockFileMaintenance = true;\n lockFileConfig = await applyPackageRules(\n lockFileConfig,\n 'lock-file-maintenance-merge',\n );\n // Apply lockFileMaintenance and packageRules again\n lockFileConfig = mergeChildConfig(\n lockFileConfig,\n lockFileConfig.lockFileMaintenance!,\n );\n lockFileConfig = await applyPackageRules(\n lockFileConfig,\n 'lock-file-maintenance-merge-2',\n );\n // Remove unnecessary objects\n for (const updateType of updateTypes) {\n // @ts-expect-error -- not easily typed\n delete lockFileConfig[updateType];\n }\n delete lockFileConfig.packageRules;\n // @ts-expect-error -- not easily typed\n delete lockFileConfig.deps;\n generateBranchName(lockFileConfig);\n updates.push(lockFileConfig);\n }\n if (get(manager, 'updateLockedDependency')) {\n for (const lockFile of packageFileConfig.lockFiles ?? []) {\n const lockfileRemediations = config.remediations as Record<\n string,\n Record<string, any>[]\n >;\n const remediations = lockfileRemediations?.[lockFile];\n if (remediations) {\n for (const remediation of remediations) {\n let updateConfig = mergeChildConfig(\n packageFileConfig,\n remediation,\n );\n updateConfig = mergeChildConfig(\n updateConfig,\n config.vulnerabilityAlerts,\n );\n delete updateConfig.vulnerabilityAlerts;\n updateConfig.isVulnerabilityAlert = true;\n updateConfig.isRemediation = true;\n updateConfig.lockFile = lockFile;\n updateConfig.currentValue = updateConfig.currentVersion;\n updateConfig.newValue = updateConfig.newVersion;\n updateConfig = applyUpdateConfig(updateConfig);\n updateConfig.enabled = true;\n updates.push(updateConfig);\n }\n }\n }\n }\n }\n }\n if (config.semanticCommits === 'auto') {\n const semanticCommits = await detectSemanticCommits();\n for (const update of updates) {\n update.semanticCommits = semanticCommits;\n }\n }\n const filteredUpdates = updates\n .filter((update) => update.enabled !== false)\n .filter((update) => isUndefined(update.skipReason))\n .map(({ vulnerabilityAlerts: _, ...update }) => update)\n .map((update) => filterConfig(update, 'branch'));\n if (filteredUpdates.length < updates.length) {\n logger.debug(\n `Filtered out ${updates.length - filteredUpdates.length} disabled update(s). ${filteredUpdates.length} update(s) remaining.`,\n );\n }\n return filteredUpdates;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flatten.js","names":["template.compile"],"sources":["../../../../lib/workers/repository/updates/flatten.ts"],"sourcesContent":["import { isUndefined } from '@sindresorhus/is';\nimport {\n filterConfig,\n getManagerConfig,\n mergeChildConfig,\n} from '../../../config/index.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { getDefaultConfig } from '../../../modules/datasource/index.ts';\nimport { get } from '../../../modules/manager/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { detectSemanticCommits } from '../../../util/git/semantic.ts';\nimport { applyPackageRules } from '../../../util/package-rules/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport * as template from '../../../util/template/index.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../types.ts';\nimport { replacementAlreadyExists } from '../common.ts';\nimport { generateBranchName } from './branch-name.ts';\n\nfunction upper(str: string): string {\n return str.charAt(0).toUpperCase() + str.substring(1);\n}\n\nexport function sanitizeDepName(depName: string): string {\n return depName\n .replace('@types/', '')\n .replace('@', '')\n .replace(regEx(/\\//g), '-')\n .replace(regEx(/\\s+/g), '-')\n .replace(regEx(/:/g), '-')\n .replace(regEx(/-+/), '-')\n .toLowerCase();\n}\n\nexport function applyUpdateConfig(input: BranchUpgradeConfig): any {\n const updateConfig = { ...input };\n delete updateConfig.packageRules;\n // TODO: Remove next line once #8075 is complete\n updateConfig.depNameSanitized = updateConfig.depName\n ? sanitizeDepName(updateConfig.depName)\n : undefined;\n updateConfig.newNameSanitized = updateConfig.newName\n ? sanitizeDepName(updateConfig.newName)\n : undefined;\n if (updateConfig.sourceUrl) {\n const parsedSourceUrl = parseUrl(updateConfig.sourceUrl);\n if (parsedSourceUrl?.pathname) {\n updateConfig.sourceRepoSlug = parsedSourceUrl.pathname\n .replace(regEx(/^\\//), '') // remove leading slash\n .replace(regEx(/\\//g), '-') // change slashes to hyphens\n .replace(regEx(/-+/g), '-'); // remove multiple hyphens\n updateConfig.sourceRepo = parsedSourceUrl.pathname.replace(\n regEx(/^\\//),\n '',\n ); // remove leading slash\n updateConfig.sourceRepoOrg = updateConfig.sourceRepo.replace(\n regEx(/\\/.*/g),\n '',\n ); // remove everything after first slash\n updateConfig.sourceRepoName = updateConfig.sourceRepo.replace(\n regEx(/.*\\//g),\n '',\n ); // remove everything up to the last slash\n }\n }\n if (updateConfig.sourceDirectory) {\n updateConfig.sourceDirectory = template.compile(\n updateConfig.sourceDirectory,\n updateConfig,\n );\n }\n generateBranchName(updateConfig);\n return updateConfig;\n}\n\nexport async function flattenUpdates(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<BranchUpgradeConfig[]> {\n const updates = [];\n const updateTypes = [\n 'major',\n 'minor',\n 'patch',\n 'pin',\n 'digest',\n 'lockFileMaintenance',\n 'replacement',\n ];\n for (const [manager, files] of Object.entries(packageFiles)) {\n const managerConfig = getManagerConfig(config, manager);\n for (const packageFile of files) {\n const packageFileConfig: BranchUpgradeConfig = mergeChildConfig(\n managerConfig,\n packageFile,\n ) as never;\n const packagePath = packageFile.packageFile?.split('/');\n if (packagePath.length > 0) {\n packagePath.splice(-1, 1);\n }\n if (packagePath.length > 0) {\n packageFileConfig.parentDir = packagePath.at(-1);\n packageFileConfig.packageFileDir = packagePath.join('/');\n } else {\n packageFileConfig.parentDir = '';\n packageFileConfig.packageFileDir = '';\n }\n let depIndex = 0;\n for (const dep of packageFile.deps) {\n if (dep.updates!.length) {\n const depConfig = mergeChildConfig(packageFileConfig, dep);\n // @ts-expect-error -- not easily typed\n delete depConfig.deps;\n depConfig.depIndex = depIndex; // used for autoreplace\n for (const update of dep.updates!) {\n if (\n update.updateType === 'replacement' &&\n update.newName &&\n replacementAlreadyExists(packageFile.deps, dep, update.newName)\n ) {\n logger.debug(\n { fileName: packageFile.packageFile },\n `Skipping replacement of ${dep.depName} with ${update.newName}: replacement already exists in ${packageFile.packageFile}`,\n );\n continue;\n }\n let updateConfig = mergeChildConfig(depConfig, update);\n delete updateConfig.updates;\n if (updateConfig.updateType) {\n // @ts-expect-error -- not easily typed\n updateConfig[`is${upper(updateConfig.updateType)}`] = true;\n }\n if (updateConfig.updateTypes) {\n updateConfig.updateTypes.forEach((updateType: string) => {\n // @ts-expect-error -- not easily typed\n updateConfig[`is${upper(updateType)}`] = true;\n });\n }\n // apply config from datasource\n const datasourceConfig = await getDefaultConfig(\n depConfig.datasource!,\n );\n updateConfig = mergeChildConfig(updateConfig, datasourceConfig);\n updateConfig = await applyPackageRules(\n updateConfig,\n 'datasource-merge',\n );\n // apply major/minor/patch/pin/digest\n updateConfig = mergeChildConfig(\n updateConfig,\n // @ts-expect-error -- not easily typed\n updateConfig[updateConfig.updateType],\n );\n for (const updateType of updateTypes) {\n // @ts-expect-error -- not easily typed\n delete updateConfig[updateType];\n }\n // Apply again in case any were added by the updateType config\n updateConfig = await applyPackageRules(\n updateConfig,\n 'update-type-merge',\n );\n updateConfig = applyUpdateConfig(updateConfig);\n updateConfig.baseDeps = packageFile.deps;\n update.branchName = updateConfig.branchName;\n\n // make sure that we use the dependency's current state of attestation, rather than using the new update's value\n updateConfig.hasAttestation = depConfig.hasAttestation;\n\n updates.push(updateConfig);\n }\n }\n depIndex += 1;\n }\n if (\n get(manager, 'supportsLockFileMaintenance') &&\n packageFileConfig.lockFileMaintenance!.enabled\n ) {\n // Apply lockFileMaintenance config before packageRules\n let lockFileConfig = mergeChildConfig(\n packageFileConfig,\n packageFileConfig.lockFileMaintenance!,\n );\n lockFileConfig.updateType = 'lockFileMaintenance';\n lockFileConfig.isLockFileMaintenance = true;\n lockFileConfig = await applyPackageRules(\n lockFileConfig,\n 'lock-file-maintenance-merge',\n );\n // Apply lockFileMaintenance and packageRules again\n lockFileConfig = mergeChildConfig(\n lockFileConfig,\n lockFileConfig.lockFileMaintenance!,\n );\n lockFileConfig = await applyPackageRules(\n lockFileConfig,\n 'lock-file-maintenance-merge-2',\n );\n // Remove unnecessary objects\n for (const updateType of updateTypes) {\n // @ts-expect-error -- not easily typed\n delete lockFileConfig[updateType];\n }\n delete lockFileConfig.packageRules;\n // @ts-expect-error -- not easily typed\n delete lockFileConfig.deps;\n generateBranchName(lockFileConfig);\n updates.push(lockFileConfig);\n }\n if (get(manager, 'updateLockedDependency')) {\n for (const lockFile of packageFileConfig.lockFiles ?? []) {\n const lockfileRemediations = config.remediations as Record<\n string,\n Record<string, any>[]\n >;\n const remediations = lockfileRemediations?.[lockFile];\n if (remediations) {\n for (const remediation of remediations) {\n let updateConfig = mergeChildConfig(\n packageFileConfig,\n remediation,\n );\n updateConfig = mergeChildConfig(\n updateConfig,\n config.vulnerabilityAlerts,\n );\n delete updateConfig.vulnerabilityAlerts;\n updateConfig.isVulnerabilityAlert = true;\n updateConfig.isRemediation = true;\n updateConfig.lockFile = lockFile;\n updateConfig.currentValue = updateConfig.currentVersion;\n updateConfig.newValue = updateConfig.newVersion;\n updateConfig = applyUpdateConfig(updateConfig);\n updateConfig.enabled = true;\n updates.push(updateConfig);\n }\n }\n }\n }\n }\n }\n if (config.semanticCommits === 'auto') {\n const semanticCommits = await detectSemanticCommits();\n for (const update of updates) {\n update.semanticCommits = semanticCommits;\n }\n }\n const filteredUpdates = updates\n .filter((update) => update.enabled !== false)\n .filter((update) => isUndefined(update.skipReason))\n .map(({ vulnerabilityAlerts: _, ...update }) => update)\n .map((update) => filterConfig(update, 'branch'));\n if (filteredUpdates.length < updates.length) {\n logger.debug(\n `Filtered out ${updates.length - filteredUpdates.length} disabled update(s). ${filteredUpdates.length} update(s) remaining.`,\n );\n }\n return filteredUpdates;\n}\n"],"mappings":"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"}
@@ -21,7 +21,9 @@ function isTypesGroup(branchUpgrades) {
21
21
  return branchUpgrades.some(({ depName }) => depName?.startsWith("@types/")) && new Set(branchUpgrades.map(({ depName }) => depName?.replace(/^@types\//, ""))).size === 1;
22
22
  }
23
23
  function sortTypesGroup(upgrades) {
24
- const isTypesUpgrade = ({ depName }) => !!depName?.startsWith("@types/");
24
+ function isTypesUpgrade({ depName }) {
25
+ return !!depName?.startsWith("@types/");
26
+ }
25
27
  const regularUpgrades = upgrades.filter((upgrade) => !isTypesUpgrade(upgrade));
26
28
  const typesUpgrades = upgrades.filter(isTypesUpgrade);
27
29
  upgrades.splice(0, upgrades.length);
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","names":["template.compile","template\n .compile"],"sources":["../../../../lib/workers/repository/updates/generate.ts"],"sourcesContent":["import { isArray, isNonEmptyString, isString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { markdownTable } from 'markdown-table';\nimport semver from 'semver';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { CONFIG_SECRETS_EXPOSED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { safeStringify } from '../../../util/stringify.ts';\nimport * as template from '../../../util/template/index.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { uniq } from '../../../util/uniq.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types.ts';\nimport { CommitMessage } from '../model/commit-message.ts';\n\nfunction prettifyVersion(version: string): string {\n if (regEx(/^\\d/).test(version)) {\n return `v${version}`;\n }\n\n return version;\n}\n\nfunction isTypesGroup(branchUpgrades: BranchUpgradeConfig[]): boolean {\n return (\n branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')) &&\n new Set(\n branchUpgrades.map(({ depName }) => depName?.replace(/^@types\\//, '')),\n ).size === 1\n );\n}\n\nfunction sortTypesGroup(upgrades: BranchUpgradeConfig[]): void {\n const isTypesUpgrade = ({ depName }: BranchUpgradeConfig): boolean =>\n !!depName?.startsWith('@types/');\n const regularUpgrades = upgrades.filter(\n (upgrade) => !isTypesUpgrade(upgrade),\n );\n const typesUpgrades = upgrades.filter(isTypesUpgrade);\n upgrades.splice(0, upgrades.length);\n upgrades.push(...regularUpgrades, ...typesUpgrades);\n}\n\nfunction getTableValues(upgrade: BranchUpgradeConfig): string[] | null {\n if (!upgrade.commitBodyTable) {\n return null;\n }\n const { datasource, packageName, depName, currentVersion, newVersion } =\n upgrade;\n const name = packageName ?? depName;\n if (datasource && name && currentVersion && newVersion) {\n return [datasource, name, currentVersion, newVersion];\n }\n logger.trace(\n {\n datasource,\n packageName,\n depName,\n currentVersion,\n newVersion,\n },\n 'Cannot determine table values',\n );\n return null;\n}\n\nfunction compileCommitMessage(upgrade: BranchUpgradeConfig): string {\n if (upgrade.semanticCommits === 'enabled' && !upgrade.commitMessagePrefix) {\n logger.trace('Upgrade has semantic commits enabled');\n let semanticPrefix = upgrade.semanticCommitType;\n if (upgrade.semanticCommitScope) {\n semanticPrefix += `(${template.compile(\n upgrade.semanticCommitScope,\n upgrade,\n )})`;\n }\n upgrade.commitMessagePrefix = CommitMessage.formatPrefix(semanticPrefix!);\n upgrade.toLowerCase =\n regEx(/[A-Z]/).exec(upgrade.semanticCommitType!) === null &&\n !upgrade.semanticCommitType!.startsWith(':');\n }\n\n // Compile a few times in case there are nested templates\n upgrade.commitMessage = template.compile(\n upgrade.commitMessage ?? '',\n upgrade,\n );\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n // istanbul ignore if\n if (upgrade.commitMessage !== sanitize(upgrade.commitMessage)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets exposed in commit message',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n upgrade.commitMessage = upgrade.commitMessage.trim(); // Trim exterior whitespace\n upgrade.commitMessage = upgrade.commitMessage.replace(regEx(/\\s+/g), ' '); // Trim extra whitespace inside string\n upgrade.commitMessage = upgrade.commitMessage.replace(\n regEx(/to vv(\\d)/),\n 'to v$1',\n );\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n // We only need to lowercase the first line\n const splitMessage = upgrade.commitMessage.split(newlineRegex);\n splitMessage[0] = splitMessage[0].toLowerCase();\n upgrade.commitMessage = splitMessage.join('\\n');\n }\n\n logger.trace(`commitMessage: ${JSON.stringify(upgrade.commitMessage)}`);\n return upgrade.commitMessage;\n}\n\nfunction compilePrTitle(\n upgrade: BranchUpgradeConfig,\n commitMessage: string,\n): void {\n if (upgrade.prTitle) {\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template\n .compile(upgrade.prTitle, upgrade)\n .trim()\n .replace(regEx(/\\s+/g), ' ');\n // istanbul ignore if\n if (upgrade.prTitle !== sanitize(upgrade.prTitle)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets were exposed in PR title',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n upgrade.prTitle = upgrade.prTitle.toLowerCase();\n }\n } else {\n [upgrade.prTitle] = commitMessage.split(newlineRegex);\n }\n if (!upgrade.prTitleStrict) {\n upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : '';\n if (upgrade.isGroup) {\n const hasVersionInTitle = !!semver.coerce(\n template.compile(upgrade.commitMessageExtra ?? '', upgrade),\n );\n if (!hasVersionInTitle) {\n upgrade.prTitle +=\n upgrade.updateType === 'major' && upgrade.separateMajorMinor\n ? ' (major)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'minor' && upgrade.separateMinorPatch\n ? ' (minor)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'patch' && upgrade.separateMinorPatch\n ? ' (patch)'\n : '';\n }\n }\n }\n // Compile again to allow for nested templates\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n logger.trace(`prTitle: ${JSON.stringify(upgrade.prTitle)}`);\n}\n\nfunction getMinimumGroupSize(upgrades: BranchUpgradeConfig[]): number {\n let minimumGroupSize = 1;\n const groupSizes = new Set<number>();\n\n for (const upg of upgrades) {\n if (upg.minimumGroupSize) {\n groupSizes.add(upg.minimumGroupSize);\n if (minimumGroupSize < upg.minimumGroupSize) {\n minimumGroupSize = upg.minimumGroupSize;\n }\n }\n }\n\n if (groupSizes.size > 1) {\n logger.debug(\n 'Multiple minimumGroupSize values found for this branch, using highest.',\n );\n }\n\n return minimumGroupSize;\n}\n\n// Sorted by priority, from low to high\nconst semanticCommitTypeByPriority = ['chore', 'ci', 'build', 'fix', 'feat'];\n\nexport function generateBranchConfig(\n upgrades: BranchUpgradeConfig[],\n): BranchConfig {\n let branchUpgrades = upgrades;\n if (!branchUpgrades.every((upgrade) => upgrade.pendingChecks)) {\n // If the branch isn't pending, then remove any upgrades within which *are*\n logger.debug(\n { branch: branchUpgrades[0].branchName },\n 'Branch is not pending, removing pending upgrades',\n );\n branchUpgrades = branchUpgrades.filter((upgrade) => !upgrade.pendingChecks);\n }\n logger.trace({ config: branchUpgrades }, 'generateBranchConfig');\n let config: BranchConfig = {\n upgrades: [],\n } as any;\n const hasGroupName = branchUpgrades[0].groupName !== null;\n logger.trace(`hasGroupName: ${hasGroupName}`);\n // Use group settings only if multiple upgrades or lazy grouping is disabled\n const depNames: string[] = [];\n const newValue: string[] = [];\n const toVersions: string[] = [];\n const toValues = new Set<string>();\n const depTypes = new Set<string>();\n for (const upg of branchUpgrades) {\n upg.recreateClosed = upg.recreateWhen === 'always';\n\n if (upg.currentDigest) {\n upg.currentDigestShort =\n upg.currentDigestShort ??\n upg.currentDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.newDigest) {\n upg.newDigestShort =\n upg.newDigestShort ??\n upg.newDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.isDigest || upg.isPinDigest) {\n upg.displayFrom = upg.currentDigestShort;\n upg.displayTo = upg.newDigestShort;\n } else if (upg.isLockfileUpdate) {\n upg.displayFrom = upg.currentVersion;\n upg.displayTo = upg.newVersion;\n } else if (!upg.isLockFileMaintenance) {\n upg.displayFrom = upg.currentValue;\n upg.displayTo = upg.newValue;\n }\n\n if (upg.isLockFileMaintenance) {\n upg.recreateClosed = upg.recreateWhen !== 'never';\n }\n upg.displayFrom ??= '';\n upg.displayTo ??= '';\n if (!depNames.includes(upg.depName!)) {\n depNames.push(upg.depName!);\n }\n if (!toVersions.includes(upg.newVersion!)) {\n toVersions.push(upg.newVersion!);\n }\n toValues.add(upg.newValue!);\n if (upg.depType) {\n depTypes.add(upg.depType);\n }\n // prettify newVersion and newMajor for printing\n if (upg.newVersion) {\n upg.prettyNewVersion = prettifyVersion(upg.newVersion);\n }\n if (upg.newMajor) {\n upg.prettyNewMajor = `v${upg.newMajor}`;\n }\n if (upg.commitMessageExtra) {\n const extra = template.compile(upg.commitMessageExtra, upg);\n if (!newValue.includes(extra)) {\n newValue.push(extra);\n }\n }\n }\n const groupEligible =\n depNames.length > 1 ||\n toVersions.length > 1 ||\n (!toVersions[0] && newValue.length > 1);\n\n const typesGroup =\n depNames.length > 1 && !hasGroupName && isTypesGroup(branchUpgrades);\n logger.trace(`groupEligible: ${groupEligible}`);\n const singleUpdateGroup =\n hasGroupName && !groupEligible && !branchUpgrades[0].sharedVariableName;\n logger.trace(`singleUpdateGroup: ${singleUpdateGroup}`);\n const useGroupSettings =\n hasGroupName &&\n (groupEligible ||\n (singleUpdateGroup && branchUpgrades[0].groupSingleUpdates === true));\n logger.trace(`useGroupSettings: ${useGroupSettings}`);\n let releaseTimestamp: Timestamp;\n\n if (depTypes.size) {\n config.depTypes = Array.from(depTypes).sort();\n }\n\n for (const branchUpgrade of branchUpgrades) {\n let upgrade: BranchUpgradeConfig = { ...branchUpgrade };\n\n upgrade.depTypes = config.depTypes;\n\n // needs to be done for each upgrade, as we reorder them below\n if (newValue.length > 1 && !groupEligible) {\n upgrade.commitMessageExtra = `to v${toVersions[0]}`;\n }\n\n const pendingVersionsLength = upgrade.pendingVersions?.length;\n if (pendingVersionsLength) {\n upgrade.displayPending = `\\`${upgrade.pendingVersions!.at(-1)!}\\``;\n if (pendingVersionsLength > 1) {\n upgrade.displayPending += ` (+${pendingVersionsLength - 1})`;\n }\n } else {\n upgrade.displayPending = '';\n }\n upgrade.prettyDepType =\n upgrade.prettyDepType ?? upgrade.depType ?? 'dependency';\n if (useGroupSettings) {\n // Now overwrite original config with group config\n upgrade = mergeChildConfig(upgrade, upgrade.group);\n upgrade.isGroup = true;\n if (singleUpdateGroup) {\n // Single update using group name instead of dependency name,\n // so remove version from commit message.\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n }\n } else {\n delete upgrade.groupName;\n }\n // Delete group config regardless of whether it was applied\n delete upgrade.group;\n\n if (\n toVersions.length > 1 &&\n toValues.size > 1 &&\n newValue.length > 1 &&\n !typesGroup\n ) {\n logger.trace({ toVersions });\n logger.trace({ toValues });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (\n newValue.length > 1 &&\n (upgrade.isDigest || upgrade.isPinDigest)\n ) {\n logger.trace({ newValue });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (semver.valid(toVersions[0])) {\n upgrade.isRange = false;\n }\n config.upgrades.push(upgrade);\n if (upgrade.releaseTimestamp) {\n if (releaseTimestamp!) {\n const existingStamp = DateTime.fromISO(releaseTimestamp);\n const upgradeStamp = DateTime.fromISO(upgrade.releaseTimestamp);\n if (upgradeStamp > existingStamp) {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n } else {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n }\n }\n\n if (typesGroup) {\n if (config.upgrades[0].depName?.startsWith('@types/')) {\n logger.debug('Found @types - reversing upgrades to use depName in PR');\n sortTypesGroup(config.upgrades);\n config.upgrades[0].recreateClosed = false;\n config.hasTypes = true;\n }\n } else {\n config.upgrades.sort((a, b) => {\n if (a.fileReplacePosition && b.fileReplacePosition) {\n // This is because we need to replace from the bottom of the file up\n return a.fileReplacePosition > b.fileReplacePosition ? -1 : 1;\n }\n\n // make sure that ordering is consistent :\n // items without position will be first in the list.\n if (a.fileReplacePosition) {\n return 1;\n }\n if (b.fileReplacePosition) {\n return -1;\n }\n\n if (a.depName! < b.depName!) {\n return -1;\n }\n if (a.depName! > b.depName!) {\n return 1;\n }\n return 0;\n });\n }\n // Now assign first upgrade's config as branch config\n config = {\n ...config,\n ...config.upgrades[0],\n releaseTimestamp: releaseTimestamp!,\n }; // TODO: fixme (#9666)\n\n // Enable `semanticCommits` if one of the branches has it enabled\n if (\n config.upgrades.some((upgrade) => upgrade.semanticCommits === 'enabled')\n ) {\n config.semanticCommits = 'enabled';\n // Calculate the highest priority `semanticCommitType`\n let highestIndex = -1;\n for (const upgrade of config.upgrades) {\n if (upgrade.semanticCommits === 'enabled' && upgrade.semanticCommitType) {\n const priorityIndex = semanticCommitTypeByPriority.indexOf(\n upgrade.semanticCommitType,\n );\n\n if (priorityIndex > highestIndex) {\n highestIndex = priorityIndex;\n }\n }\n }\n\n if (highestIndex > -1) {\n config.semanticCommitType = semanticCommitTypeByPriority[highestIndex];\n }\n }\n\n // Use templates to generate strings\n const commitMessage = compileCommitMessage(config);\n compilePrTitle(config, commitMessage);\n\n config.dependencyDashboardApproval = config.upgrades.some(\n (upgrade) => upgrade.dependencyDashboardApproval,\n );\n config.dependencyDashboardPrApproval = config.upgrades.some(\n (upgrade) => upgrade.prCreation === 'approval',\n );\n config.prBodyColumns = [\n ...new Set(\n config.upgrades.reduce(\n (existing: string[], upgrade) =>\n existing.concat(upgrade.prBodyColumns!),\n [],\n ),\n ),\n ].filter(isNonEmptyString);\n // combine excludeCommitPaths for multiple manager experience\n const hasExcludeCommitPaths = config.upgrades.some(\n (u) => u.excludeCommitPaths && u.excludeCommitPaths.length > 0,\n );\n if (hasExcludeCommitPaths) {\n config.excludeCommitPaths = Object.keys(\n config.upgrades.reduce((acc: Record<string, boolean>, upgrade) => {\n if (upgrade.excludeCommitPaths) {\n upgrade.excludeCommitPaths.forEach((p) => {\n acc[p] = true;\n });\n }\n\n return acc;\n }, {}),\n );\n }\n\n config.automerge = config.upgrades.every((upgrade) => upgrade.automerge);\n // combine all labels\n config.labels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => upgrade.labels ?? [])\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n config.addLabels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => upgrade.addLabels ?? [])\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n\n if (config.upgrades.some((upgrade) => upgrade.updateType === 'major')) {\n config.updateType = 'major';\n }\n\n config.isBreaking = config.upgrades.some((upgrade) => upgrade.isBreaking);\n\n // explicit set `isLockFileMaintenance` for the branch for groups\n if (config.upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {\n config.isLockFileMaintenance = true;\n // istanbul ignore if: should never happen\n if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) {\n logger.warn(\n 'Grouping lockfile maintenance with other update types is not supported',\n );\n }\n }\n\n config.constraints = {};\n for (const upgrade of config.upgrades) {\n if (upgrade.constraints) {\n config.constraints = { ...config.constraints, ...upgrade.constraints };\n }\n }\n\n config.minimumGroupSize = getMinimumGroupSize(config.upgrades);\n // Set skipInstalls to false if any upgrade in the branch has it false\n config.skipInstalls = config.upgrades.every(\n (upgrade) => upgrade.skipInstalls !== false,\n );\n\n // Artifact updating will only be skipped if every upgrade wants to skip it.\n config.skipArtifactsUpdate = config.upgrades.every(\n (upgrade) => upgrade.skipArtifactsUpdate,\n );\n if (\n !config.skipArtifactsUpdate &&\n config.upgrades.some((upgrade) => upgrade.skipArtifactsUpdate)\n ) {\n logger.debug(\n {\n upgrades: config.upgrades.map((upgrade) => ({\n depName: upgrade.depName,\n skipArtifactsUpdate: upgrade.skipArtifactsUpdate,\n })),\n },\n 'Mixed `skipArtifactsUpdate` values in upgrades. Artifacts will be updated.',\n );\n }\n\n const tableRows = config.upgrades\n .map(getTableValues)\n .filter((x): x is string[] => isArray(x, isString));\n\n if (tableRows.length) {\n const table: string[][] = [];\n table.push(['datasource', 'package', 'from', 'to']);\n\n const seenRows = new Set<string>();\n\n for (const row of tableRows) {\n const key = safeStringify(row);\n if (seenRows.has(key)) {\n continue;\n }\n seenRows.add(key);\n table.push(row);\n }\n config.commitMessage += `\\n\\n${markdownTable(table)}\\n`;\n }\n const additionalReviewers = uniq(\n config.upgrades\n .map((upgrade) => upgrade.additionalReviewers)\n .flat()\n .filter(isNonEmptyString),\n );\n if (additionalReviewers.length > 0) {\n config.additionalReviewers = additionalReviewers;\n }\n return config;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","names":["template.compile","template\n .compile"],"sources":["../../../../lib/workers/repository/updates/generate.ts"],"sourcesContent":["import { isArray, isNonEmptyString, isString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { markdownTable } from 'markdown-table';\nimport semver from 'semver';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { CONFIG_SECRETS_EXPOSED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { safeStringify } from '../../../util/stringify.ts';\nimport * as template from '../../../util/template/index.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { uniq } from '../../../util/uniq.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types.ts';\nimport { CommitMessage } from '../model/commit-message.ts';\n\nfunction prettifyVersion(version: string): string {\n if (regEx(/^\\d/).test(version)) {\n return `v${version}`;\n }\n\n return version;\n}\n\nfunction isTypesGroup(branchUpgrades: BranchUpgradeConfig[]): boolean {\n return (\n branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')) &&\n new Set(\n branchUpgrades.map(({ depName }) => depName?.replace(/^@types\\//, '')),\n ).size === 1\n );\n}\n\nfunction sortTypesGroup(upgrades: BranchUpgradeConfig[]): void {\n function isTypesUpgrade({ depName }: BranchUpgradeConfig): boolean {\n return !!depName?.startsWith('@types/');\n }\n const regularUpgrades = upgrades.filter(\n (upgrade) => !isTypesUpgrade(upgrade),\n );\n const typesUpgrades = upgrades.filter(isTypesUpgrade);\n upgrades.splice(0, upgrades.length);\n upgrades.push(...regularUpgrades, ...typesUpgrades);\n}\n\nfunction getTableValues(upgrade: BranchUpgradeConfig): string[] | null {\n if (!upgrade.commitBodyTable) {\n return null;\n }\n const { datasource, packageName, depName, currentVersion, newVersion } =\n upgrade;\n const name = packageName ?? depName;\n if (datasource && name && currentVersion && newVersion) {\n return [datasource, name, currentVersion, newVersion];\n }\n logger.trace(\n {\n datasource,\n packageName,\n depName,\n currentVersion,\n newVersion,\n },\n 'Cannot determine table values',\n );\n return null;\n}\n\nfunction compileCommitMessage(upgrade: BranchUpgradeConfig): string {\n if (upgrade.semanticCommits === 'enabled' && !upgrade.commitMessagePrefix) {\n logger.trace('Upgrade has semantic commits enabled');\n let semanticPrefix = upgrade.semanticCommitType;\n if (upgrade.semanticCommitScope) {\n semanticPrefix += `(${template.compile(\n upgrade.semanticCommitScope,\n upgrade,\n )})`;\n }\n upgrade.commitMessagePrefix = CommitMessage.formatPrefix(semanticPrefix!);\n upgrade.toLowerCase =\n regEx(/[A-Z]/).exec(upgrade.semanticCommitType!) === null &&\n !upgrade.semanticCommitType!.startsWith(':');\n }\n\n // Compile a few times in case there are nested templates\n upgrade.commitMessage = template.compile(\n upgrade.commitMessage ?? '',\n upgrade,\n );\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n // istanbul ignore if\n if (upgrade.commitMessage !== sanitize(upgrade.commitMessage)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets exposed in commit message',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n upgrade.commitMessage = upgrade.commitMessage.trim(); // Trim exterior whitespace\n upgrade.commitMessage = upgrade.commitMessage.replace(regEx(/\\s+/g), ' '); // Trim extra whitespace inside string\n upgrade.commitMessage = upgrade.commitMessage.replace(\n regEx(/to vv(\\d)/),\n 'to v$1',\n );\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n // We only need to lowercase the first line\n const splitMessage = upgrade.commitMessage.split(newlineRegex);\n splitMessage[0] = splitMessage[0].toLowerCase();\n upgrade.commitMessage = splitMessage.join('\\n');\n }\n\n logger.trace(`commitMessage: ${JSON.stringify(upgrade.commitMessage)}`);\n return upgrade.commitMessage;\n}\n\nfunction compilePrTitle(\n upgrade: BranchUpgradeConfig,\n commitMessage: string,\n): void {\n if (upgrade.prTitle) {\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template\n .compile(upgrade.prTitle, upgrade)\n .trim()\n .replace(regEx(/\\s+/g), ' ');\n // istanbul ignore if\n if (upgrade.prTitle !== sanitize(upgrade.prTitle)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets were exposed in PR title',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n upgrade.prTitle = upgrade.prTitle.toLowerCase();\n }\n } else {\n [upgrade.prTitle] = commitMessage.split(newlineRegex);\n }\n if (!upgrade.prTitleStrict) {\n upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : '';\n if (upgrade.isGroup) {\n const hasVersionInTitle = !!semver.coerce(\n template.compile(upgrade.commitMessageExtra ?? '', upgrade),\n );\n if (!hasVersionInTitle) {\n upgrade.prTitle +=\n upgrade.updateType === 'major' && upgrade.separateMajorMinor\n ? ' (major)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'minor' && upgrade.separateMinorPatch\n ? ' (minor)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'patch' && upgrade.separateMinorPatch\n ? ' (patch)'\n : '';\n }\n }\n }\n // Compile again to allow for nested templates\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n logger.trace(`prTitle: ${JSON.stringify(upgrade.prTitle)}`);\n}\n\nfunction getMinimumGroupSize(upgrades: BranchUpgradeConfig[]): number {\n let minimumGroupSize = 1;\n const groupSizes = new Set<number>();\n\n for (const upg of upgrades) {\n if (upg.minimumGroupSize) {\n groupSizes.add(upg.minimumGroupSize);\n if (minimumGroupSize < upg.minimumGroupSize) {\n minimumGroupSize = upg.minimumGroupSize;\n }\n }\n }\n\n if (groupSizes.size > 1) {\n logger.debug(\n 'Multiple minimumGroupSize values found for this branch, using highest.',\n );\n }\n\n return minimumGroupSize;\n}\n\n// Sorted by priority, from low to high\nconst semanticCommitTypeByPriority = ['chore', 'ci', 'build', 'fix', 'feat'];\n\nexport function generateBranchConfig(\n upgrades: BranchUpgradeConfig[],\n): BranchConfig {\n let branchUpgrades = upgrades;\n if (!branchUpgrades.every((upgrade) => upgrade.pendingChecks)) {\n // If the branch isn't pending, then remove any upgrades within which *are*\n logger.debug(\n { branch: branchUpgrades[0].branchName },\n 'Branch is not pending, removing pending upgrades',\n );\n branchUpgrades = branchUpgrades.filter((upgrade) => !upgrade.pendingChecks);\n }\n logger.trace({ config: branchUpgrades }, 'generateBranchConfig');\n let config: BranchConfig = {\n upgrades: [],\n } as any;\n const hasGroupName = branchUpgrades[0].groupName !== null;\n logger.trace(`hasGroupName: ${hasGroupName}`);\n // Use group settings only if multiple upgrades or lazy grouping is disabled\n const depNames: string[] = [];\n const newValue: string[] = [];\n const toVersions: string[] = [];\n const toValues = new Set<string>();\n const depTypes = new Set<string>();\n for (const upg of branchUpgrades) {\n upg.recreateClosed = upg.recreateWhen === 'always';\n\n if (upg.currentDigest) {\n upg.currentDigestShort =\n upg.currentDigestShort ??\n upg.currentDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.newDigest) {\n upg.newDigestShort =\n upg.newDigestShort ??\n upg.newDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.isDigest || upg.isPinDigest) {\n upg.displayFrom = upg.currentDigestShort;\n upg.displayTo = upg.newDigestShort;\n } else if (upg.isLockfileUpdate) {\n upg.displayFrom = upg.currentVersion;\n upg.displayTo = upg.newVersion;\n } else if (!upg.isLockFileMaintenance) {\n upg.displayFrom = upg.currentValue;\n upg.displayTo = upg.newValue;\n }\n\n if (upg.isLockFileMaintenance) {\n upg.recreateClosed = upg.recreateWhen !== 'never';\n }\n upg.displayFrom ??= '';\n upg.displayTo ??= '';\n if (!depNames.includes(upg.depName!)) {\n depNames.push(upg.depName!);\n }\n if (!toVersions.includes(upg.newVersion!)) {\n toVersions.push(upg.newVersion!);\n }\n toValues.add(upg.newValue!);\n if (upg.depType) {\n depTypes.add(upg.depType);\n }\n // prettify newVersion and newMajor for printing\n if (upg.newVersion) {\n upg.prettyNewVersion = prettifyVersion(upg.newVersion);\n }\n if (upg.newMajor) {\n upg.prettyNewMajor = `v${upg.newMajor}`;\n }\n if (upg.commitMessageExtra) {\n const extra = template.compile(upg.commitMessageExtra, upg);\n if (!newValue.includes(extra)) {\n newValue.push(extra);\n }\n }\n }\n const groupEligible =\n depNames.length > 1 ||\n toVersions.length > 1 ||\n (!toVersions[0] && newValue.length > 1);\n\n const typesGroup =\n depNames.length > 1 && !hasGroupName && isTypesGroup(branchUpgrades);\n logger.trace(`groupEligible: ${groupEligible}`);\n const singleUpdateGroup =\n hasGroupName && !groupEligible && !branchUpgrades[0].sharedVariableName;\n logger.trace(`singleUpdateGroup: ${singleUpdateGroup}`);\n const useGroupSettings =\n hasGroupName &&\n (groupEligible ||\n (singleUpdateGroup && branchUpgrades[0].groupSingleUpdates === true));\n logger.trace(`useGroupSettings: ${useGroupSettings}`);\n let releaseTimestamp: Timestamp;\n\n if (depTypes.size) {\n config.depTypes = Array.from(depTypes).sort();\n }\n\n for (const branchUpgrade of branchUpgrades) {\n let upgrade: BranchUpgradeConfig = { ...branchUpgrade };\n\n upgrade.depTypes = config.depTypes;\n\n // needs to be done for each upgrade, as we reorder them below\n if (newValue.length > 1 && !groupEligible) {\n upgrade.commitMessageExtra = `to v${toVersions[0]}`;\n }\n\n const pendingVersionsLength = upgrade.pendingVersions?.length;\n if (pendingVersionsLength) {\n upgrade.displayPending = `\\`${upgrade.pendingVersions!.at(-1)!}\\``;\n if (pendingVersionsLength > 1) {\n upgrade.displayPending += ` (+${pendingVersionsLength - 1})`;\n }\n } else {\n upgrade.displayPending = '';\n }\n upgrade.prettyDepType =\n upgrade.prettyDepType ?? upgrade.depType ?? 'dependency';\n if (useGroupSettings) {\n // Now overwrite original config with group config\n upgrade = mergeChildConfig(upgrade, upgrade.group);\n upgrade.isGroup = true;\n if (singleUpdateGroup) {\n // Single update using group name instead of dependency name,\n // so remove version from commit message.\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n }\n } else {\n delete upgrade.groupName;\n }\n // Delete group config regardless of whether it was applied\n delete upgrade.group;\n\n if (\n toVersions.length > 1 &&\n toValues.size > 1 &&\n newValue.length > 1 &&\n !typesGroup\n ) {\n logger.trace({ toVersions });\n logger.trace({ toValues });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (\n newValue.length > 1 &&\n (upgrade.isDigest || upgrade.isPinDigest)\n ) {\n logger.trace({ newValue });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (semver.valid(toVersions[0])) {\n upgrade.isRange = false;\n }\n config.upgrades.push(upgrade);\n if (upgrade.releaseTimestamp) {\n if (releaseTimestamp!) {\n const existingStamp = DateTime.fromISO(releaseTimestamp);\n const upgradeStamp = DateTime.fromISO(upgrade.releaseTimestamp);\n if (upgradeStamp > existingStamp) {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n } else {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n }\n }\n\n if (typesGroup) {\n if (config.upgrades[0].depName?.startsWith('@types/')) {\n logger.debug('Found @types - reversing upgrades to use depName in PR');\n sortTypesGroup(config.upgrades);\n config.upgrades[0].recreateClosed = false;\n config.hasTypes = true;\n }\n } else {\n config.upgrades.sort((a, b) => {\n if (a.fileReplacePosition && b.fileReplacePosition) {\n // This is because we need to replace from the bottom of the file up\n return a.fileReplacePosition > b.fileReplacePosition ? -1 : 1;\n }\n\n // make sure that ordering is consistent :\n // items without position will be first in the list.\n if (a.fileReplacePosition) {\n return 1;\n }\n if (b.fileReplacePosition) {\n return -1;\n }\n\n if (a.depName! < b.depName!) {\n return -1;\n }\n if (a.depName! > b.depName!) {\n return 1;\n }\n return 0;\n });\n }\n // Now assign first upgrade's config as branch config\n config = {\n ...config,\n ...config.upgrades[0],\n releaseTimestamp: releaseTimestamp!,\n }; // TODO: fixme (#9666)\n\n // Enable `semanticCommits` if one of the branches has it enabled\n if (\n config.upgrades.some((upgrade) => upgrade.semanticCommits === 'enabled')\n ) {\n config.semanticCommits = 'enabled';\n // Calculate the highest priority `semanticCommitType`\n let highestIndex = -1;\n for (const upgrade of config.upgrades) {\n if (upgrade.semanticCommits === 'enabled' && upgrade.semanticCommitType) {\n const priorityIndex = semanticCommitTypeByPriority.indexOf(\n upgrade.semanticCommitType,\n );\n\n if (priorityIndex > highestIndex) {\n highestIndex = priorityIndex;\n }\n }\n }\n\n if (highestIndex > -1) {\n config.semanticCommitType = semanticCommitTypeByPriority[highestIndex];\n }\n }\n\n // Use templates to generate strings\n const commitMessage = compileCommitMessage(config);\n compilePrTitle(config, commitMessage);\n\n config.dependencyDashboardApproval = config.upgrades.some(\n (upgrade) => upgrade.dependencyDashboardApproval,\n );\n config.dependencyDashboardPrApproval = config.upgrades.some(\n (upgrade) => upgrade.prCreation === 'approval',\n );\n config.prBodyColumns = [\n ...new Set(\n config.upgrades.reduce(\n (existing: string[], upgrade) =>\n existing.concat(upgrade.prBodyColumns!),\n [],\n ),\n ),\n ].filter(isNonEmptyString);\n // combine excludeCommitPaths for multiple manager experience\n const hasExcludeCommitPaths = config.upgrades.some(\n (u) => u.excludeCommitPaths && u.excludeCommitPaths.length > 0,\n );\n if (hasExcludeCommitPaths) {\n config.excludeCommitPaths = Object.keys(\n config.upgrades.reduce((acc: Record<string, boolean>, upgrade) => {\n if (upgrade.excludeCommitPaths) {\n upgrade.excludeCommitPaths.forEach((p) => {\n acc[p] = true;\n });\n }\n\n return acc;\n }, {}),\n );\n }\n\n config.automerge = config.upgrades.every((upgrade) => upgrade.automerge);\n // combine all labels\n config.labels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => upgrade.labels ?? [])\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n config.addLabels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => upgrade.addLabels ?? [])\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n\n if (config.upgrades.some((upgrade) => upgrade.updateType === 'major')) {\n config.updateType = 'major';\n }\n\n config.isBreaking = config.upgrades.some((upgrade) => upgrade.isBreaking);\n\n // explicit set `isLockFileMaintenance` for the branch for groups\n if (config.upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {\n config.isLockFileMaintenance = true;\n // istanbul ignore if: should never happen\n if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) {\n logger.warn(\n 'Grouping lockfile maintenance with other update types is not supported',\n );\n }\n }\n\n config.constraints = {};\n for (const upgrade of config.upgrades) {\n if (upgrade.constraints) {\n config.constraints = { ...config.constraints, ...upgrade.constraints };\n }\n }\n\n config.minimumGroupSize = getMinimumGroupSize(config.upgrades);\n // Set skipInstalls to false if any upgrade in the branch has it false\n config.skipInstalls = config.upgrades.every(\n (upgrade) => upgrade.skipInstalls !== false,\n );\n\n // Artifact updating will only be skipped if every upgrade wants to skip it.\n config.skipArtifactsUpdate = config.upgrades.every(\n (upgrade) => upgrade.skipArtifactsUpdate,\n );\n if (\n !config.skipArtifactsUpdate &&\n config.upgrades.some((upgrade) => upgrade.skipArtifactsUpdate)\n ) {\n logger.debug(\n {\n upgrades: config.upgrades.map((upgrade) => ({\n depName: upgrade.depName,\n skipArtifactsUpdate: upgrade.skipArtifactsUpdate,\n })),\n },\n 'Mixed `skipArtifactsUpdate` values in upgrades. Artifacts will be updated.',\n );\n }\n\n const tableRows = config.upgrades\n .map(getTableValues)\n .filter((x): x is string[] => isArray(x, isString));\n\n if (tableRows.length) {\n const table: string[][] = [];\n table.push(['datasource', 'package', 'from', 'to']);\n\n const seenRows = new Set<string>();\n\n for (const row of tableRows) {\n const key = safeStringify(row);\n if (seenRows.has(key)) {\n continue;\n }\n seenRows.add(key);\n table.push(row);\n }\n config.commitMessage += `\\n\\n${markdownTable(table)}\\n`;\n }\n const additionalReviewers = uniq(\n config.upgrades\n .map((upgrade) => upgrade.additionalReviewers)\n .flat()\n .filter(isNonEmptyString),\n );\n if (additionalReviewers.length > 0) {\n config.additionalReviewers = additionalReviewers;\n }\n return config;\n}\n"],"mappings":"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"}