renovate 43.264.2 → 43.265.0

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 (55) hide show
  1. package/dist/config-validator.js.map +1 -1
  2. package/dist/modules/datasource/bitrise/index.js +1 -1
  3. package/dist/modules/datasource/bitrise/index.js.map +1 -1
  4. package/dist/modules/datasource/custom/index.js +8 -2
  5. package/dist/modules/datasource/custom/index.js.map +1 -1
  6. package/dist/modules/datasource/postprocess-release.js +4 -1
  7. package/dist/modules/datasource/postprocess-release.js.map +1 -1
  8. package/dist/modules/manager/bazel-module/lockfile.js +1 -1
  9. package/dist/modules/manager/bazel-module/lockfile.js.map +1 -1
  10. package/dist/modules/manager/deno/artifacts.js +5 -1
  11. package/dist/modules/manager/deno/artifacts.js.map +1 -1
  12. package/dist/modules/manager/deno/post.js +1 -1
  13. package/dist/modules/manager/deno/post.js.map +1 -1
  14. package/dist/modules/manager/fingerprint.generated.js +2 -2
  15. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  16. package/dist/modules/manager/gradle/artifacts.js +1 -1
  17. package/dist/modules/manager/gradle/artifacts.js.map +1 -1
  18. package/dist/modules/manager/mise/artifacts.js +4 -1
  19. package/dist/modules/manager/mise/artifacts.js.map +1 -1
  20. package/dist/modules/platform/azure/issue.js +4 -1
  21. package/dist/modules/platform/azure/issue.js.map +1 -1
  22. package/dist/modules/platform/bitbucket/index.js +4 -1
  23. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  24. package/dist/modules/platform/codecommit/index.js +2 -2
  25. package/dist/modules/platform/codecommit/index.js.map +1 -1
  26. package/dist/modules/platform/gitlab/http.js +1 -1
  27. package/dist/modules/platform/gitlab/http.js.map +1 -1
  28. package/dist/modules/platform/scm-manager/index.js +5 -2
  29. package/dist/modules/platform/scm-manager/index.js.map +1 -1
  30. package/dist/util/emoji.js +2 -2
  31. package/dist/util/emoji.js.map +1 -1
  32. package/dist/util/http/github.js +2 -2
  33. package/dist/util/http/github.js.map +1 -1
  34. package/dist/util/interpolator.js +4 -1
  35. package/dist/util/interpolator.js.map +1 -1
  36. package/dist/workers/global/config/parse/additional-config-file.js +1 -1
  37. package/dist/workers/global/config/parse/additional-config-file.js.map +1 -1
  38. package/dist/workers/global/config/parse/env.js +4 -1
  39. package/dist/workers/global/config/parse/env.js.map +1 -1
  40. package/dist/workers/global/config/parse/file.js +1 -1
  41. package/dist/workers/global/config/parse/file.js.map +1 -1
  42. package/dist/workers/repository/error.js +3 -3
  43. package/dist/workers/repository/error.js.map +1 -1
  44. package/dist/workers/repository/process/extract-update.js +2 -2
  45. package/dist/workers/repository/process/extract-update.js.map +1 -1
  46. package/dist/workers/repository/update/branch/bump-versions.js +5 -1
  47. package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
  48. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +1 -1
  49. package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
  50. package/dist/workers/repository/update/branch/get-updated.js +3 -3
  51. package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
  52. package/dist/workers/repository/updates/branch-name.js +1 -1
  53. package/dist/workers/repository/updates/branch-name.js.map +1 -1
  54. package/package.json +1 -1
  55. package/renovate-schema.json +2 -2
@@ -112,8 +112,11 @@ async function getPr(number) {
112
112
  const result = await getRepoPr(config.repository, number);
113
113
  logger.debug("Returning PR from API");
114
114
  return mapPrFromScmToRenovate(result);
115
- } catch (error) {
116
- logger.error({ error }, `Can not find a PR with id ${number}`);
115
+ } catch (err) {
116
+ logger.error({
117
+ err,
118
+ number
119
+ }, "Can not find a PR with the given id");
117
120
  return null;
118
121
  }
119
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["git.initRepo"],"sources":["../../../../lib/modules/platform/scm-manager/index.ts"],"sourcesContent":["import { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { getBaseUrl, setBaseUrl } from '../../../util/http/scm-manager.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfigByContent,\n EnsureCommentRemovalConfigByTopic,\n EnsureIssueConfig,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport { mapPrFromScmToRenovate } from './mapper.ts';\nimport {\n createScmPr,\n getAllRepoPrs,\n getAllRepos,\n getCurrentUser,\n getDefaultBranch,\n getRepo,\n getRepoPr,\n updateScmPr,\n} from './scm-manager-helper.ts';\nimport { getRepoUrl, mapPrState, matchPrState, smartLinks } from './utils.ts';\n\ninterface SCMMRepoConfig {\n repository: string;\n prList: Pr[] | null;\n defaultBranch: string;\n ignorePrAuthor: boolean;\n}\n\nexport const id = 'scm-manager';\nexport const experimental = true;\n\nlet config: SCMMRepoConfig = {} as any;\n\nexport async function initPlatform({\n endpoint,\n token,\n}: PlatformParams): Promise<PlatformResult> {\n if (!endpoint) {\n throw new Error('Init: SCM-Manager endpoint not configured');\n }\n\n if (!token) {\n throw new Error('Init: SCM-Manager API token not configured');\n }\n\n const baseUrl = `${ensureTrailingSlash(endpoint)}api/v2`;\n setBaseUrl(baseUrl);\n\n try {\n const me = await getCurrentUser(token);\n const gitAuthor = `${me.displayName} <${me.mail}>`;\n const result = { endpoint: baseUrl, gitAuthor };\n\n logger.debug({ result }, 'Platform result');\n\n return result;\n } catch (err) {\n logger.debug(\n { err },\n 'Init: Error authenticating with SCM-Manager. Check your token',\n );\n throw new Error('Init: Authentication failure');\n }\n}\n\nexport async function initRepo({\n repository,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n const repo = await getRepo(repository);\n const defaultBranch = await getDefaultBranch(repo);\n const url = getRepoUrl(repo, gitUrl, getBaseUrl());\n\n config = {} as any;\n config.repository = repository;\n config.defaultBranch = defaultBranch;\n config.ignorePrAuthor = GlobalConfig.get('ignorePrAuthor');\n\n await git.initRepo({\n ...config,\n url,\n });\n\n // Reset cached resources\n invalidatePrCache();\n\n const result = {\n defaultBranch: config.defaultBranch,\n isFork: false,\n repoFingerprint: repoFingerprint(config.repository, getBaseUrl()),\n };\n\n logger.debug({ result }, `Repo initialized`);\n\n return result;\n}\n\nexport async function getRepos(): Promise<string[]> {\n const repos = (await getAllRepos()).filter((repo) => repo.type === 'git');\n return repos.map((repo) => `${repo.namespace}/${repo.name}`);\n}\n\nexport async function getBranchPr(branchName: string): Promise<Pr | null> {\n return await findPr({ branchName, state: 'open' });\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n}: FindPRConfig): Promise<Pr | null> {\n const inProgressPrs = await getPrList();\n const result = inProgressPrs.find(\n (pr) =>\n branchName === pr.sourceBranch &&\n (!prTitle || prTitle === pr.title) &&\n matchPrState(pr, state),\n );\n\n if (result) {\n logger.debug({ result }, `Found PR`);\n return result;\n }\n\n logger.debug(\n `Could not find PR with source branch ${branchName} and title ${\n prTitle ?? ''\n } and state ${state}`,\n );\n\n return null;\n}\n\nexport async function getPr(number: number): Promise<Pr | null> {\n const inProgressPrs = await getPrList();\n const cachedPr = inProgressPrs.find((pr) => pr.number === number);\n\n if (cachedPr) {\n logger.debug('Returning from cached PRs');\n return cachedPr;\n }\n\n try {\n const result = await getRepoPr(config.repository, number);\n logger.debug('Returning PR from API');\n return mapPrFromScmToRenovate(result);\n } catch (error) {\n logger.error({ error }, `Can not find a PR with id ${number}`);\n return null;\n }\n}\n\nexport async function getPrList(): Promise<Pr[]> {\n if (config.prList === null) {\n try {\n config.prList = (\n await getAllRepoPrs(config.repository, config.ignorePrAuthor)\n ).map((pr) => mapPrFromScmToRenovate(pr));\n } catch (error) {\n logger.error(error);\n }\n }\n\n return config.prList ?? [];\n}\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle,\n prBody,\n draftPR,\n}: CreatePRConfig): Promise<Pr> {\n const createdPr = await createScmPr(config.repository, {\n source: sourceBranch,\n target: targetBranch,\n title: prTitle,\n description: sanitize(prBody),\n status: draftPR ? 'DRAFT' : 'OPEN',\n });\n\n logger.debug(\n `PR created with title '${createdPr.title}' from source '${createdPr.source}' to target '${createdPr.target}'`,\n );\n\n return mapPrFromScmToRenovate(createdPr);\n}\n\nexport async function updatePr({\n number,\n prTitle,\n prBody,\n state,\n targetBranch,\n}: UpdatePrConfig): Promise<void> {\n await updateScmPr(config.repository, number, {\n title: prTitle,\n description: sanitize(prBody) ?? undefined,\n target: targetBranch,\n status: mapPrState(state),\n });\n\n logger.debug(`Updated PR #${number} with title ${prTitle}`);\n}\n\nexport function mergePr(_config: MergePRConfig): Promise<boolean> {\n logger.debug('Not implemented mergePr');\n return Promise.resolve(false);\n}\n\nexport function getBranchStatus(\n _branchName: string,\n _internalChecksAsSuccess: boolean,\n): Promise<BranchStatus> {\n logger.debug('Not implemented getBranchStatus');\n return Promise.resolve('red');\n}\n\nexport function setBranchStatus(\n _branchStatusConfig: BranchStatusConfig,\n): Promise<void> {\n logger.debug('Not implemented setBranchStatus');\n return Promise.resolve();\n}\n\nexport function getBranchStatusCheck(\n _branchName: string,\n _context: string | null | undefined,\n): Promise<BranchStatus | null> {\n logger.debug('Not implemented setBranchStatus');\n return Promise.resolve(null);\n}\n\nexport function addReviewers(\n _number: number,\n _reviewers: string[],\n): Promise<void> {\n logger.debug('Not implemented addReviewers');\n return Promise.resolve();\n}\n\nexport function addAssignees(\n _number: number,\n _assignees: string[],\n): Promise<void> {\n logger.debug('Not implemented addAssignees');\n return Promise.resolve();\n}\n\nexport function deleteLabel(_number: number, _label: string): Promise<void> {\n logger.debug('Not implemented deleteLabel');\n return Promise.resolve();\n}\n\nexport function getIssueList(): Promise<Issue[]> {\n logger.debug('Not implemented getIssueList');\n return Promise.resolve([]);\n}\n\nexport function findIssue(_title: string): Promise<Issue | null> {\n logger.debug('Not implemented findIssue');\n return Promise.resolve(null);\n}\n\nexport function ensureIssue(\n _config: EnsureIssueConfig,\n): Promise<'updated' | 'created' | null> {\n logger.debug('Not implemented ensureIssue');\n return Promise.resolve(null);\n}\n\nexport function ensureIssueClosing(_title: string): Promise<void> {\n logger.debug('Not implemented ensureIssueClosing');\n return Promise.resolve();\n}\n\nexport function ensureComment(_config: EnsureCommentConfig): Promise<boolean> {\n logger.debug('Not implemented ensureComment');\n return Promise.resolve(false);\n}\n\nexport function ensureCommentRemoval(\n _ensureCommentRemoval:\n | EnsureCommentRemovalConfigByTopic\n | EnsureCommentRemovalConfigByContent,\n): Promise<void> {\n logger.debug('Not implemented ensureCommentRemoval');\n return Promise.resolve();\n}\n\nexport function massageMarkdown(prBody: string): string {\n return smartTruncate(smartLinks(prBody), maxBodyLength());\n}\n\nexport function getRepoForceRebase(): Promise<boolean> {\n return Promise.resolve(false);\n}\n\nexport function getRawFile(\n _fileName: string,\n _repoName?: string,\n _branchOrTag?: string,\n): Promise<string | null> {\n logger.debug('Not implemented getRawFile');\n return Promise.resolve(null);\n}\n\nexport function getJsonFile(\n _fileName: string,\n _repoName?: string,\n _branchOrTag?: string,\n): Promise<any> {\n logger.debug('Not implemented getJsonFile');\n return Promise.resolve(null);\n}\n\nexport function maxBodyLength(): number {\n return 200000;\n}\n\nexport function invalidatePrCache(): void {\n config.prList = null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["git.initRepo"],"sources":["../../../../lib/modules/platform/scm-manager/index.ts"],"sourcesContent":["import { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { getBaseUrl, setBaseUrl } from '../../../util/http/scm-manager.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfigByContent,\n EnsureCommentRemovalConfigByTopic,\n EnsureIssueConfig,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport { mapPrFromScmToRenovate } from './mapper.ts';\nimport {\n createScmPr,\n getAllRepoPrs,\n getAllRepos,\n getCurrentUser,\n getDefaultBranch,\n getRepo,\n getRepoPr,\n updateScmPr,\n} from './scm-manager-helper.ts';\nimport { getRepoUrl, mapPrState, matchPrState, smartLinks } from './utils.ts';\n\ninterface SCMMRepoConfig {\n repository: string;\n prList: Pr[] | null;\n defaultBranch: string;\n ignorePrAuthor: boolean;\n}\n\nexport const id = 'scm-manager';\nexport const experimental = true;\n\nlet config: SCMMRepoConfig = {} as any;\n\nexport async function initPlatform({\n endpoint,\n token,\n}: PlatformParams): Promise<PlatformResult> {\n if (!endpoint) {\n throw new Error('Init: SCM-Manager endpoint not configured');\n }\n\n if (!token) {\n throw new Error('Init: SCM-Manager API token not configured');\n }\n\n const baseUrl = `${ensureTrailingSlash(endpoint)}api/v2`;\n setBaseUrl(baseUrl);\n\n try {\n const me = await getCurrentUser(token);\n const gitAuthor = `${me.displayName} <${me.mail}>`;\n const result = { endpoint: baseUrl, gitAuthor };\n\n logger.debug({ result }, 'Platform result');\n\n return result;\n } catch (err) {\n logger.debug(\n { err },\n 'Init: Error authenticating with SCM-Manager. Check your token',\n );\n throw new Error('Init: Authentication failure');\n }\n}\n\nexport async function initRepo({\n repository,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n const repo = await getRepo(repository);\n const defaultBranch = await getDefaultBranch(repo);\n const url = getRepoUrl(repo, gitUrl, getBaseUrl());\n\n config = {} as any;\n config.repository = repository;\n config.defaultBranch = defaultBranch;\n config.ignorePrAuthor = GlobalConfig.get('ignorePrAuthor');\n\n await git.initRepo({\n ...config,\n url,\n });\n\n // Reset cached resources\n invalidatePrCache();\n\n const result = {\n defaultBranch: config.defaultBranch,\n isFork: false,\n repoFingerprint: repoFingerprint(config.repository, getBaseUrl()),\n };\n\n logger.debug({ result }, `Repo initialized`);\n\n return result;\n}\n\nexport async function getRepos(): Promise<string[]> {\n const repos = (await getAllRepos()).filter((repo) => repo.type === 'git');\n return repos.map((repo) => `${repo.namespace}/${repo.name}`);\n}\n\nexport async function getBranchPr(branchName: string): Promise<Pr | null> {\n return await findPr({ branchName, state: 'open' });\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n}: FindPRConfig): Promise<Pr | null> {\n const inProgressPrs = await getPrList();\n const result = inProgressPrs.find(\n (pr) =>\n branchName === pr.sourceBranch &&\n (!prTitle || prTitle === pr.title) &&\n matchPrState(pr, state),\n );\n\n if (result) {\n logger.debug({ result }, `Found PR`);\n return result;\n }\n\n logger.debug(\n `Could not find PR with source branch ${branchName} and title ${\n prTitle ?? ''\n } and state ${state}`,\n );\n\n return null;\n}\n\nexport async function getPr(number: number): Promise<Pr | null> {\n const inProgressPrs = await getPrList();\n const cachedPr = inProgressPrs.find((pr) => pr.number === number);\n\n if (cachedPr) {\n logger.debug('Returning from cached PRs');\n return cachedPr;\n }\n\n try {\n const result = await getRepoPr(config.repository, number);\n logger.debug('Returning PR from API');\n return mapPrFromScmToRenovate(result);\n } catch (err) {\n logger.error({ err, number }, 'Can not find a PR with the given id');\n return null;\n }\n}\n\nexport async function getPrList(): Promise<Pr[]> {\n if (config.prList === null) {\n try {\n config.prList = (\n await getAllRepoPrs(config.repository, config.ignorePrAuthor)\n ).map((pr) => mapPrFromScmToRenovate(pr));\n } catch (error) {\n logger.error(error);\n }\n }\n\n return config.prList ?? [];\n}\n\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle,\n prBody,\n draftPR,\n}: CreatePRConfig): Promise<Pr> {\n const createdPr = await createScmPr(config.repository, {\n source: sourceBranch,\n target: targetBranch,\n title: prTitle,\n description: sanitize(prBody),\n status: draftPR ? 'DRAFT' : 'OPEN',\n });\n\n logger.debug(\n `PR created with title '${createdPr.title}' from source '${createdPr.source}' to target '${createdPr.target}'`,\n );\n\n return mapPrFromScmToRenovate(createdPr);\n}\n\nexport async function updatePr({\n number,\n prTitle,\n prBody,\n state,\n targetBranch,\n}: UpdatePrConfig): Promise<void> {\n await updateScmPr(config.repository, number, {\n title: prTitle,\n description: sanitize(prBody) ?? undefined,\n target: targetBranch,\n status: mapPrState(state),\n });\n\n logger.debug(`Updated PR #${number} with title ${prTitle}`);\n}\n\nexport function mergePr(_config: MergePRConfig): Promise<boolean> {\n logger.debug('Not implemented mergePr');\n return Promise.resolve(false);\n}\n\nexport function getBranchStatus(\n _branchName: string,\n _internalChecksAsSuccess: boolean,\n): Promise<BranchStatus> {\n logger.debug('Not implemented getBranchStatus');\n return Promise.resolve('red');\n}\n\nexport function setBranchStatus(\n _branchStatusConfig: BranchStatusConfig,\n): Promise<void> {\n logger.debug('Not implemented setBranchStatus');\n return Promise.resolve();\n}\n\nexport function getBranchStatusCheck(\n _branchName: string,\n _context: string | null | undefined,\n): Promise<BranchStatus | null> {\n logger.debug('Not implemented setBranchStatus');\n return Promise.resolve(null);\n}\n\nexport function addReviewers(\n _number: number,\n _reviewers: string[],\n): Promise<void> {\n logger.debug('Not implemented addReviewers');\n return Promise.resolve();\n}\n\nexport function addAssignees(\n _number: number,\n _assignees: string[],\n): Promise<void> {\n logger.debug('Not implemented addAssignees');\n return Promise.resolve();\n}\n\nexport function deleteLabel(_number: number, _label: string): Promise<void> {\n logger.debug('Not implemented deleteLabel');\n return Promise.resolve();\n}\n\nexport function getIssueList(): Promise<Issue[]> {\n logger.debug('Not implemented getIssueList');\n return Promise.resolve([]);\n}\n\nexport function findIssue(_title: string): Promise<Issue | null> {\n logger.debug('Not implemented findIssue');\n return Promise.resolve(null);\n}\n\nexport function ensureIssue(\n _config: EnsureIssueConfig,\n): Promise<'updated' | 'created' | null> {\n logger.debug('Not implemented ensureIssue');\n return Promise.resolve(null);\n}\n\nexport function ensureIssueClosing(_title: string): Promise<void> {\n logger.debug('Not implemented ensureIssueClosing');\n return Promise.resolve();\n}\n\nexport function ensureComment(_config: EnsureCommentConfig): Promise<boolean> {\n logger.debug('Not implemented ensureComment');\n return Promise.resolve(false);\n}\n\nexport function ensureCommentRemoval(\n _ensureCommentRemoval:\n | EnsureCommentRemovalConfigByTopic\n | EnsureCommentRemovalConfigByContent,\n): Promise<void> {\n logger.debug('Not implemented ensureCommentRemoval');\n return Promise.resolve();\n}\n\nexport function massageMarkdown(prBody: string): string {\n return smartTruncate(smartLinks(prBody), maxBodyLength());\n}\n\nexport function getRepoForceRebase(): Promise<boolean> {\n return Promise.resolve(false);\n}\n\nexport function getRawFile(\n _fileName: string,\n _repoName?: string,\n _branchOrTag?: string,\n): Promise<string | null> {\n logger.debug('Not implemented getRawFile');\n return Promise.resolve(null);\n}\n\nexport function getJsonFile(\n _fileName: string,\n _repoName?: string,\n _branchOrTag?: string,\n): Promise<any> {\n logger.debug('Not implemented getJsonFile');\n return Promise.resolve(null);\n}\n\nexport function maxBodyLength(): number {\n return 200000;\n}\n\nexport function invalidatePrCache(): void {\n config.prList = null;\n}\n"],"mappings":"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"}
@@ -36,8 +36,8 @@ function lazyInitMappings() {
36
36
  mappingsInitialized = true;
37
37
  }).onError(
38
38
  /* istanbul ignore next */
39
- (error) => {
40
- logger.warn({ error }, "Unable to parse emoji shortcodes");
39
+ (err) => {
40
+ logger.warn({ err }, "Unable to parse emoji shortcodes");
41
41
  }
42
42
  );
43
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"emoji.js","names":["dataFiles"],"sources":["../../lib/util/emoji.ts"],"sourcesContent":["import mathiasBynensEmojiRegex from 'emoji-regex';\nimport {\n fromCodepointToUnicode,\n fromHexcodeToCodepoint,\n fromUnicodeToHexcode,\n} from 'emojibase';\nimport emojibaseEmojiRegex from 'emojibase-regex/emoji.js';\nimport SHORTCODE_REGEX from 'emojibase-regex/shortcode.js';\nimport { z } from 'zod/v4';\nimport type { RenovateConfig } from '../config/types.ts';\nimport dataFiles from '../data-files.generated.ts';\nimport { logger } from '../logger/index.ts';\nimport { regEx } from './regex.ts';\nimport { Result } from './result.ts';\nimport { Json } from './schema-utils/index.ts';\nimport { coerceString } from './string.ts';\n\nlet unicodeEmoji = true;\n\nlet mappingsInitialized = false;\nconst shortCodesByHex = new Map<string, string>();\nconst hexCodesByShort = new Map<string, string>();\n\nconst EmojiShortcodes = Json.pipe(\n z.record(\n z.string(),\n z.union([z.string().transform((val) => [val]), z.array(z.string())]),\n ),\n);\ntype EmojiShortcodes = z.infer<typeof EmojiShortcodes>;\n\nconst patchedEmojis: EmojiShortcodes = {\n '26A0-FE0F': ['warning'], // Colorful warning (⚠️) instead of black and white (⚠)\n '2139-FE0F': ['information_source'], // Colorful info (ℹ️) instead of black and white (ℹ)\n};\n\nfunction initMapping(mapping: EmojiShortcodes): void {\n for (const [hex, shortcodes] of Object.entries(mapping)) {\n const mainShortcode = `:${shortcodes[0]}:`;\n\n shortCodesByHex.set(hex, mainShortcode);\n shortCodesByHex.set(stripHexCode(hex), mainShortcode);\n\n for (const shortcode of shortcodes) {\n hexCodesByShort.set(`:${shortcode}:`, hex);\n }\n }\n}\n\nfunction lazyInitMappings(): void {\n if (!mappingsInitialized) {\n const githubShortcodes = dataFiles.get(\n 'node_modules/emojibase-data/en/shortcodes/github.json',\n );\n\n Result.parse(githubShortcodes, EmojiShortcodes)\n .onValue((data) => {\n initMapping(data);\n initMapping(patchedEmojis);\n mappingsInitialized = true;\n })\n .onError(\n /* istanbul ignore next */\n (error) => {\n logger.warn({ error }, 'Unable to parse emoji shortcodes');\n },\n );\n }\n}\n\nexport function setEmojiConfig(config: RenovateConfig): void {\n unicodeEmoji = !!config.unicodeEmoji;\n}\n\nconst shortCodeRegex = regEx(\n (SHORTCODE_REGEX as unknown as RegExp).source,\n 'g',\n);\n\nexport function emojify(text: string): string {\n if (!unicodeEmoji) {\n return text;\n }\n lazyInitMappings();\n return text.replace(shortCodeRegex, (shortCode) => {\n const hexCode = hexCodesByShort.get(shortCode);\n return hexCode\n ? fromCodepointToUnicode(fromHexcodeToCodepoint(hexCode))\n : shortCode;\n });\n}\n\nconst emojiRegexSrc = [emojibaseEmojiRegex, mathiasBynensEmojiRegex()].map(\n (r) => (r as RegExp).source,\n);\nconst emojiRegex = new RegExp(`(?:${emojiRegexSrc.join('|')})`, 'g'); // TODO #12875 cannot figure it out\nconst excludedModifiers = new Set([\n '20E3',\n '200D',\n 'FE0E',\n 'FE0F',\n '1F3FB',\n '1F3FC',\n '1F3FD',\n '1F3FE',\n '1F3FF',\n '1F9B0',\n '1F9B1',\n '1F9B2',\n '1F9B3',\n]);\n\nexport function stripHexCode(input: string): string {\n return input\n .split('-')\n .filter((modifier) => !excludedModifiers.has(modifier))\n .join('-');\n}\n\nexport function unemojify(text: string): string {\n if (unicodeEmoji) {\n return text;\n }\n lazyInitMappings();\n return text.replace(emojiRegex, (emoji) => {\n const hexCode = stripHexCode(fromUnicodeToHexcode(emoji));\n const shortCode = shortCodesByHex.get(hexCode);\n return coerceString(shortCode, '�');\n });\n}\n\nfunction stripEmoji(emoji: string): string {\n const hexCode = stripHexCode(fromUnicodeToHexcode(emoji));\n // `hexCode` could be empty if `emoji` is a modifier character that isn't\n // modifying anything\n if (hexCode) {\n const codePoint = fromHexcodeToCodepoint(hexCode);\n return fromCodepointToUnicode(codePoint);\n }\n return '';\n}\n\nexport function stripEmojis(input: string): string {\n return input.replace(emojiRegex, stripEmoji);\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAI,eAAe;AAEnB,IAAI,sBAAsB;AAC1B,MAAM,kCAAkB,IAAI,IAAoB;AAChD,MAAM,kCAAkB,IAAI,IAAoB;AAEhD,MAAM,kBAAkB,KAAK,KAC3B,EAAE,OACA,EAAE,OAAO,GACT,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CACrE,CACF;AAGA,MAAM,gBAAiC;CACrC,aAAa,CAAC,SAAS;CACvB,aAAa,CAAC,oBAAoB;AACpC;AAEA,SAAS,YAAY,SAAgC;CACnD,KAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,OAAO,GAAG;EACvD,MAAM,gBAAgB,IAAI,WAAW,GAAG;EAExC,gBAAgB,IAAI,KAAK,aAAa;EACtC,gBAAgB,IAAI,aAAa,GAAG,GAAG,aAAa;EAEpD,KAAK,MAAM,aAAa,YACtB,gBAAgB,IAAI,IAAI,UAAU,IAAI,GAAG;CAE7C;AACF;AAEA,SAAS,mBAAyB;CAChC,IAAI,CAAC,qBAAqB;EACxB,MAAM,mBAAmBA,KAAU,IACjC,uDACF;EAEA,OAAO,MAAM,kBAAkB,eAAe,CAAC,CAC5C,SAAS,SAAS;GACjB,YAAY,IAAI;GAChB,YAAY,aAAa;GACzB,sBAAsB;EACxB,CAAC,CAAC,CACD;;IAEE,UAAU;IACT,OAAO,KAAK,EAAE,MAAM,GAAG,kCAAkC;GAC3D;EACF;CACJ;AACF;AAEA,SAAgB,eAAe,QAA8B;CAC3D,eAAe,CAAC,CAAC,OAAO;AAC1B;AAEA,MAAM,iBAAiB,MACpB,gBAAsC,QACvC,GACF;AAEA,SAAgB,QAAQ,MAAsB;CAC5C,IAAI,CAAC,cACH,OAAO;CAET,iBAAiB;CACjB,OAAO,KAAK,QAAQ,iBAAiB,cAAc;EACjD,MAAM,UAAU,gBAAgB,IAAI,SAAS;EAC7C,OAAO,UACH,uBAAuB,uBAAuB,OAAO,CAAC,IACtD;CACN,CAAC;AACH;AAEA,MAAM,gBAAgB,CAAC,qBAAqB,wBAAwB,CAAC,CAAC,CAAC,KACpE,MAAO,EAAa,MACvB;AACA,MAAM,aAAa,IAAI,OAAO,MAAM,cAAc,KAAK,GAAG,EAAE,IAAI,GAAG;AACnE,MAAM,oCAAoB,IAAI,IAAI;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,aAAa,OAAuB;CAClD,OAAO,MACJ,MAAM,GAAG,CAAC,CACV,QAAQ,aAAa,CAAC,kBAAkB,IAAI,QAAQ,CAAC,CAAC,CACtD,KAAK,GAAG;AACb;AAEA,SAAgB,UAAU,MAAsB;CAC9C,IAAI,cACF,OAAO;CAET,iBAAiB;CACjB,OAAO,KAAK,QAAQ,aAAa,UAAU;EACzC,MAAM,UAAU,aAAa,qBAAqB,KAAK,CAAC;EAExD,OAAO,aADW,gBAAgB,IAAI,OACV,GAAG,GAAG;CACpC,CAAC;AACH;AAEA,SAAS,WAAW,OAAuB;CACzC,MAAM,UAAU,aAAa,qBAAqB,KAAK,CAAC;CAGxD,IAAI,SAEF,OAAO,uBADW,uBAAuB,OACH,CAAC;CAEzC,OAAO;AACT;AAEA,SAAgB,YAAY,OAAuB;CACjD,OAAO,MAAM,QAAQ,YAAY,UAAU;AAC7C"}
1
+ {"version":3,"file":"emoji.js","names":["dataFiles"],"sources":["../../lib/util/emoji.ts"],"sourcesContent":["import mathiasBynensEmojiRegex from 'emoji-regex';\nimport {\n fromCodepointToUnicode,\n fromHexcodeToCodepoint,\n fromUnicodeToHexcode,\n} from 'emojibase';\nimport emojibaseEmojiRegex from 'emojibase-regex/emoji.js';\nimport SHORTCODE_REGEX from 'emojibase-regex/shortcode.js';\nimport { z } from 'zod/v4';\nimport type { RenovateConfig } from '../config/types.ts';\nimport dataFiles from '../data-files.generated.ts';\nimport { logger } from '../logger/index.ts';\nimport { regEx } from './regex.ts';\nimport { Result } from './result.ts';\nimport { Json } from './schema-utils/index.ts';\nimport { coerceString } from './string.ts';\n\nlet unicodeEmoji = true;\n\nlet mappingsInitialized = false;\nconst shortCodesByHex = new Map<string, string>();\nconst hexCodesByShort = new Map<string, string>();\n\nconst EmojiShortcodes = Json.pipe(\n z.record(\n z.string(),\n z.union([z.string().transform((val) => [val]), z.array(z.string())]),\n ),\n);\ntype EmojiShortcodes = z.infer<typeof EmojiShortcodes>;\n\nconst patchedEmojis: EmojiShortcodes = {\n '26A0-FE0F': ['warning'], // Colorful warning (⚠️) instead of black and white (⚠)\n '2139-FE0F': ['information_source'], // Colorful info (ℹ️) instead of black and white (ℹ)\n};\n\nfunction initMapping(mapping: EmojiShortcodes): void {\n for (const [hex, shortcodes] of Object.entries(mapping)) {\n const mainShortcode = `:${shortcodes[0]}:`;\n\n shortCodesByHex.set(hex, mainShortcode);\n shortCodesByHex.set(stripHexCode(hex), mainShortcode);\n\n for (const shortcode of shortcodes) {\n hexCodesByShort.set(`:${shortcode}:`, hex);\n }\n }\n}\n\nfunction lazyInitMappings(): void {\n if (!mappingsInitialized) {\n const githubShortcodes = dataFiles.get(\n 'node_modules/emojibase-data/en/shortcodes/github.json',\n );\n\n Result.parse(githubShortcodes, EmojiShortcodes)\n .onValue((data) => {\n initMapping(data);\n initMapping(patchedEmojis);\n mappingsInitialized = true;\n })\n .onError(\n /* istanbul ignore next */\n (err) => {\n logger.warn({ err }, 'Unable to parse emoji shortcodes');\n },\n );\n }\n}\n\nexport function setEmojiConfig(config: RenovateConfig): void {\n unicodeEmoji = !!config.unicodeEmoji;\n}\n\nconst shortCodeRegex = regEx(\n (SHORTCODE_REGEX as unknown as RegExp).source,\n 'g',\n);\n\nexport function emojify(text: string): string {\n if (!unicodeEmoji) {\n return text;\n }\n lazyInitMappings();\n return text.replace(shortCodeRegex, (shortCode) => {\n const hexCode = hexCodesByShort.get(shortCode);\n return hexCode\n ? fromCodepointToUnicode(fromHexcodeToCodepoint(hexCode))\n : shortCode;\n });\n}\n\nconst emojiRegexSrc = [emojibaseEmojiRegex, mathiasBynensEmojiRegex()].map(\n (r) => (r as RegExp).source,\n);\nconst emojiRegex = new RegExp(`(?:${emojiRegexSrc.join('|')})`, 'g'); // TODO #12875 cannot figure it out\nconst excludedModifiers = new Set([\n '20E3',\n '200D',\n 'FE0E',\n 'FE0F',\n '1F3FB',\n '1F3FC',\n '1F3FD',\n '1F3FE',\n '1F3FF',\n '1F9B0',\n '1F9B1',\n '1F9B2',\n '1F9B3',\n]);\n\nexport function stripHexCode(input: string): string {\n return input\n .split('-')\n .filter((modifier) => !excludedModifiers.has(modifier))\n .join('-');\n}\n\nexport function unemojify(text: string): string {\n if (unicodeEmoji) {\n return text;\n }\n lazyInitMappings();\n return text.replace(emojiRegex, (emoji) => {\n const hexCode = stripHexCode(fromUnicodeToHexcode(emoji));\n const shortCode = shortCodesByHex.get(hexCode);\n return coerceString(shortCode, '�');\n });\n}\n\nfunction stripEmoji(emoji: string): string {\n const hexCode = stripHexCode(fromUnicodeToHexcode(emoji));\n // `hexCode` could be empty if `emoji` is a modifier character that isn't\n // modifying anything\n if (hexCode) {\n const codePoint = fromHexcodeToCodepoint(hexCode);\n return fromCodepointToUnicode(codePoint);\n }\n return '';\n}\n\nexport function stripEmojis(input: string): string {\n return input.replace(emojiRegex, stripEmoji);\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,IAAI,eAAe;AAEnB,IAAI,sBAAsB;AAC1B,MAAM,kCAAkB,IAAI,IAAoB;AAChD,MAAM,kCAAkB,IAAI,IAAoB;AAEhD,MAAM,kBAAkB,KAAK,KAC3B,EAAE,OACA,EAAE,OAAO,GACT,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,WAAW,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CACrE,CACF;AAGA,MAAM,gBAAiC;CACrC,aAAa,CAAC,SAAS;CACvB,aAAa,CAAC,oBAAoB;AACpC;AAEA,SAAS,YAAY,SAAgC;CACnD,KAAK,MAAM,CAAC,KAAK,eAAe,OAAO,QAAQ,OAAO,GAAG;EACvD,MAAM,gBAAgB,IAAI,WAAW,GAAG;EAExC,gBAAgB,IAAI,KAAK,aAAa;EACtC,gBAAgB,IAAI,aAAa,GAAG,GAAG,aAAa;EAEpD,KAAK,MAAM,aAAa,YACtB,gBAAgB,IAAI,IAAI,UAAU,IAAI,GAAG;CAE7C;AACF;AAEA,SAAS,mBAAyB;CAChC,IAAI,CAAC,qBAAqB;EACxB,MAAM,mBAAmBA,KAAU,IACjC,uDACF;EAEA,OAAO,MAAM,kBAAkB,eAAe,CAAC,CAC5C,SAAS,SAAS;GACjB,YAAY,IAAI;GAChB,YAAY,aAAa;GACzB,sBAAsB;EACxB,CAAC,CAAC,CACD;;IAEE,QAAQ;IACP,OAAO,KAAK,EAAE,IAAI,GAAG,kCAAkC;GACzD;EACF;CACJ;AACF;AAEA,SAAgB,eAAe,QAA8B;CAC3D,eAAe,CAAC,CAAC,OAAO;AAC1B;AAEA,MAAM,iBAAiB,MACpB,gBAAsC,QACvC,GACF;AAEA,SAAgB,QAAQ,MAAsB;CAC5C,IAAI,CAAC,cACH,OAAO;CAET,iBAAiB;CACjB,OAAO,KAAK,QAAQ,iBAAiB,cAAc;EACjD,MAAM,UAAU,gBAAgB,IAAI,SAAS;EAC7C,OAAO,UACH,uBAAuB,uBAAuB,OAAO,CAAC,IACtD;CACN,CAAC;AACH;AAEA,MAAM,gBAAgB,CAAC,qBAAqB,wBAAwB,CAAC,CAAC,CAAC,KACpE,MAAO,EAAa,MACvB;AACA,MAAM,aAAa,IAAI,OAAO,MAAM,cAAc,KAAK,GAAG,EAAE,IAAI,GAAG;AACnE,MAAM,oCAAoB,IAAI,IAAI;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,aAAa,OAAuB;CAClD,OAAO,MACJ,MAAM,GAAG,CAAC,CACV,QAAQ,aAAa,CAAC,kBAAkB,IAAI,QAAQ,CAAC,CAAC,CACtD,KAAK,GAAG;AACb;AAEA,SAAgB,UAAU,MAAsB;CAC9C,IAAI,cACF,OAAO;CAET,iBAAiB;CACjB,OAAO,KAAK,QAAQ,aAAa,UAAU;EACzC,MAAM,UAAU,aAAa,qBAAqB,KAAK,CAAC;EAExD,OAAO,aADW,gBAAgB,IAAI,OACV,GAAG,GAAG;CACpC,CAAC;AACH;AAEA,SAAS,WAAW,OAAuB;CACzC,MAAM,UAAU,aAAa,qBAAqB,KAAK,CAAC;CAGxD,IAAI,SAEF,OAAO,uBADW,uBAAuB,OACH,CAAC;CAEzC,OAAO;AACT;AAEA,SAAgB,YAAY,OAAuB;CACjD,OAAO,MAAM,QAAQ,YAAY,UAAU;AAC7C"}
@@ -65,8 +65,8 @@ function handleGotError(err, url, opts) {
65
65
  const parsed = parseUrl(baseUrl);
66
66
  const rule = find({ url: baseUrl });
67
67
  if (rule.token || rule.password) logger.once.warn("Rate limit exceeded for api.github.com, even though we are authenticated");
68
- else if (parsed?.hostname === "api.github.com") logger.once.warn({ documentationUrl: `${GlobalConfig.get("productLinks").documentation}getting-started/running/#githubcom-token-for-changelogs-and-tools` }, `Rate limit exceeded for ${parsed.host}, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN`);
69
- else logger.once.warn(`Rate limit exceeded for ${parsed.host}, as no hostRules set for this host`);
68
+ else if (parsed?.hostname === "api.github.com") logger.once.warn({ documentationUrl: `${GlobalConfig.get("productLinks").documentation}getting-started/running/#githubcom-token-for-changelogs-and-tools` }, "Rate limit exceeded for api.github.com, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN");
69
+ else logger.once.warn({ host: parsed.host }, "Rate limit exceeded, as no hostRules set for this host");
70
70
  return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);
71
71
  }
72
72
  if (err.statusCode === 403 && message.startsWith("Resource not accessible by integration")) {
@@ -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 ${parsed.host}, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN`,\n );\n } else {\n logger.once.warn(\n `Rate limit exceeded for ${parsed!.host}, 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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"}
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":"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"}
@@ -13,7 +13,10 @@ function validateInterpolatedValues(input, options) {
13
13
  }
14
14
  else validationErrors.push(`Config ${name}s must be a plain object. Found: ${typeof input}`);
15
15
  if (validationErrors.length) {
16
- logger.error({ validationErrors }, `Invalid ${name}s configured`);
16
+ logger.error({
17
+ name,
18
+ validationErrors
19
+ }, "Invalid interpolated values configured");
17
20
  throw new Error(name === "secrets" ? CONFIG_SECRETS_INVALID : CONFIG_VARIABLES_INVALID);
18
21
  }
19
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interpolator.js","names":[],"sources":["../../lib/util/interpolator.ts"],"sourcesContent":["import { isArray, isPlainObject, isString } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../config/types.ts';\nimport {\n CONFIG_SECRETS_INVALID,\n CONFIG_VALIDATION,\n CONFIG_VARIABLES_INVALID,\n} from '../constants/error-messages.ts';\nimport { logger } from '../logger/index.ts';\nimport { capitalize } from './string.ts';\n\nexport interface InterpolatorOptions {\n name: 'secrets' | 'variables';\n templateRegex: RegExp;\n nameRegex: RegExp;\n}\n\nexport function validateInterpolatedValues(\n input: unknown,\n options: InterpolatorOptions,\n): void {\n if (!input) {\n return;\n }\n\n const { name, nameRegex } = options;\n\n const validationErrors: string[] = [];\n if (isPlainObject(input)) {\n for (const [key, value] of Object.entries(input)) {\n if (!nameRegex.test(key)) {\n validationErrors.push(`Invalid ${name} name \"${key}\"`);\n }\n if (!isString(value)) {\n validationErrors.push(\n `${capitalize(name)} values must be strings. Found type ${typeof value} for ${name} ${key}`,\n );\n }\n }\n } else {\n validationErrors.push(\n `Config ${name}s must be a plain object. Found: ${typeof input}`,\n );\n }\n\n if (validationErrors.length) {\n logger.error({ validationErrors }, `Invalid ${name}s configured`);\n throw new Error(\n name === 'secrets' ? CONFIG_SECRETS_INVALID : CONFIG_VARIABLES_INVALID,\n );\n }\n}\n\nfunction replaceInterpolatedValuesInString(\n key: string,\n value: string,\n input: Record<string, string>,\n options: InterpolatorOptions,\n): string {\n const { name, templateRegex } = options;\n // Reset regex lastIndex for global regexes to ensure consistent behavior\n templateRegex.lastIndex = 0;\n\n // do nothing if no interpolator template found\n if (!templateRegex.test(value)) {\n return value;\n }\n\n const disallowedPrefixes = ['branch', 'commit', 'group', 'pr', 'semantic'];\n if (disallowedPrefixes.some((prefix) => key.startsWith(prefix))) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'config';\n error.validationError = `Disallowed ${name} substitution`;\n error.validationMessage = `The field \\`${key}\\` may not use ${name} substitution`;\n throw error;\n }\n return value.replace(templateRegex, (_, key) => {\n if (input?.[key]) {\n return input[key];\n }\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'config';\n error.validationError = `Unknown ${name} name`;\n error.validationMessage = `The following ${name} name was not found in config: ${String(\n key,\n )}`;\n throw error;\n });\n}\n\nexport function replaceInterpolatedValuesInObject(\n config_: RenovateConfig,\n input: Record<string, string>,\n options: InterpolatorOptions,\n deleteValues = true,\n): RenovateConfig {\n const config = { ...config_ };\n const { name } = options;\n if (deleteValues) {\n delete config[name];\n }\n for (const [key, value] of Object.entries(config)) {\n if (isPlainObject(value) && key !== 'onboardingConfig') {\n // @ts-expect-error -- type can't be narrowed\n config[key] = replaceInterpolatedValuesInObject(\n value,\n input,\n options,\n deleteValues,\n );\n }\n if (isString(value)) {\n // @ts-expect-error -- type can't be narrowed\n config[key] = replaceInterpolatedValuesInString(\n key,\n value,\n input,\n options,\n );\n }\n if (isArray(value)) {\n for (const [arrayIndex, arrayItem] of value.entries()) {\n // v8 ignore else -- TODO: add test #40625\n if (isPlainObject(arrayItem)) {\n value[arrayIndex] = replaceInterpolatedValuesInObject(\n arrayItem,\n input,\n options,\n deleteValues,\n );\n } else if (isString(arrayItem)) {\n value[arrayIndex] = replaceInterpolatedValuesInString(\n key,\n arrayItem,\n input,\n options,\n );\n }\n }\n }\n }\n return config;\n}\n"],"mappings":";;;;;AAgBA,SAAgB,2BACd,OACA,SACM;CACN,IAAI,CAAC,OACH;CAGF,MAAM,EAAE,MAAM,cAAc;CAE5B,MAAM,mBAA6B,CAAC;CACpC,IAAI,cAAc,KAAK,GACrB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,CAAC,UAAU,KAAK,GAAG,GACrB,iBAAiB,KAAK,WAAW,KAAK,SAAS,IAAI,EAAE;EAEvD,IAAI,CAAC,SAAS,KAAK,GACjB,iBAAiB,KACf,GAAG,WAAW,IAAI,EAAE,sCAAsC,OAAO,MAAM,OAAO,KAAK,GAAG,KACxF;CAEJ;MAEA,iBAAiB,KACf,UAAU,KAAK,mCAAmC,OAAO,OAC3D;CAGF,IAAI,iBAAiB,QAAQ;EAC3B,OAAO,MAAM,EAAE,iBAAiB,GAAG,WAAW,KAAK,aAAa;EAChE,MAAM,IAAI,MACR,SAAS,YAAY,yBAAyB,wBAChD;CACF;AACF;AAEA,SAAS,kCACP,KACA,OACA,OACA,SACQ;CACR,MAAM,EAAE,MAAM,kBAAkB;CAEhC,cAAc,YAAY;CAG1B,IAAI,CAAC,cAAc,KAAK,KAAK,GAC3B,OAAO;CAIT,IAAI;EADwB;EAAU;EAAU;EAAS;EAAM;CAC1C,CAAC,CAAC,MAAM,WAAW,IAAI,WAAW,MAAM,CAAC,GAAG;EAC/D,MAAM,QAAQ,IAAI,MAAM,iBAAiB;EACzC,MAAM,mBAAmB;EACzB,MAAM,kBAAkB,cAAc,KAAK;EAC3C,MAAM,oBAAoB,eAAe,IAAI,iBAAiB,KAAK;EACnE,MAAM;CACR;CACA,OAAO,MAAM,QAAQ,gBAAgB,GAAG,QAAQ;EAC9C,IAAI,QAAQ,MACV,OAAO,MAAM;EAEf,MAAM,QAAQ,IAAI,MAAM,iBAAiB;EACzC,MAAM,mBAAmB;EACzB,MAAM,kBAAkB,WAAW,KAAK;EACxC,MAAM,oBAAoB,iBAAiB,KAAK,iCAAiC,OAC/E,GACF;EACA,MAAM;CACR,CAAC;AACH;AAEA,SAAgB,kCACd,SACA,OACA,SACA,eAAe,MACC;CAChB,MAAM,SAAS,EAAE,GAAG,QAAQ;CAC5B,MAAM,EAAE,SAAS;CACjB,IAAI,cACF,OAAO,OAAO;CAEhB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;EACjD,IAAI,cAAc,KAAK,KAAK,QAAQ,oBAElC,OAAO,OAAO,kCACZ,OACA,OACA,SACA,YACF;EAEF,IAAI,SAAS,KAAK,GAEhB,OAAO,OAAO,kCACZ,KACA,OACA,OACA,OACF;EAEF,IAAI,QAAQ,KAAK;QACV,MAAM,CAAC,YAAY,cAAc,MAAM,QAAQ;;GAElD,IAAI,cAAc,SAAS,GACzB,MAAM,cAAc,kCAClB,WACA,OACA,SACA,YACF;QACK,IAAI,SAAS,SAAS,GAC3B,MAAM,cAAc,kCAClB,KACA,WACA,OACA,OACF;EAAA;CAIR;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"interpolator.js","names":[],"sources":["../../lib/util/interpolator.ts"],"sourcesContent":["import { isArray, isPlainObject, isString } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../config/types.ts';\nimport {\n CONFIG_SECRETS_INVALID,\n CONFIG_VALIDATION,\n CONFIG_VARIABLES_INVALID,\n} from '../constants/error-messages.ts';\nimport { logger } from '../logger/index.ts';\nimport { capitalize } from './string.ts';\n\nexport interface InterpolatorOptions {\n name: 'secrets' | 'variables';\n templateRegex: RegExp;\n nameRegex: RegExp;\n}\n\nexport function validateInterpolatedValues(\n input: unknown,\n options: InterpolatorOptions,\n): void {\n if (!input) {\n return;\n }\n\n const { name, nameRegex } = options;\n\n const validationErrors: string[] = [];\n if (isPlainObject(input)) {\n for (const [key, value] of Object.entries(input)) {\n if (!nameRegex.test(key)) {\n validationErrors.push(`Invalid ${name} name \"${key}\"`);\n }\n if (!isString(value)) {\n validationErrors.push(\n `${capitalize(name)} values must be strings. Found type ${typeof value} for ${name} ${key}`,\n );\n }\n }\n } else {\n validationErrors.push(\n `Config ${name}s must be a plain object. Found: ${typeof input}`,\n );\n }\n\n if (validationErrors.length) {\n logger.error(\n { name, validationErrors },\n 'Invalid interpolated values configured',\n );\n throw new Error(\n name === 'secrets' ? CONFIG_SECRETS_INVALID : CONFIG_VARIABLES_INVALID,\n );\n }\n}\n\nfunction replaceInterpolatedValuesInString(\n key: string,\n value: string,\n input: Record<string, string>,\n options: InterpolatorOptions,\n): string {\n const { name, templateRegex } = options;\n // Reset regex lastIndex for global regexes to ensure consistent behavior\n templateRegex.lastIndex = 0;\n\n // do nothing if no interpolator template found\n if (!templateRegex.test(value)) {\n return value;\n }\n\n const disallowedPrefixes = ['branch', 'commit', 'group', 'pr', 'semantic'];\n if (disallowedPrefixes.some((prefix) => key.startsWith(prefix))) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'config';\n error.validationError = `Disallowed ${name} substitution`;\n error.validationMessage = `The field \\`${key}\\` may not use ${name} substitution`;\n throw error;\n }\n return value.replace(templateRegex, (_, key) => {\n if (input?.[key]) {\n return input[key];\n }\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'config';\n error.validationError = `Unknown ${name} name`;\n error.validationMessage = `The following ${name} name was not found in config: ${String(\n key,\n )}`;\n throw error;\n });\n}\n\nexport function replaceInterpolatedValuesInObject(\n config_: RenovateConfig,\n input: Record<string, string>,\n options: InterpolatorOptions,\n deleteValues = true,\n): RenovateConfig {\n const config = { ...config_ };\n const { name } = options;\n if (deleteValues) {\n delete config[name];\n }\n for (const [key, value] of Object.entries(config)) {\n if (isPlainObject(value) && key !== 'onboardingConfig') {\n // @ts-expect-error -- type can't be narrowed\n config[key] = replaceInterpolatedValuesInObject(\n value,\n input,\n options,\n deleteValues,\n );\n }\n if (isString(value)) {\n // @ts-expect-error -- type can't be narrowed\n config[key] = replaceInterpolatedValuesInString(\n key,\n value,\n input,\n options,\n );\n }\n if (isArray(value)) {\n for (const [arrayIndex, arrayItem] of value.entries()) {\n // v8 ignore else -- TODO: add test #40625\n if (isPlainObject(arrayItem)) {\n value[arrayIndex] = replaceInterpolatedValuesInObject(\n arrayItem,\n input,\n options,\n deleteValues,\n );\n } else if (isString(arrayItem)) {\n value[arrayIndex] = replaceInterpolatedValuesInString(\n key,\n arrayItem,\n input,\n options,\n );\n }\n }\n }\n }\n return config;\n}\n"],"mappings":";;;;;AAgBA,SAAgB,2BACd,OACA,SACM;CACN,IAAI,CAAC,OACH;CAGF,MAAM,EAAE,MAAM,cAAc;CAE5B,MAAM,mBAA6B,CAAC;CACpC,IAAI,cAAc,KAAK,GACrB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,IAAI,CAAC,UAAU,KAAK,GAAG,GACrB,iBAAiB,KAAK,WAAW,KAAK,SAAS,IAAI,EAAE;EAEvD,IAAI,CAAC,SAAS,KAAK,GACjB,iBAAiB,KACf,GAAG,WAAW,IAAI,EAAE,sCAAsC,OAAO,MAAM,OAAO,KAAK,GAAG,KACxF;CAEJ;MAEA,iBAAiB,KACf,UAAU,KAAK,mCAAmC,OAAO,OAC3D;CAGF,IAAI,iBAAiB,QAAQ;EAC3B,OAAO,MACL;GAAE;GAAM;EAAiB,GACzB,wCACF;EACA,MAAM,IAAI,MACR,SAAS,YAAY,yBAAyB,wBAChD;CACF;AACF;AAEA,SAAS,kCACP,KACA,OACA,OACA,SACQ;CACR,MAAM,EAAE,MAAM,kBAAkB;CAEhC,cAAc,YAAY;CAG1B,IAAI,CAAC,cAAc,KAAK,KAAK,GAC3B,OAAO;CAIT,IAAI;EADwB;EAAU;EAAU;EAAS;EAAM;CAC1C,CAAC,CAAC,MAAM,WAAW,IAAI,WAAW,MAAM,CAAC,GAAG;EAC/D,MAAM,QAAQ,IAAI,MAAM,iBAAiB;EACzC,MAAM,mBAAmB;EACzB,MAAM,kBAAkB,cAAc,KAAK;EAC3C,MAAM,oBAAoB,eAAe,IAAI,iBAAiB,KAAK;EACnE,MAAM;CACR;CACA,OAAO,MAAM,QAAQ,gBAAgB,GAAG,QAAQ;EAC9C,IAAI,QAAQ,MACV,OAAO,MAAM;EAEf,MAAM,QAAQ,IAAI,MAAM,iBAAiB;EACzC,MAAM,mBAAmB;EACzB,MAAM,kBAAkB,WAAW,KAAK;EACxC,MAAM,oBAAoB,iBAAiB,KAAK,iCAAiC,OAC/E,GACF;EACA,MAAM;CACR,CAAC;AACH;AAEA,SAAgB,kCACd,SACA,OACA,SACA,eAAe,MACC;CAChB,MAAM,SAAS,EAAE,GAAG,QAAQ;CAC5B,MAAM,EAAE,SAAS;CACjB,IAAI,cACF,OAAO,OAAO;CAEhB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;EACjD,IAAI,cAAc,KAAK,KAAK,QAAQ,oBAElC,OAAO,OAAO,kCACZ,OACA,OACA,SACA,YACF;EAEF,IAAI,SAAS,KAAK,GAEhB,OAAO,OAAO,kCACZ,KACA,OACA,OACA,OACF;EAEF,IAAI,QAAQ,KAAK;QACV,MAAM,CAAC,YAAY,cAAc,MAAM,QAAQ;;GAElD,IAAI,cAAc,SAAS,GACzB,MAAM,cAAc,kCAClB,WACA,OACA,SACA,YACF;QACK,IAAI,SAAS,SAAS,GAC3B,MAAM,cAAc,kCAClB,KACA,WACA,OACA,OACF;EAAA;CAIR;CACA,OAAO;AACT"}
@@ -22,7 +22,7 @@ async function getConfig(env) {
22
22
  logger.fatal({ error: err.stack }, "Could not parse additional config file");
23
23
  process.exit(1);
24
24
  } else if (err instanceof ReferenceError) {
25
- logger.fatal(`Error parsing additional config file due to unresolved variable(s): ${err.message}`);
25
+ logger.fatal({ err }, "Error parsing additional config file due to unresolved variable(s)");
26
26
  process.exit(1);
27
27
  } else if (err.message === "Unsupported file type") {
28
28
  logger.fatal(err.message);
@@ -1 +1 @@
1
- {"version":3,"file":"additional-config-file.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/additional-config-file.ts"],"sourcesContent":["import {\n isEmptyStringOrWhitespace,\n isNonEmptyObject,\n isNonEmptyString,\n isUndefined,\n} from '@sindresorhus/is';\nimport fs from 'fs-extra';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { getParsedContent, migrateAndValidateConfig } from './util.ts';\n\nexport async function getConfig(env: NodeJS.ProcessEnv): Promise<AllConfig> {\n let config: AllConfig = {};\n const configFile = env.RENOVATE_ADDITIONAL_CONFIG_FILE;\n if (!configFile) {\n logger.debug('No additional config file found specified - skipping');\n return config;\n }\n\n const configFileExists = await fs.pathExists(configFile);\n if (!configFileExists) {\n // Unsure what behavior is expected here\n logger.fatal(\n { configFile },\n `Custom additional config file specified in RENOVATE_ADDITIONAL_CONFIG_FILE must exist`,\n );\n process.exit(1);\n }\n\n logger.debug(`Checking for additional config file in ${configFile}`);\n try {\n config = await getParsedContent(configFile);\n } catch (err) {\n if (err instanceof SyntaxError || err instanceof TypeError) {\n // Unsure what behavior is expected here\n logger.fatal(\n { error: err.stack },\n 'Could not parse additional config file',\n );\n process.exit(1);\n } else if (err instanceof ReferenceError) {\n // Unsure what behavior is expected here\n logger.fatal(\n `Error parsing additional config file due to unresolved variable(s): ${err.message}`,\n );\n process.exit(1);\n } else if (err.message === 'Unsupported file type') {\n logger.fatal(err.message);\n process.exit(1);\n } else if (env.RENOVATE_ADDITIONAL_CONFIG_FILE) {\n logger.debug({ err }, 'Parse error');\n logger.fatal('Error parsing additional config file');\n process.exit(1);\n }\n logger.debug('Error reading or parsing additional config file - skipping');\n }\n\n if (isNonEmptyObject(config.processEnv)) {\n const exportedKeys = [];\n for (const [key, value] of Object.entries(config.processEnv)) {\n if (!isNonEmptyString(value)) {\n logger.error({ key }, 'processEnv value is not a string.');\n continue;\n }\n\n exportedKeys.push(key);\n process.env[key] = value;\n }\n logger.debug(\n { keys: exportedKeys },\n 'processEnv keys were exported to env',\n );\n delete config.processEnv;\n }\n\n return migrateAndValidateConfig(config, configFile);\n}\n\nexport async function deleteNonDefaultConfig(\n env: NodeJS.ProcessEnv,\n deleteConfigFile: boolean,\n): Promise<void> {\n const configFile = env.RENOVATE_ADDITIONAL_CONFIG_FILE;\n\n if (isUndefined(configFile) || isEmptyStringOrWhitespace(configFile)) {\n return;\n }\n\n if (!deleteConfigFile) {\n return;\n }\n\n if (!(await fs.pathExists(configFile))) {\n return;\n }\n\n try {\n await fs.remove(configFile);\n logger.trace(\n { path: configFile },\n 'Additional config file successfully deleted',\n );\n } catch (err) {\n logger.warn({ err }, 'Error deleting additional config file');\n }\n}\n"],"mappings":";;;;;AAWA,eAAsB,UAAU,KAA4C;CAC1E,IAAI,SAAoB,CAAC;CACzB,MAAM,aAAa,IAAI;CACvB,IAAI,CAAC,YAAY;EACf,OAAO,MAAM,sDAAsD;EACnE,OAAO;CACT;CAGA,IAAI,CAAC,MAD0B,GAAG,WAAW,UAAU,GAChC;EAErB,OAAO,MACL,EAAE,WAAW,GACb,uFACF;EACA,QAAQ,KAAK,CAAC;CAChB;CAEA,OAAO,MAAM,0CAA0C,YAAY;CACnE,IAAI;EACF,SAAS,MAAM,iBAAiB,UAAU;CAC5C,SAAS,KAAK;EACZ,IAAI,eAAe,eAAe,eAAe,WAAW;GAE1D,OAAO,MACL,EAAE,OAAO,IAAI,MAAM,GACnB,wCACF;GACA,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,eAAe,gBAAgB;GAExC,OAAO,MACL,uEAAuE,IAAI,SAC7E;GACA,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,IAAI,YAAY,yBAAyB;GAClD,OAAO,MAAM,IAAI,OAAO;GACxB,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,IAAI,iCAAiC;GAC9C,OAAO,MAAM,EAAE,IAAI,GAAG,aAAa;GACnC,OAAO,MAAM,sCAAsC;GACnD,QAAQ,KAAK,CAAC;EAChB;EACA,OAAO,MAAM,4DAA4D;CAC3E;CAEA,IAAI,iBAAiB,OAAO,UAAU,GAAG;EACvC,MAAM,eAAe,CAAC;EACtB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,UAAU,GAAG;GAC5D,IAAI,CAAC,iBAAiB,KAAK,GAAG;IAC5B,OAAO,MAAM,EAAE,IAAI,GAAG,mCAAmC;IACzD;GACF;GAEA,aAAa,KAAK,GAAG;GACrB,QAAQ,IAAI,OAAO;EACrB;EACA,OAAO,MACL,EAAE,MAAM,aAAa,GACrB,sCACF;EACA,OAAO,OAAO;CAChB;CAEA,OAAO,yBAAyB,QAAQ,UAAU;AACpD;AAEA,eAAsB,uBACpB,KACA,kBACe;CACf,MAAM,aAAa,IAAI;CAEvB,IAAI,YAAY,UAAU,KAAK,0BAA0B,UAAU,GACjE;CAGF,IAAI,CAAC,kBACH;CAGF,IAAI,CAAE,MAAM,GAAG,WAAW,UAAU,GAClC;CAGF,IAAI;EACF,MAAM,GAAG,OAAO,UAAU;EAC1B,OAAO,MACL,EAAE,MAAM,WAAW,GACnB,6CACF;CACF,SAAS,KAAK;EACZ,OAAO,KAAK,EAAE,IAAI,GAAG,uCAAuC;CAC9D;AACF"}
1
+ {"version":3,"file":"additional-config-file.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/additional-config-file.ts"],"sourcesContent":["import {\n isEmptyStringOrWhitespace,\n isNonEmptyObject,\n isNonEmptyString,\n isUndefined,\n} from '@sindresorhus/is';\nimport fs from 'fs-extra';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { getParsedContent, migrateAndValidateConfig } from './util.ts';\n\nexport async function getConfig(env: NodeJS.ProcessEnv): Promise<AllConfig> {\n let config: AllConfig = {};\n const configFile = env.RENOVATE_ADDITIONAL_CONFIG_FILE;\n if (!configFile) {\n logger.debug('No additional config file found specified - skipping');\n return config;\n }\n\n const configFileExists = await fs.pathExists(configFile);\n if (!configFileExists) {\n // Unsure what behavior is expected here\n logger.fatal(\n { configFile },\n `Custom additional config file specified in RENOVATE_ADDITIONAL_CONFIG_FILE must exist`,\n );\n process.exit(1);\n }\n\n logger.debug(`Checking for additional config file in ${configFile}`);\n try {\n config = await getParsedContent(configFile);\n } catch (err) {\n if (err instanceof SyntaxError || err instanceof TypeError) {\n // Unsure what behavior is expected here\n logger.fatal(\n { error: err.stack },\n 'Could not parse additional config file',\n );\n process.exit(1);\n } else if (err instanceof ReferenceError) {\n // Unsure what behavior is expected here\n logger.fatal(\n { err },\n 'Error parsing additional config file due to unresolved variable(s)',\n );\n process.exit(1);\n } else if (err.message === 'Unsupported file type') {\n logger.fatal(err.message);\n process.exit(1);\n } else if (env.RENOVATE_ADDITIONAL_CONFIG_FILE) {\n logger.debug({ err }, 'Parse error');\n logger.fatal('Error parsing additional config file');\n process.exit(1);\n }\n logger.debug('Error reading or parsing additional config file - skipping');\n }\n\n if (isNonEmptyObject(config.processEnv)) {\n const exportedKeys = [];\n for (const [key, value] of Object.entries(config.processEnv)) {\n if (!isNonEmptyString(value)) {\n logger.error({ key }, 'processEnv value is not a string.');\n continue;\n }\n\n exportedKeys.push(key);\n process.env[key] = value;\n }\n logger.debug(\n { keys: exportedKeys },\n 'processEnv keys were exported to env',\n );\n delete config.processEnv;\n }\n\n return migrateAndValidateConfig(config, configFile);\n}\n\nexport async function deleteNonDefaultConfig(\n env: NodeJS.ProcessEnv,\n deleteConfigFile: boolean,\n): Promise<void> {\n const configFile = env.RENOVATE_ADDITIONAL_CONFIG_FILE;\n\n if (isUndefined(configFile) || isEmptyStringOrWhitespace(configFile)) {\n return;\n }\n\n if (!deleteConfigFile) {\n return;\n }\n\n if (!(await fs.pathExists(configFile))) {\n return;\n }\n\n try {\n await fs.remove(configFile);\n logger.trace(\n { path: configFile },\n 'Additional config file successfully deleted',\n );\n } catch (err) {\n logger.warn({ err }, 'Error deleting additional config file');\n }\n}\n"],"mappings":";;;;;AAWA,eAAsB,UAAU,KAA4C;CAC1E,IAAI,SAAoB,CAAC;CACzB,MAAM,aAAa,IAAI;CACvB,IAAI,CAAC,YAAY;EACf,OAAO,MAAM,sDAAsD;EACnE,OAAO;CACT;CAGA,IAAI,CAAC,MAD0B,GAAG,WAAW,UAAU,GAChC;EAErB,OAAO,MACL,EAAE,WAAW,GACb,uFACF;EACA,QAAQ,KAAK,CAAC;CAChB;CAEA,OAAO,MAAM,0CAA0C,YAAY;CACnE,IAAI;EACF,SAAS,MAAM,iBAAiB,UAAU;CAC5C,SAAS,KAAK;EACZ,IAAI,eAAe,eAAe,eAAe,WAAW;GAE1D,OAAO,MACL,EAAE,OAAO,IAAI,MAAM,GACnB,wCACF;GACA,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,eAAe,gBAAgB;GAExC,OAAO,MACL,EAAE,IAAI,GACN,oEACF;GACA,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,IAAI,YAAY,yBAAyB;GAClD,OAAO,MAAM,IAAI,OAAO;GACxB,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,IAAI,iCAAiC;GAC9C,OAAO,MAAM,EAAE,IAAI,GAAG,aAAa;GACnC,OAAO,MAAM,sCAAsC;GACnD,QAAQ,KAAK,CAAC;EAChB;EACA,OAAO,MAAM,4DAA4D;CAC3E;CAEA,IAAI,iBAAiB,OAAO,UAAU,GAAG;EACvC,MAAM,eAAe,CAAC;EACtB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,UAAU,GAAG;GAC5D,IAAI,CAAC,iBAAiB,KAAK,GAAG;IAC5B,OAAO,MAAM,EAAE,IAAI,GAAG,mCAAmC;IACzD;GACF;GAEA,aAAa,KAAK,GAAG;GACrB,QAAQ,IAAI,OAAO;EACrB;EACA,OAAO,MACL,EAAE,MAAM,aAAa,GACrB,sCACF;EACA,OAAO,OAAO;CAChB;CAEA,OAAO,yBAAyB,QAAQ,UAAU;AACpD;AAEA,eAAsB,uBACpB,KACA,kBACe;CACf,MAAM,aAAa,IAAI;CAEvB,IAAI,YAAY,UAAU,KAAK,0BAA0B,UAAU,GACjE;CAGF,IAAI,CAAC,kBACH;CAGF,IAAI,CAAE,MAAM,GAAG,WAAW,UAAU,GAClC;CAGF,IAAI;EACF,MAAM,GAAG,OAAO,UAAU;EAC1B,OAAO,MACL,EAAE,MAAM,WAAW,GACnB,6CACF;CACF,SAAS,KAAK;EACZ,OAAO,KAAK,EAAE,IAAI,GAAG,uCAAuC;CAC9D;AACF"}
@@ -183,7 +183,10 @@ async function parseAndValidateOrExit(env, configEnvKey) {
183
183
  logger.debug({ config }, `Detected config in env ${configEnvKey}`);
184
184
  return await migrateAndValidateConfig(config, `${configEnvKey}`);
185
185
  } catch (err) {
186
- logger.fatal({ err }, `Could not parse ${configEnvKey}`);
186
+ logger.fatal({
187
+ err,
188
+ configEnvKey
189
+ }, "Could not parse config environment variable");
187
190
  process.exit(1);
188
191
  }
189
192
  }
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/env.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { getEnvName } from '../../../../config/options/env.ts';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { parseJson } from '../../../../util/common.ts';\nimport { coersions } from './coersions.ts';\nimport { migrateAndValidateConfig } from './util.ts';\n\nfunction normalizePrefixes(\n env: NodeJS.ProcessEnv,\n prefix: string | undefined,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n if (prefix) {\n for (const [key, val] of Object.entries(result)) {\n if (key.startsWith(prefix)) {\n const newKey = key.replace(prefix, 'RENOVATE_');\n result[newKey] = val;\n delete result[key];\n }\n }\n }\n return result;\n}\n\nconst renameKeys = {\n aliases: 'registryAliases',\n azureAutoComplete: 'platformAutomerge', // migrate: azureAutoComplete\n gitLabAutomerge: 'platformAutomerge', // migrate: gitLabAutomerge\n mergeConfidenceApiBaseUrl: 'mergeConfidenceEndpoint',\n mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources',\n allowedPostUpgradeCommands: 'allowedCommands',\n baseBranches: 'baseBranchPatterns',\n};\n\nfunction renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [from, to] of Object.entries(renameKeys)) {\n const fromKey = getEnvName({ name: from });\n const toKey = getEnvName({ name: to });\n if (env[fromKey]) {\n result[toKey] = env[fromKey];\n delete result[fromKey];\n }\n }\n return result;\n}\n\nconst migratedKeysWithValues = [\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'true',\n to: 'always',\n },\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'false',\n to: 'auto',\n },\n];\n\nfunction massageEnvKeyValues(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const { oldName, newName, from, to } of migratedKeysWithValues) {\n const key = getEnvName({ name: oldName });\n if (env[key] !== undefined && result[key] === from) {\n delete result[key];\n result[getEnvName({ name: newName })] = to;\n }\n }\n return result;\n}\n\ninterface ConvertedExperimentalEnvVar {\n optionName: string;\n // Normalize the raw env var value before passing it through, if needed.\n normalizeValue?: (value: string) => string;\n}\n\n// Maps RENOVATE_X_ env vars that have been promoted to regular config options\n// to the option name they now correspond to.\nexport const convertedExperimentalEnvVars: ReadonlyMap<\n string,\n ConvertedExperimentalEnvVar\n> = new Map([\n ['RENOVATE_X_AUTODISCOVER_REPO_SORT', { optionName: 'autodiscoverRepoSort' }],\n [\n 'RENOVATE_X_AUTODISCOVER_REPO_ORDER',\n { optionName: 'autodiscoverRepoOrder' },\n ],\n ['RENOVATE_X_DOCKER_MAX_PAGES', { optionName: 'dockerMaxPages' }],\n ['RENOVATE_X_DELETE_CONFIG_FILE', { optionName: 'deleteConfigFile' }],\n ['RENOVATE_X_S3_ENDPOINT', { optionName: 's3Endpoint' }],\n ['RENOVATE_X_S3_PATH_STYLE', { optionName: 's3PathStyle' }],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL',\n { optionName: 'mergeConfidenceEndpoint' },\n ],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_SUPPORTED_DATASOURCES',\n { optionName: 'mergeConfidenceDatasources' },\n ],\n [\n 'RENOVATE_X_REPO_CACHE_FORCE_LOCAL',\n {\n optionName: 'repositoryCacheForceLocal',\n // The old env var was treated as a flag: any non-empty value meant true.\n normalizeValue: (v: string) => (v ? 'true' : v),\n },\n ],\n]);\n\n/**\n * Massages the experimental env vars which have been converted to config options\n *\n * e.g. RENOVATE_X_AUTODISCOVER_REPO_SORT -> RENOVATE_AUTODISCOVER_REPO_SORT\n */\nfunction massageConvertedExperimentalVars(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [\n oldKey,\n { optionName, normalizeValue },\n ] of convertedExperimentalEnvVars) {\n if (env[oldKey] !== undefined) {\n const newKey = getEnvName({ name: optionName });\n result[newKey] = normalizeValue\n ? normalizeValue(env[oldKey])\n : env[oldKey];\n delete result[oldKey];\n }\n }\n return result;\n}\n\nexport async function getConfig(\n inputEnv: NodeJS.ProcessEnv,\n configEnvKey = 'RENOVATE_CONFIG',\n): Promise<AllConfig> {\n const env = prepareEnv(inputEnv);\n const config = await parseAndValidateOrExit(env, configEnvKey);\n\n const options = getOptions();\n config.hostRules ??= [];\n\n for (const option of options) {\n if (option.env === false) {\n continue;\n }\n\n const envName = getEnvName(option);\n const envVal = env[envName];\n if (!envVal) {\n continue;\n }\n\n if (option.type === 'array' && option.subType === 'object') {\n try {\n const parsed = JSON5.parse(envVal);\n if (isArray(parsed)) {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = parsed;\n } else {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse object array',\n );\n }\n } catch {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse environment variable',\n );\n }\n } else {\n const coerce = coersions[option.type];\n try {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = coerce(envVal);\n } catch (e) {\n throw new Error(`${envName} was invalid: ${e}`);\n }\n\n if (option.name === 'dryRun') {\n if ((config[option.name] as string) === 'true') {\n logger.warn('env config dryRun property has been changed to full');\n config[option.name] = 'full';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn('env config dryRun property has been changed to null');\n delete config[option.name];\n } else if ((config[option.name] as string) === 'null') {\n delete config[option.name];\n }\n }\n\n if (option.name === 'requireConfig') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config requireConfig property has been changed to required',\n );\n config[option.name] = 'required';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config requireConfig property has been changed to optional',\n );\n config[option.name] = 'optional';\n }\n }\n\n if (option.name === 'platformCommit') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config platformCommit property has been changed to enabled',\n );\n config[option.name] = 'enabled';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config platformCommit property has been changed to disabled',\n );\n config[option.name] = 'disabled';\n }\n }\n }\n }\n\n const githubComToken = env.GITHUB_COM_TOKEN ?? env.RENOVATE_GITHUB_COM_TOKEN;\n if (githubComToken) {\n logger.debug(`Converting GITHUB_COM_TOKEN into a global host rule`);\n config.hostRules.push({\n hostType: 'github',\n matchHost: 'github.com',\n token: githubComToken,\n });\n }\n\n // These env vars are deprecated and deleted to make sure they're not used\n const unsupportedEnv = [\n 'BITBUCKET_TOKEN',\n 'BITBUCKET_USERNAME',\n 'BITBUCKET_PASSWORD',\n 'GITHUB_ENDPOINT',\n 'GITHUB_TOKEN',\n 'GITLAB_ENDPOINT',\n 'GITLAB_TOKEN',\n 'VSTS_ENDPOINT',\n 'VSTS_TOKEN',\n ];\n\n for (const val of unsupportedEnv) {\n delete env[val];\n }\n\n return config;\n}\n\nexport function prepareEnv(inputEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n let env = normalizePrefixes(inputEnv, inputEnv.ENV_PREFIX);\n env = massageConvertedExperimentalVars(env);\n env = renameEnvKeys(env);\n // massage the values of migrated configuration keys\n return massageEnvKeyValues(env);\n}\n\nexport async function parseAndValidateOrExit(\n env: NodeJS.ProcessEnv,\n configEnvKey: string,\n): Promise<AllConfig> {\n if (!env[configEnvKey]) {\n return {};\n }\n\n try {\n const config = parseJson(\n env[configEnvKey],\n `${configEnvKey}.env.json5`,\n ) as AllConfig;\n logger.debug({ config }, `Detected config in env ${configEnvKey}`);\n\n return await migrateAndValidateConfig(config, `${configEnvKey}`);\n } catch (err) {\n logger.fatal({ err }, `Could not parse ${configEnvKey}`);\n process.exit(1);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"env.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/env.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { getEnvName } from '../../../../config/options/env.ts';\nimport { getOptions } from '../../../../config/options/index.ts';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { parseJson } from '../../../../util/common.ts';\nimport { coersions } from './coersions.ts';\nimport { migrateAndValidateConfig } from './util.ts';\n\nfunction normalizePrefixes(\n env: NodeJS.ProcessEnv,\n prefix: string | undefined,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n if (prefix) {\n for (const [key, val] of Object.entries(result)) {\n if (key.startsWith(prefix)) {\n const newKey = key.replace(prefix, 'RENOVATE_');\n result[newKey] = val;\n delete result[key];\n }\n }\n }\n return result;\n}\n\nconst renameKeys = {\n aliases: 'registryAliases',\n azureAutoComplete: 'platformAutomerge', // migrate: azureAutoComplete\n gitLabAutomerge: 'platformAutomerge', // migrate: gitLabAutomerge\n mergeConfidenceApiBaseUrl: 'mergeConfidenceEndpoint',\n mergeConfidenceSupportedDatasources: 'mergeConfidenceDatasources',\n allowedPostUpgradeCommands: 'allowedCommands',\n baseBranches: 'baseBranchPatterns',\n};\n\nfunction renameEnvKeys(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [from, to] of Object.entries(renameKeys)) {\n const fromKey = getEnvName({ name: from });\n const toKey = getEnvName({ name: to });\n if (env[fromKey]) {\n result[toKey] = env[fromKey];\n delete result[fromKey];\n }\n }\n return result;\n}\n\nconst migratedKeysWithValues = [\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'true',\n to: 'always',\n },\n {\n oldName: 'recreateClosed',\n newName: 'recreateWhen',\n from: 'false',\n to: 'auto',\n },\n];\n\nfunction massageEnvKeyValues(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const { oldName, newName, from, to } of migratedKeysWithValues) {\n const key = getEnvName({ name: oldName });\n if (env[key] !== undefined && result[key] === from) {\n delete result[key];\n result[getEnvName({ name: newName })] = to;\n }\n }\n return result;\n}\n\ninterface ConvertedExperimentalEnvVar {\n optionName: string;\n // Normalize the raw env var value before passing it through, if needed.\n normalizeValue?: (value: string) => string;\n}\n\n// Maps RENOVATE_X_ env vars that have been promoted to regular config options\n// to the option name they now correspond to.\nexport const convertedExperimentalEnvVars: ReadonlyMap<\n string,\n ConvertedExperimentalEnvVar\n> = new Map([\n ['RENOVATE_X_AUTODISCOVER_REPO_SORT', { optionName: 'autodiscoverRepoSort' }],\n [\n 'RENOVATE_X_AUTODISCOVER_REPO_ORDER',\n { optionName: 'autodiscoverRepoOrder' },\n ],\n ['RENOVATE_X_DOCKER_MAX_PAGES', { optionName: 'dockerMaxPages' }],\n ['RENOVATE_X_DELETE_CONFIG_FILE', { optionName: 'deleteConfigFile' }],\n ['RENOVATE_X_S3_ENDPOINT', { optionName: 's3Endpoint' }],\n ['RENOVATE_X_S3_PATH_STYLE', { optionName: 's3PathStyle' }],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_API_BASE_URL',\n { optionName: 'mergeConfidenceEndpoint' },\n ],\n [\n 'RENOVATE_X_MERGE_CONFIDENCE_SUPPORTED_DATASOURCES',\n { optionName: 'mergeConfidenceDatasources' },\n ],\n [\n 'RENOVATE_X_REPO_CACHE_FORCE_LOCAL',\n {\n optionName: 'repositoryCacheForceLocal',\n // The old env var was treated as a flag: any non-empty value meant true.\n normalizeValue: (v: string) => (v ? 'true' : v),\n },\n ],\n]);\n\n/**\n * Massages the experimental env vars which have been converted to config options\n *\n * e.g. RENOVATE_X_AUTODISCOVER_REPO_SORT -> RENOVATE_AUTODISCOVER_REPO_SORT\n */\nfunction massageConvertedExperimentalVars(\n env: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv {\n const result = { ...env };\n for (const [\n oldKey,\n { optionName, normalizeValue },\n ] of convertedExperimentalEnvVars) {\n if (env[oldKey] !== undefined) {\n const newKey = getEnvName({ name: optionName });\n result[newKey] = normalizeValue\n ? normalizeValue(env[oldKey])\n : env[oldKey];\n delete result[oldKey];\n }\n }\n return result;\n}\n\nexport async function getConfig(\n inputEnv: NodeJS.ProcessEnv,\n configEnvKey = 'RENOVATE_CONFIG',\n): Promise<AllConfig> {\n const env = prepareEnv(inputEnv);\n const config = await parseAndValidateOrExit(env, configEnvKey);\n\n const options = getOptions();\n config.hostRules ??= [];\n\n for (const option of options) {\n if (option.env === false) {\n continue;\n }\n\n const envName = getEnvName(option);\n const envVal = env[envName];\n if (!envVal) {\n continue;\n }\n\n if (option.type === 'array' && option.subType === 'object') {\n try {\n const parsed = JSON5.parse(envVal);\n if (isArray(parsed)) {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = parsed;\n } else {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse object array',\n );\n }\n } catch {\n logger.debug(\n { val: envVal, envName },\n 'Could not parse environment variable',\n );\n }\n } else {\n const coerce = coersions[option.type];\n try {\n // @ts-expect-error -- type can't be narrowed\n config[option.name] = coerce(envVal);\n } catch (e) {\n throw new Error(`${envName} was invalid: ${e}`);\n }\n\n if (option.name === 'dryRun') {\n if ((config[option.name] as string) === 'true') {\n logger.warn('env config dryRun property has been changed to full');\n config[option.name] = 'full';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn('env config dryRun property has been changed to null');\n delete config[option.name];\n } else if ((config[option.name] as string) === 'null') {\n delete config[option.name];\n }\n }\n\n if (option.name === 'requireConfig') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config requireConfig property has been changed to required',\n );\n config[option.name] = 'required';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config requireConfig property has been changed to optional',\n );\n config[option.name] = 'optional';\n }\n }\n\n if (option.name === 'platformCommit') {\n if ((config[option.name] as string) === 'true') {\n logger.warn(\n 'env config platformCommit property has been changed to enabled',\n );\n config[option.name] = 'enabled';\n } else if ((config[option.name] as string) === 'false') {\n logger.warn(\n 'env config platformCommit property has been changed to disabled',\n );\n config[option.name] = 'disabled';\n }\n }\n }\n }\n\n const githubComToken = env.GITHUB_COM_TOKEN ?? env.RENOVATE_GITHUB_COM_TOKEN;\n if (githubComToken) {\n logger.debug(`Converting GITHUB_COM_TOKEN into a global host rule`);\n config.hostRules.push({\n hostType: 'github',\n matchHost: 'github.com',\n token: githubComToken,\n });\n }\n\n // These env vars are deprecated and deleted to make sure they're not used\n const unsupportedEnv = [\n 'BITBUCKET_TOKEN',\n 'BITBUCKET_USERNAME',\n 'BITBUCKET_PASSWORD',\n 'GITHUB_ENDPOINT',\n 'GITHUB_TOKEN',\n 'GITLAB_ENDPOINT',\n 'GITLAB_TOKEN',\n 'VSTS_ENDPOINT',\n 'VSTS_TOKEN',\n ];\n\n for (const val of unsupportedEnv) {\n delete env[val];\n }\n\n return config;\n}\n\nexport function prepareEnv(inputEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n let env = normalizePrefixes(inputEnv, inputEnv.ENV_PREFIX);\n env = massageConvertedExperimentalVars(env);\n env = renameEnvKeys(env);\n // massage the values of migrated configuration keys\n return massageEnvKeyValues(env);\n}\n\nexport async function parseAndValidateOrExit(\n env: NodeJS.ProcessEnv,\n configEnvKey: string,\n): Promise<AllConfig> {\n if (!env[configEnvKey]) {\n return {};\n }\n\n try {\n const config = parseJson(\n env[configEnvKey],\n `${configEnvKey}.env.json5`,\n ) as AllConfig;\n logger.debug({ config }, `Detected config in env ${configEnvKey}`);\n\n return await migrateAndValidateConfig(config, `${configEnvKey}`);\n } catch (err) {\n logger.fatal(\n { err, configEnvKey },\n 'Could not parse config environment variable',\n );\n process.exit(1);\n }\n}\n"],"mappings":"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"}
@@ -23,7 +23,7 @@ async function getConfig(env) {
23
23
  logger.fatal({ error: err.stack }, "Could not parse config file");
24
24
  process.exit(1);
25
25
  } else if (err instanceof ReferenceError) {
26
- logger.fatal(`Error parsing config file due to unresolved variable(s): ${err.message}`);
26
+ logger.fatal({ err }, "Error parsing config file due to unresolved variable(s)");
27
27
  process.exit(1);
28
28
  } else if (err.message === "Unsupported file type") {
29
29
  logger.fatal(err.message);
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/file.ts"],"sourcesContent":["import {\n isEmptyStringOrWhitespace,\n isNonEmptyObject,\n isNonEmptyString,\n isUndefined,\n} from '@sindresorhus/is';\nimport fs from 'fs-extra';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { getParsedContent, migrateAndValidateConfig } from './util.ts';\n\nexport async function getConfig(env: NodeJS.ProcessEnv): Promise<AllConfig> {\n const configFile = env.RENOVATE_CONFIG_FILE ?? 'config.js';\n\n const configFileExists = await fs.pathExists(configFile);\n if (env.RENOVATE_CONFIG_FILE && !configFileExists) {\n logger.fatal(\n { configFile },\n `Custom config file specified in RENOVATE_CONFIG_FILE must exist`,\n );\n process.exit(1);\n }\n\n let config: AllConfig = {};\n\n if (!configFileExists) {\n logger.debug('No config file found on disk - skipping');\n return config;\n }\n\n logger.debug(`Checking for config file in ${configFile}`);\n try {\n config = await getParsedContent(configFile);\n } catch (err) {\n if (err instanceof SyntaxError || err instanceof TypeError) {\n logger.fatal({ error: err.stack }, 'Could not parse config file');\n process.exit(1);\n } else if (err instanceof ReferenceError) {\n logger.fatal(\n `Error parsing config file due to unresolved variable(s): ${err.message}`,\n );\n process.exit(1);\n } else if (err.message === 'Unsupported file type') {\n logger.fatal(err.message);\n process.exit(1);\n } else if (env.RENOVATE_CONFIG_FILE) {\n logger.debug({ err }, 'Parse error');\n logger.fatal('Error parsing config file');\n process.exit(1);\n }\n logger.debug('Error reading or parsing file - skipping');\n }\n\n if (isNonEmptyObject(config.processEnv)) {\n const exportedKeys = [];\n for (const [key, value] of Object.entries(config.processEnv)) {\n if (!isNonEmptyString(value)) {\n logger.error({ key }, 'processEnv value is not a string.');\n continue;\n }\n\n exportedKeys.push(key);\n process.env[key] = value;\n }\n logger.debug(\n { keys: exportedKeys },\n 'processEnv keys were exported to env',\n );\n delete config.processEnv;\n }\n\n return migrateAndValidateConfig(config, configFile);\n}\n\nexport async function deleteNonDefaultConfig(\n env: NodeJS.ProcessEnv,\n deleteConfigFile: boolean,\n): Promise<void> {\n const configFile = env.RENOVATE_CONFIG_FILE;\n\n if (isUndefined(configFile) || isEmptyStringOrWhitespace(configFile)) {\n return;\n }\n\n if (!deleteConfigFile) {\n return;\n }\n\n if (!(await fs.pathExists(configFile))) {\n return;\n }\n\n try {\n await fs.remove(configFile);\n logger.trace({ path: configFile }, 'config file successfully deleted');\n } catch (err) {\n logger.warn({ err }, 'error deleting config file');\n }\n}\n"],"mappings":";;;;;AAWA,eAAsB,UAAU,KAA4C;CAC1E,MAAM,aAAa,IAAI,wBAAwB;CAE/C,MAAM,mBAAmB,MAAM,GAAG,WAAW,UAAU;CACvD,IAAI,IAAI,wBAAwB,CAAC,kBAAkB;EACjD,OAAO,MACL,EAAE,WAAW,GACb,iEACF;EACA,QAAQ,KAAK,CAAC;CAChB;CAEA,IAAI,SAAoB,CAAC;CAEzB,IAAI,CAAC,kBAAkB;EACrB,OAAO,MAAM,yCAAyC;EACtD,OAAO;CACT;CAEA,OAAO,MAAM,+BAA+B,YAAY;CACxD,IAAI;EACF,SAAS,MAAM,iBAAiB,UAAU;CAC5C,SAAS,KAAK;EACZ,IAAI,eAAe,eAAe,eAAe,WAAW;GAC1D,OAAO,MAAM,EAAE,OAAO,IAAI,MAAM,GAAG,6BAA6B;GAChE,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,eAAe,gBAAgB;GACxC,OAAO,MACL,4DAA4D,IAAI,SAClE;GACA,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,IAAI,YAAY,yBAAyB;GAClD,OAAO,MAAM,IAAI,OAAO;GACxB,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,IAAI,sBAAsB;GACnC,OAAO,MAAM,EAAE,IAAI,GAAG,aAAa;GACnC,OAAO,MAAM,2BAA2B;GACxC,QAAQ,KAAK,CAAC;EAChB;EACA,OAAO,MAAM,0CAA0C;CACzD;CAEA,IAAI,iBAAiB,OAAO,UAAU,GAAG;EACvC,MAAM,eAAe,CAAC;EACtB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,UAAU,GAAG;GAC5D,IAAI,CAAC,iBAAiB,KAAK,GAAG;IAC5B,OAAO,MAAM,EAAE,IAAI,GAAG,mCAAmC;IACzD;GACF;GAEA,aAAa,KAAK,GAAG;GACrB,QAAQ,IAAI,OAAO;EACrB;EACA,OAAO,MACL,EAAE,MAAM,aAAa,GACrB,sCACF;EACA,OAAO,OAAO;CAChB;CAEA,OAAO,yBAAyB,QAAQ,UAAU;AACpD;AAEA,eAAsB,uBACpB,KACA,kBACe;CACf,MAAM,aAAa,IAAI;CAEvB,IAAI,YAAY,UAAU,KAAK,0BAA0B,UAAU,GACjE;CAGF,IAAI,CAAC,kBACH;CAGF,IAAI,CAAE,MAAM,GAAG,WAAW,UAAU,GAClC;CAGF,IAAI;EACF,MAAM,GAAG,OAAO,UAAU;EAC1B,OAAO,MAAM,EAAE,MAAM,WAAW,GAAG,kCAAkC;CACvE,SAAS,KAAK;EACZ,OAAO,KAAK,EAAE,IAAI,GAAG,4BAA4B;CACnD;AACF"}
1
+ {"version":3,"file":"file.js","names":[],"sources":["../../../../../lib/workers/global/config/parse/file.ts"],"sourcesContent":["import {\n isEmptyStringOrWhitespace,\n isNonEmptyObject,\n isNonEmptyString,\n isUndefined,\n} from '@sindresorhus/is';\nimport fs from 'fs-extra';\nimport type { AllConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { getParsedContent, migrateAndValidateConfig } from './util.ts';\n\nexport async function getConfig(env: NodeJS.ProcessEnv): Promise<AllConfig> {\n const configFile = env.RENOVATE_CONFIG_FILE ?? 'config.js';\n\n const configFileExists = await fs.pathExists(configFile);\n if (env.RENOVATE_CONFIG_FILE && !configFileExists) {\n logger.fatal(\n { configFile },\n `Custom config file specified in RENOVATE_CONFIG_FILE must exist`,\n );\n process.exit(1);\n }\n\n let config: AllConfig = {};\n\n if (!configFileExists) {\n logger.debug('No config file found on disk - skipping');\n return config;\n }\n\n logger.debug(`Checking for config file in ${configFile}`);\n try {\n config = await getParsedContent(configFile);\n } catch (err) {\n if (err instanceof SyntaxError || err instanceof TypeError) {\n logger.fatal({ error: err.stack }, 'Could not parse config file');\n process.exit(1);\n } else if (err instanceof ReferenceError) {\n logger.fatal(\n { err },\n 'Error parsing config file due to unresolved variable(s)',\n );\n process.exit(1);\n } else if (err.message === 'Unsupported file type') {\n logger.fatal(err.message);\n process.exit(1);\n } else if (env.RENOVATE_CONFIG_FILE) {\n logger.debug({ err }, 'Parse error');\n logger.fatal('Error parsing config file');\n process.exit(1);\n }\n logger.debug('Error reading or parsing file - skipping');\n }\n\n if (isNonEmptyObject(config.processEnv)) {\n const exportedKeys = [];\n for (const [key, value] of Object.entries(config.processEnv)) {\n if (!isNonEmptyString(value)) {\n logger.error({ key }, 'processEnv value is not a string.');\n continue;\n }\n\n exportedKeys.push(key);\n process.env[key] = value;\n }\n logger.debug(\n { keys: exportedKeys },\n 'processEnv keys were exported to env',\n );\n delete config.processEnv;\n }\n\n return migrateAndValidateConfig(config, configFile);\n}\n\nexport async function deleteNonDefaultConfig(\n env: NodeJS.ProcessEnv,\n deleteConfigFile: boolean,\n): Promise<void> {\n const configFile = env.RENOVATE_CONFIG_FILE;\n\n if (isUndefined(configFile) || isEmptyStringOrWhitespace(configFile)) {\n return;\n }\n\n if (!deleteConfigFile) {\n return;\n }\n\n if (!(await fs.pathExists(configFile))) {\n return;\n }\n\n try {\n await fs.remove(configFile);\n logger.trace({ path: configFile }, 'config file successfully deleted');\n } catch (err) {\n logger.warn({ err }, 'error deleting config file');\n }\n}\n"],"mappings":";;;;;AAWA,eAAsB,UAAU,KAA4C;CAC1E,MAAM,aAAa,IAAI,wBAAwB;CAE/C,MAAM,mBAAmB,MAAM,GAAG,WAAW,UAAU;CACvD,IAAI,IAAI,wBAAwB,CAAC,kBAAkB;EACjD,OAAO,MACL,EAAE,WAAW,GACb,iEACF;EACA,QAAQ,KAAK,CAAC;CAChB;CAEA,IAAI,SAAoB,CAAC;CAEzB,IAAI,CAAC,kBAAkB;EACrB,OAAO,MAAM,yCAAyC;EACtD,OAAO;CACT;CAEA,OAAO,MAAM,+BAA+B,YAAY;CACxD,IAAI;EACF,SAAS,MAAM,iBAAiB,UAAU;CAC5C,SAAS,KAAK;EACZ,IAAI,eAAe,eAAe,eAAe,WAAW;GAC1D,OAAO,MAAM,EAAE,OAAO,IAAI,MAAM,GAAG,6BAA6B;GAChE,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,eAAe,gBAAgB;GACxC,OAAO,MACL,EAAE,IAAI,GACN,yDACF;GACA,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,IAAI,YAAY,yBAAyB;GAClD,OAAO,MAAM,IAAI,OAAO;GACxB,QAAQ,KAAK,CAAC;EAChB,OAAO,IAAI,IAAI,sBAAsB;GACnC,OAAO,MAAM,EAAE,IAAI,GAAG,aAAa;GACnC,OAAO,MAAM,2BAA2B;GACxC,QAAQ,KAAK,CAAC;EAChB;EACA,OAAO,MAAM,0CAA0C;CACzD;CAEA,IAAI,iBAAiB,OAAO,UAAU,GAAG;EACvC,MAAM,eAAe,CAAC;EACtB,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,UAAU,GAAG;GAC5D,IAAI,CAAC,iBAAiB,KAAK,GAAG;IAC5B,OAAO,MAAM,EAAE,IAAI,GAAG,mCAAmC;IACzD;GACF;GAEA,aAAa,KAAK,GAAG;GACrB,QAAQ,IAAI,OAAO;EACrB;EACA,OAAO,MACL,EAAE,MAAM,aAAa,GACrB,sCACF;EACA,OAAO,OAAO;CAChB;CAEA,OAAO,yBAAyB,QAAQ,UAAU;AACpD;AAEA,eAAsB,uBACpB,KACA,kBACe;CACf,MAAM,aAAa,IAAI;CAEvB,IAAI,YAAY,UAAU,KAAK,0BAA0B,UAAU,GACjE;CAGF,IAAI,CAAC,kBACH;CAGF,IAAI,CAAE,MAAM,GAAG,WAAW,UAAU,GAClC;CAGF,IAAI;EACF,MAAM,GAAG,OAAO,UAAU;EAC1B,OAAO,MAAM,EAAE,MAAM,WAAW,GAAG,kCAAkC;CACvE,SAAS,KAAK;EACZ,OAAO,KAAK,EAAE,IAAI,GAAG,4BAA4B;CACnD;AACF"}
@@ -85,8 +85,8 @@ async function handleError(config, err) {
85
85
  }
86
86
  if (err.message === "config-validation") {
87
87
  delete config.branchList;
88
- if (config.configValidationError) logger.error({ error: err }, "Repository has invalid config");
89
- else logger.warn({ error: err }, "Repository has invalid config");
88
+ if (config.configValidationError) logger.error({ err }, "Repository has invalid config");
89
+ else logger.warn({ err }, "Repository has invalid config");
90
90
  await raiseConfigWarningIssue(config, err);
91
91
  return err.message;
92
92
  }
@@ -98,7 +98,7 @@ async function handleError(config, err) {
98
98
  }
99
99
  if (err.message === "config-secrets-exposed") {
100
100
  delete config.branchList;
101
- logger.warn({ error: err }, "Repository aborted due to potential secrets exposure");
101
+ logger.warn({ err }, "Repository aborted due to potential secrets exposure");
102
102
  return err.message;
103
103
  }
104
104
  if (err instanceof ExternalHostError) {
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","names":[],"sources":["../../../lib/workers/repository/error.ts"],"sourcesContent":["import type { RenovateConfig } from '../../config/types.ts';\n\nimport {\n CONFIG_SECRETS_EXPOSED,\n CONFIG_VALIDATION,\n EXTERNAL_HOST_ERROR,\n MANAGER_LOCKFILE_ERROR,\n MISSING_API_CREDENTIALS,\n NO_VULNERABILITY_ALERTS,\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_BLOCKED,\n REPOSITORY_CANNOT_FORK,\n REPOSITORY_CHANGED,\n REPOSITORY_CLOSED_ONBOARDING,\n REPOSITORY_DISABLED,\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_EMPTY,\n REPOSITORY_FORKED,\n REPOSITORY_FORK_MISSING,\n REPOSITORY_FORK_MODE_FORKED,\n REPOSITORY_MIRRORED,\n REPOSITORY_NOT_FOUND,\n REPOSITORY_NO_CONFIG,\n REPOSITORY_NO_PACKAGE_FILES,\n REPOSITORY_RENAMED,\n REPOSITORY_UNINITIATED,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n SYSTEM_INSUFFICIENT_MEMORY,\n TEMPORARY_ERROR,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport {\n raiseConfigWarningIssue,\n raiseCredentialsWarningIssue,\n} from './error-config.ts';\nimport type { RepositoryResult } from './result.ts';\n\nexport default async function handleError(\n config: RenovateConfig,\n err: Error,\n): Promise<RepositoryResult> {\n return instrument('handleError', async () => {\n if (err.message === REPOSITORY_UNINITIATED) {\n logger.info('Repository is uninitiated - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_EMPTY) {\n logger.info('Repository is empty - skipping');\n delete config.branchList;\n return err.message;\n }\n switch (err.message) {\n case REPOSITORY_CLOSED_ONBOARDING:\n case REPOSITORY_DISABLED:\n case REPOSITORY_DISABLED_BY_CONFIG:\n case REPOSITORY_NO_CONFIG:\n logger.info('Repository is disabled - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_ARCHIVED) {\n logger.info('Repository is archived - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_MIRRORED) {\n logger.info('Repository is a mirror - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_RENAMED) {\n logger.info('Repository has been renamed - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_BLOCKED) {\n delete config.branchList;\n logger.info('Repository is blocked - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_ACCESS_FORBIDDEN) {\n delete config.branchList;\n logger.info('Repository is forbidden');\n return err.message;\n }\n if (err.message === REPOSITORY_NOT_FOUND) {\n delete config.branchList;\n logger.error('Repository is not found');\n return err.message;\n }\n if (err.message === REPOSITORY_FORK_MODE_FORKED) {\n logger.info(\n 'Repository is a fork and cannot be processed when Renovate is running in fork mode itself',\n );\n return err.message;\n }\n if (err.message === REPOSITORY_FORKED) {\n logger.info(\n 'Repository is a fork and not manually configured - skipping - did you want to run with --fork-processing=enabled?',\n );\n return err.message;\n }\n if (err.message === REPOSITORY_CANNOT_FORK) {\n logger.info('Cannot fork repository - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_FORK_MISSING) {\n logger.info('Cannot find fork required for fork mode - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_NO_PACKAGE_FILES) {\n logger.info('Repository has no package files - skipping');\n return err.message;\n }\n if (err.message === NO_VULNERABILITY_ALERTS) {\n logger.info('Repository has no vulnerability alerts - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_CHANGED) {\n logger.info('Repository has changed during renovation - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === CONFIG_VALIDATION) {\n delete config.branchList;\n if (config.configValidationError) {\n logger.error({ error: err }, 'Repository has invalid config');\n } else {\n logger.warn({ error: err }, 'Repository has invalid config');\n }\n await raiseConfigWarningIssue(config, err);\n return err.message;\n }\n if (err.message === MISSING_API_CREDENTIALS) {\n delete config.branchList;\n logger.info({ error: err }, MISSING_API_CREDENTIALS);\n await raiseCredentialsWarningIssue(config, err);\n return err.message;\n }\n if (err.message === CONFIG_SECRETS_EXPOSED) {\n delete config.branchList;\n logger.warn(\n { error: err },\n 'Repository aborted due to potential secrets exposure',\n );\n return err.message;\n }\n if (err instanceof ExternalHostError) {\n logger.warn(\n { hostType: err.hostType, packageName: err.packageName, err: err.err },\n 'Host error',\n );\n logger.info('External host error causing abort - skipping');\n delete config.branchList;\n return EXTERNAL_HOST_ERROR;\n }\n if (\n err.message.includes('No space left on device') ||\n err.message === SYSTEM_INSUFFICIENT_DISK_SPACE\n ) {\n logger.error('Disk space error - skipping');\n delete config.branchList;\n return SYSTEM_INSUFFICIENT_DISK_SPACE;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n logger.warn('Rate limit exceeded - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === SYSTEM_INSUFFICIENT_MEMORY) {\n logger.warn('Insufficient memory - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_BAD_CREDENTIALS) {\n logger.warn('Bad credentials - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_INTEGRATION_UNAUTHORIZED) {\n logger.warn('Integration unauthorized - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_AUTHENTICATION_ERROR) {\n logger.warn('Authentication error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === TEMPORARY_ERROR) {\n logger.info('Temporary error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === MANAGER_LOCKFILE_ERROR) {\n delete config.branchList;\n logger.info('Lock file error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message.includes('The requested URL returned error: 5')) {\n logger.warn({ err }, 'Git error - aborting');\n delete config.branchList;\n // rewrite this error\n return EXTERNAL_HOST_ERROR;\n }\n if (\n err.message.includes('remote end hung up unexpectedly') ||\n err.message.includes('access denied or repository not exported')\n ) {\n logger.warn({ err }, 'Git error - aborting');\n delete config.branchList;\n // rewrite this error\n return EXTERNAL_HOST_ERROR;\n }\n if (err.message.includes('fatal: not a git repository')) {\n delete config.branchList;\n return TEMPORARY_ERROR;\n }\n // Swallow this error so that other repositories can be processed\n logger.error({ err }, `Repository has unknown error`);\n // delete branchList to avoid cleaning up branches\n delete config.branchList;\n\n return UNKNOWN_ERROR;\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"error.js","names":[],"sources":["../../../lib/workers/repository/error.ts"],"sourcesContent":["import type { RenovateConfig } from '../../config/types.ts';\n\nimport {\n CONFIG_SECRETS_EXPOSED,\n CONFIG_VALIDATION,\n EXTERNAL_HOST_ERROR,\n MANAGER_LOCKFILE_ERROR,\n MISSING_API_CREDENTIALS,\n NO_VULNERABILITY_ALERTS,\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_BLOCKED,\n REPOSITORY_CANNOT_FORK,\n REPOSITORY_CHANGED,\n REPOSITORY_CLOSED_ONBOARDING,\n REPOSITORY_DISABLED,\n REPOSITORY_DISABLED_BY_CONFIG,\n REPOSITORY_EMPTY,\n REPOSITORY_FORKED,\n REPOSITORY_FORK_MISSING,\n REPOSITORY_FORK_MODE_FORKED,\n REPOSITORY_MIRRORED,\n REPOSITORY_NOT_FOUND,\n REPOSITORY_NO_CONFIG,\n REPOSITORY_NO_PACKAGE_FILES,\n REPOSITORY_RENAMED,\n REPOSITORY_UNINITIATED,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n SYSTEM_INSUFFICIENT_MEMORY,\n TEMPORARY_ERROR,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport {\n raiseConfigWarningIssue,\n raiseCredentialsWarningIssue,\n} from './error-config.ts';\nimport type { RepositoryResult } from './result.ts';\n\nexport default async function handleError(\n config: RenovateConfig,\n err: Error,\n): Promise<RepositoryResult> {\n return instrument('handleError', async () => {\n if (err.message === REPOSITORY_UNINITIATED) {\n logger.info('Repository is uninitiated - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_EMPTY) {\n logger.info('Repository is empty - skipping');\n delete config.branchList;\n return err.message;\n }\n switch (err.message) {\n case REPOSITORY_CLOSED_ONBOARDING:\n case REPOSITORY_DISABLED:\n case REPOSITORY_DISABLED_BY_CONFIG:\n case REPOSITORY_NO_CONFIG:\n logger.info('Repository is disabled - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_ARCHIVED) {\n logger.info('Repository is archived - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_MIRRORED) {\n logger.info('Repository is a mirror - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_RENAMED) {\n logger.info('Repository has been renamed - skipping');\n delete config.branchList;\n return err.message;\n }\n if (err.message === REPOSITORY_BLOCKED) {\n delete config.branchList;\n logger.info('Repository is blocked - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_ACCESS_FORBIDDEN) {\n delete config.branchList;\n logger.info('Repository is forbidden');\n return err.message;\n }\n if (err.message === REPOSITORY_NOT_FOUND) {\n delete config.branchList;\n logger.error('Repository is not found');\n return err.message;\n }\n if (err.message === REPOSITORY_FORK_MODE_FORKED) {\n logger.info(\n 'Repository is a fork and cannot be processed when Renovate is running in fork mode itself',\n );\n return err.message;\n }\n if (err.message === REPOSITORY_FORKED) {\n logger.info(\n 'Repository is a fork and not manually configured - skipping - did you want to run with --fork-processing=enabled?',\n );\n return err.message;\n }\n if (err.message === REPOSITORY_CANNOT_FORK) {\n logger.info('Cannot fork repository - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_FORK_MISSING) {\n logger.info('Cannot find fork required for fork mode - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_NO_PACKAGE_FILES) {\n logger.info('Repository has no package files - skipping');\n return err.message;\n }\n if (err.message === NO_VULNERABILITY_ALERTS) {\n logger.info('Repository has no vulnerability alerts - skipping');\n return err.message;\n }\n if (err.message === REPOSITORY_CHANGED) {\n logger.info('Repository has changed during renovation - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === CONFIG_VALIDATION) {\n delete config.branchList;\n if (config.configValidationError) {\n logger.error({ err }, 'Repository has invalid config');\n } else {\n logger.warn({ err }, 'Repository has invalid config');\n }\n await raiseConfigWarningIssue(config, err);\n return err.message;\n }\n if (err.message === MISSING_API_CREDENTIALS) {\n delete config.branchList;\n logger.info({ error: err }, MISSING_API_CREDENTIALS);\n await raiseCredentialsWarningIssue(config, err);\n return err.message;\n }\n if (err.message === CONFIG_SECRETS_EXPOSED) {\n delete config.branchList;\n logger.warn(\n { err },\n 'Repository aborted due to potential secrets exposure',\n );\n return err.message;\n }\n if (err instanceof ExternalHostError) {\n logger.warn(\n { hostType: err.hostType, packageName: err.packageName, err: err.err },\n 'Host error',\n );\n logger.info('External host error causing abort - skipping');\n delete config.branchList;\n return EXTERNAL_HOST_ERROR;\n }\n if (\n err.message.includes('No space left on device') ||\n err.message === SYSTEM_INSUFFICIENT_DISK_SPACE\n ) {\n logger.error('Disk space error - skipping');\n delete config.branchList;\n return SYSTEM_INSUFFICIENT_DISK_SPACE;\n }\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n logger.warn('Rate limit exceeded - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === SYSTEM_INSUFFICIENT_MEMORY) {\n logger.warn('Insufficient memory - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_BAD_CREDENTIALS) {\n logger.warn('Bad credentials - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_INTEGRATION_UNAUTHORIZED) {\n logger.warn('Integration unauthorized - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === PLATFORM_AUTHENTICATION_ERROR) {\n logger.warn('Authentication error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === TEMPORARY_ERROR) {\n logger.info('Temporary error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message === MANAGER_LOCKFILE_ERROR) {\n delete config.branchList;\n logger.info('Lock file error - aborting');\n delete config.branchList;\n return err.message;\n }\n if (err.message.includes('The requested URL returned error: 5')) {\n logger.warn({ err }, 'Git error - aborting');\n delete config.branchList;\n // rewrite this error\n return EXTERNAL_HOST_ERROR;\n }\n if (\n err.message.includes('remote end hung up unexpectedly') ||\n err.message.includes('access denied or repository not exported')\n ) {\n logger.warn({ err }, 'Git error - aborting');\n delete config.branchList;\n // rewrite this error\n return EXTERNAL_HOST_ERROR;\n }\n if (err.message.includes('fatal: not a git repository')) {\n delete config.branchList;\n return TEMPORARY_ERROR;\n }\n // Swallow this error so that other repositories can be processed\n logger.error({ err }, `Repository has unknown error`);\n // delete branchList to avoid cleaning up branches\n delete config.branchList;\n\n return UNKNOWN_ERROR;\n });\n}\n"],"mappings":"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"}
@@ -154,7 +154,7 @@ function reportMaliciousSkippedDependencies(allPackageFiles) {
154
154
  packageName: dep.packageName,
155
155
  manager,
156
156
  datasource: dep.datasource
157
- }, `Dependency ${dep.depName} is currently using a malicious version`);
157
+ }, "Dependency is currently using a malicious version");
158
158
  delete dep.skipReason;
159
159
  delete dep.skipStage;
160
160
  } else if (dep.skipReason === "malicious-update-proposed") {
@@ -166,7 +166,7 @@ function reportMaliciousSkippedDependencies(allPackageFiles) {
166
166
  manager,
167
167
  datasource: dep.datasource,
168
168
  newVersions
169
- }, `Dependency ${dep.depName} has update(s) proposed which would update you to a malicious version - skipping`);
169
+ }, "Dependency has update(s) proposed which would update you to a malicious version - skipping");
170
170
  }
171
171
  }
172
172
  async function update(config, branches) {