renovate 44.71.2 → 44.72.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 (95) hide show
  1. package/dist/config/global.js.map +1 -1
  2. package/dist/config/options/index.js +2 -0
  3. package/dist/config/options/index.js.map +1 -1
  4. package/dist/config/presets/internal/security.preset.js.map +1 -1
  5. package/dist/config/types.js.map +1 -1
  6. package/dist/config/validation.js.map +1 -1
  7. package/dist/logger/config-serializer.js +7 -7
  8. package/dist/logger/config-serializer.js.map +1 -1
  9. package/dist/modules/datasource/conan/schema.js.map +1 -1
  10. package/dist/modules/datasource/deb/index.js +1 -1
  11. package/dist/modules/datasource/deb/index.js.map +1 -1
  12. package/dist/modules/datasource/deb/packages.js +1 -1
  13. package/dist/modules/datasource/deb/packages.js.map +1 -1
  14. package/dist/modules/datasource/docker/schema.js +1 -1
  15. package/dist/modules/datasource/docker/schema.js.map +1 -1
  16. package/dist/modules/datasource/orb/schema.js.map +1 -1
  17. package/dist/modules/datasource/terraform-module/schema.js.map +1 -1
  18. package/dist/modules/datasource/terraform-provider/schema.js.map +1 -1
  19. package/dist/modules/manager/argocd/extract.js +17 -15
  20. package/dist/modules/manager/argocd/extract.js.map +1 -1
  21. package/dist/modules/manager/bazel-module/rules.js.map +1 -1
  22. package/dist/modules/manager/cargo/schema.js.map +1 -1
  23. package/dist/modules/manager/dockerfile/extract.js.map +1 -1
  24. package/dist/modules/manager/fingerprint.generated.js +10 -10
  25. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  26. package/dist/modules/manager/fleet/extract.js +16 -7
  27. package/dist/modules/manager/fleet/extract.js.map +1 -1
  28. package/dist/modules/manager/flux/extract.js +4 -8
  29. package/dist/modules/manager/flux/extract.js.map +1 -1
  30. package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
  31. package/dist/modules/manager/helmfile/extract.js +12 -12
  32. package/dist/modules/manager/helmfile/extract.js.map +1 -1
  33. package/dist/modules/manager/helmsman/extract.js +8 -10
  34. package/dist/modules/manager/helmsman/extract.js.map +1 -1
  35. package/dist/modules/manager/helmv3/oci.js +22 -1
  36. package/dist/modules/manager/helmv3/oci.js.map +1 -1
  37. package/dist/modules/manager/helmv3/utils.js +2 -7
  38. package/dist/modules/manager/helmv3/utils.js.map +1 -1
  39. package/dist/modules/manager/kustomize/extract.js +6 -10
  40. package/dist/modules/manager/kustomize/extract.js.map +1 -1
  41. package/dist/modules/manager/mise/extract.js +1 -1
  42. package/dist/modules/manager/mise/extract.js.map +1 -1
  43. package/dist/modules/manager/nix/extract.js +2 -2
  44. package/dist/modules/manager/nix/extract.js.map +1 -1
  45. package/dist/modules/manager/npm/extract/index.js.map +1 -1
  46. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  47. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  48. package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
  49. package/dist/modules/manager/ocb/extract.js +2 -2
  50. package/dist/modules/manager/ocb/extract.js.map +1 -1
  51. package/dist/modules/manager/pep723/utils.js +1 -1
  52. package/dist/modules/manager/pep723/utils.js.map +1 -1
  53. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  54. package/dist/modules/manager/poetry/schema.js.map +1 -1
  55. package/dist/modules/manager/poetry/update-locked.js.map +1 -1
  56. package/dist/modules/manager/sveltos/extract.js +13 -19
  57. package/dist/modules/manager/sveltos/extract.js.map +1 -1
  58. package/dist/modules/manager/swift/artifacts.js +1 -1
  59. package/dist/modules/manager/swift/artifacts.js.map +1 -1
  60. package/dist/modules/manager/terraform/extractors/resources/helm-release.js +3 -10
  61. package/dist/modules/manager/terraform/extractors/resources/helm-release.js.map +1 -1
  62. package/dist/modules/manager/vendir/extract.js +3 -4
  63. package/dist/modules/manager/vendir/extract.js.map +1 -1
  64. package/dist/modules/platform/bitbucket/pr-cache.js.map +1 -1
  65. package/dist/modules/platform/forgejo/pr-cache.js.map +1 -1
  66. package/dist/modules/platform/gerrit/index.js.map +1 -1
  67. package/dist/modules/platform/gitea/pr-cache.js.map +1 -1
  68. package/dist/modules/platform/github/schema.js +1 -1
  69. package/dist/modules/platform/github/schema.js.map +1 -1
  70. package/dist/modules/platform/scm-manager/index.js.map +1 -1
  71. package/dist/modules/versioning/ruby/range.js.map +1 -1
  72. package/dist/util/cache/package/impl/redis.js.map +1 -1
  73. package/dist/util/cache/package/impl/sqlite.js.map +1 -1
  74. package/dist/util/cache/package/namespaces.js.map +1 -1
  75. package/dist/util/exec/index.js.map +1 -1
  76. package/dist/util/package-rules/merge-confidence.js +5 -0
  77. package/dist/util/package-rules/merge-confidence.js.map +1 -1
  78. package/dist/util/result.js.map +1 -1
  79. package/dist/util/yaml.js +1 -1
  80. package/dist/util/yaml.js.map +1 -1
  81. package/dist/workers/global/config/parse/additional-config-file.js +1 -1
  82. package/dist/workers/global/config/parse/additional-config-file.js.map +1 -1
  83. package/dist/workers/global/config/parse/file.js +1 -1
  84. package/dist/workers/global/config/parse/file.js.map +1 -1
  85. package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
  86. package/dist/workers/repository/dependency-dashboard.js.map +1 -1
  87. package/dist/workers/repository/error.js +1 -1
  88. package/dist/workers/repository/error.js.map +1 -1
  89. package/dist/workers/repository/index.js +1 -1
  90. package/dist/workers/repository/index.js.map +1 -1
  91. package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js.map +1 -1
  92. package/dist/workers/repository/onboarding/pr/pr-list.js.map +1 -1
  93. package/dist/workers/repository/update/branch/index.js.map +1 -1
  94. package/package.json +7 -7
  95. package/renovate-schema.json +2 -2
@@ -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 { coerceArray } from '../../../util/array.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 coerceArray(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 { coerceArray } from '../../../util/array.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 coerceArray(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 | 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 +1 @@
1
- {"version":3,"file":"range.js","names":["parse","_parse"],"sources":["../../../../lib/modules/versioning/ruby/range.ts"],"sourcesContent":["import { satisfies } from '@renovatebot/ruby-semver';\nimport { parse as _parse } from '@renovatebot/ruby-semver/dist/ruby/requirement.js';\nimport type { Version } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { create } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { EQUAL, GT, GTE, LT, LTE, NOT_EQUAL, PGTE } from './operator.ts';\nimport type { Range } from './types.ts';\n\nfunction parse(range: string): Range {\n const regExp = regEx(\n /^(?<operator>[^\\d\\s]+)?(?<delimiter>\\s*)(?<version>[0-9a-zA-Z-.]+)$/,\n );\n\n const value = (range || '').trim();\n\n const match = regExp.exec(value);\n if (match?.groups) {\n const { version, operator = '', delimiter } = match.groups;\n return { version, operator, delimiter };\n }\n\n return {\n version: '',\n operator: '',\n delimiter: ' ',\n };\n}\n\n/** Wrapper for {@link satisfies} for {@link Range} record. */\nexport function satisfiesRange(ver: string, range: Range): boolean {\n if (range.companion) {\n return (\n satisfies(ver, `${range.operator}${range.version}`) &&\n satisfiesRange(ver, range.companion)\n );\n }\n return satisfies(ver, `${range.operator}${range.version}`);\n}\n\n/**\n * Parses a comma-delimited list of range parts,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function parseRanges(range: string): Range[] {\n const originalRanges = range.split(',').map(parse);\n const ranges: Range[] = [];\n for (let i = 0; i < originalRanges.length; ) {\n if (\n i + 1 < originalRanges.length &&\n originalRanges[i].operator === PGTE &&\n originalRanges[i + 1].operator === GTE\n ) {\n ranges.push({\n ...originalRanges[i],\n companion: originalRanges[i + 1],\n });\n i += 2;\n } else {\n ranges.push(originalRanges[i]);\n i++;\n }\n }\n return ranges;\n}\n\n/**\n * Stringifies a list of range parts into a comma-separated string,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function stringifyRanges(ranges: Range[]): string {\n return ranges\n .map((r) => {\n if (r.companion) {\n return `${r.operator}${r.delimiter}${r.version}, ${r.companion.operator}${r.companion.delimiter}${r.companion.version}`;\n }\n return `${r.operator}${r.delimiter}${r.version}`;\n })\n .join(', ');\n}\n\ntype GemRequirement = [string, Version];\n\nfunction ltr(version: string, range: string): boolean {\n const gemVersion = create(version);\n if (!gemVersion) {\n logger.warn({ version }, `Invalid ruby version`);\n return false;\n }\n const requirements: GemRequirement[] = range.split(',').map(_parse);\n\n const results = requirements.map(([operator, ver]) => {\n switch (operator) {\n case GT:\n case LT:\n return gemVersion.compare(ver) <= 0;\n case GTE:\n case LTE:\n case EQUAL:\n case NOT_EQUAL:\n return gemVersion.compare(ver) < 0;\n case PGTE:\n return (\n gemVersion.compare(ver) < 0 &&\n gemVersion.release().compare(ver.bump()) <= 0\n );\n // istanbul ignore next\n default:\n logger.warn({ operator }, `Unsupported operator`);\n return false;\n }\n });\n\n return results.reduce((accumulator, value) => accumulator && value, true);\n}\n\nexport { ltr, parse };\n"],"mappings":";;;;;;AASA,SAASA,QAAM,OAAsB;CACnC,MAAM,SAAS,MACb,qEACF;CAEA,MAAM,SAAS,SAAS,GAAA,CAAI,KAAK;CAEjC,MAAM,QAAQ,OAAO,KAAK,KAAK;CAC/B,IAAI,OAAO,QAAQ;EACjB,MAAM,EAAE,SAAS,WAAW,IAAI,cAAc,MAAM;EACpD,OAAO;GAAE;GAAS;GAAU;EAAU;CACxC;CAEA,OAAO;EACL,SAAS;EACT,UAAU;EACV,WAAW;CACb;AACF;;AAGA,SAAgB,eAAe,KAAa,OAAuB;CACjE,IAAI,MAAM,WACR,OACE,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS,KAClD,eAAe,KAAK,MAAM,SAAS;CAGvC,OAAO,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS;AAC3D;;;;;AAMA,SAAgB,YAAY,OAAwB;CAClD,MAAM,iBAAiB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIA,OAAK;CACjD,MAAM,SAAkB,CAAC;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,SACjC,IACE,IAAI,IAAI,eAAe,UACvB,eAAe,EAAE,CAAC,aAAA,QAClB,eAAe,IAAI,EAAE,CAAC,aAAA,MACtB;EACA,OAAO,KAAK;GACV,GAAG,eAAe;GAClB,WAAW,eAAe,IAAI;EAChC,CAAC;EACD,KAAK;CACP,OAAO;EACL,OAAO,KAAK,eAAe,EAAE;EAC7B;CACF;CAEF,OAAO;AACT;;;;;AAMA,SAAgB,gBAAgB,QAAyB;CACvD,OAAO,OACJ,KAAK,MAAM;EACV,IAAI,EAAE,WACJ,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,IAAI,EAAE,UAAU,WAAW,EAAE,UAAU,YAAY,EAAE,UAAU;EAEhH,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE;CACzC,CAAC,CAAC,CACD,KAAK,IAAI;AACd;AAIA,SAAS,IAAI,SAAiB,OAAwB;CACpD,MAAM,aAAa,OAAO,OAAO;CACjC,IAAI,CAAC,YAAY;EACf,OAAO,KAAK,EAAE,QAAQ,GAAG,sBAAsB;EAC/C,OAAO;CACT;CAyBA,OAxBuC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIC,KAEjC,CAAC,CAAC,KAAK,CAAC,UAAU,SAAS;EACpD,QAAQ,UAAR;GACE,KAAA;GACA,KAAA,KACE,OAAO,WAAW,QAAQ,GAAG,KAAK;GACpC,KAAA;GACA,KAAA;GACA,KAAA;GACA,KAAA,MACE,OAAO,WAAW,QAAQ,GAAG,IAAI;GACnC,KAAA,MACE,OACE,WAAW,QAAQ,GAAG,IAAI,KAC1B,WAAW,QAAQ,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK;;GAGhD;IACE,OAAO,KAAK,EAAE,SAAS,GAAG,sBAAsB;IAChD,OAAO;EACX;CACF,CAEa,CAAC,CAAC,QAAQ,aAAa,UAAU,eAAe,OAAO,IAAI;AAC1E"}
1
+ {"version":3,"file":"range.js","names":["parse","_parse"],"sources":["../../../../lib/modules/versioning/ruby/range.ts"],"sourcesContent":["import { satisfies } from '@renovatebot/ruby-semver';\nimport { parse as _parse } from '@renovatebot/ruby-semver/dist/ruby/requirement.js';\nimport type { Version } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { create } from '@renovatebot/ruby-semver/dist/ruby/version.js';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { EQUAL, GT, GTE, LT, LTE, NOT_EQUAL, PGTE } from './operator.ts';\nimport type { Range } from './types.ts';\n\nfunction parse(range: string): Range {\n const regExp = regEx(\n /^(?<operator>[^\\d\\s]+)?(?<delimiter>\\s*)(?<version>[0-9a-zA-Z-.]+)$/,\n );\n\n const value = (range || '').trim();\n\n const match = regExp.exec(value);\n if (match?.groups) {\n const { version, operator = '', delimiter } = match.groups;\n return { version, operator, delimiter };\n }\n\n return {\n version: '',\n operator: '',\n delimiter: ' ',\n };\n}\n\n/** Wrapper for {@link satisfies} for {@link Range} record. */\nexport function satisfiesRange(ver: string, range: Range): boolean {\n if (range.companion) {\n return (\n satisfies(ver, `${range.operator}${range.version}`) &&\n satisfiesRange(ver, range.companion)\n );\n }\n return satisfies(ver, `${range.operator}${range.version}`);\n}\n\n/**\n * Parses a comma-delimited list of range parts,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function parseRanges(range: string): Range[] {\n const originalRanges = range.split(',').map(parse);\n const ranges: Range[] = [];\n for (let i = 0; i < originalRanges.length;) {\n if (\n i + 1 < originalRanges.length &&\n originalRanges[i].operator === PGTE &&\n originalRanges[i + 1].operator === GTE\n ) {\n ranges.push({\n ...originalRanges[i],\n companion: originalRanges[i + 1],\n });\n i += 2;\n } else {\n ranges.push(originalRanges[i]);\n i++;\n }\n }\n return ranges;\n}\n\n/**\n * Stringifies a list of range parts into a comma-separated string,\n * with special treatment for a pair of `~>` and `>=` parts.\n */\nexport function stringifyRanges(ranges: Range[]): string {\n return ranges\n .map((r) => {\n if (r.companion) {\n return `${r.operator}${r.delimiter}${r.version}, ${r.companion.operator}${r.companion.delimiter}${r.companion.version}`;\n }\n return `${r.operator}${r.delimiter}${r.version}`;\n })\n .join(', ');\n}\n\ntype GemRequirement = [string, Version];\n\nfunction ltr(version: string, range: string): boolean {\n const gemVersion = create(version);\n if (!gemVersion) {\n logger.warn({ version }, `Invalid ruby version`);\n return false;\n }\n const requirements: GemRequirement[] = range.split(',').map(_parse);\n\n const results = requirements.map(([operator, ver]) => {\n switch (operator) {\n case GT:\n case LT:\n return gemVersion.compare(ver) <= 0;\n case GTE:\n case LTE:\n case EQUAL:\n case NOT_EQUAL:\n return gemVersion.compare(ver) < 0;\n case PGTE:\n return (\n gemVersion.compare(ver) < 0 &&\n gemVersion.release().compare(ver.bump()) <= 0\n );\n // istanbul ignore next\n default:\n logger.warn({ operator }, `Unsupported operator`);\n return false;\n }\n });\n\n return results.reduce((accumulator, value) => accumulator && value, true);\n}\n\nexport { ltr, parse };\n"],"mappings":";;;;;;AASA,SAASA,QAAM,OAAsB;CACnC,MAAM,SAAS,MACb,qEACF;CAEA,MAAM,SAAS,SAAS,GAAA,CAAI,KAAK;CAEjC,MAAM,QAAQ,OAAO,KAAK,KAAK;CAC/B,IAAI,OAAO,QAAQ;EACjB,MAAM,EAAE,SAAS,WAAW,IAAI,cAAc,MAAM;EACpD,OAAO;GAAE;GAAS;GAAU;EAAU;CACxC;CAEA,OAAO;EACL,SAAS;EACT,UAAU;EACV,WAAW;CACb;AACF;;AAGA,SAAgB,eAAe,KAAa,OAAuB;CACjE,IAAI,MAAM,WACR,OACE,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS,KAClD,eAAe,KAAK,MAAM,SAAS;CAGvC,OAAO,UAAU,KAAK,GAAG,MAAM,WAAW,MAAM,SAAS;AAC3D;;;;;AAMA,SAAgB,YAAY,OAAwB;CAClD,MAAM,iBAAiB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIA,OAAK;CACjD,MAAM,SAAkB,CAAC;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,eAAe,SACjC,IACE,IAAI,IAAI,eAAe,UACvB,eAAe,EAAE,CAAC,aAAA,QAClB,eAAe,IAAI,EAAE,CAAC,aAAA,MACtB;EACA,OAAO,KAAK;GACV,GAAG,eAAe;GAClB,WAAW,eAAe,IAAI;EAChC,CAAC;EACD,KAAK;CACP,OAAO;EACL,OAAO,KAAK,eAAe,EAAE;EAC7B;CACF;CAEF,OAAO;AACT;;;;;AAMA,SAAgB,gBAAgB,QAAyB;CACvD,OAAO,OACJ,KAAK,MAAM;EACV,IAAI,EAAE,WACJ,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,IAAI,EAAE,UAAU,WAAW,EAAE,UAAU,YAAY,EAAE,UAAU;EAEhH,OAAO,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE;CACzC,CAAC,CAAC,CACD,KAAK,IAAI;AACd;AAIA,SAAS,IAAI,SAAiB,OAAwB;CACpD,MAAM,aAAa,OAAO,OAAO;CACjC,IAAI,CAAC,YAAY;EACf,OAAO,KAAK,EAAE,QAAQ,GAAG,sBAAsB;EAC/C,OAAO;CACT;CAyBA,OAxBuC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAIC,KAEjC,CAAC,CAAC,KAAK,CAAC,UAAU,SAAS;EACpD,QAAQ,UAAR;GACE,KAAA;GACA,KAAA,KACE,OAAO,WAAW,QAAQ,GAAG,KAAK;GACpC,KAAA;GACA,KAAA;GACA,KAAA;GACA,KAAA,MACE,OAAO,WAAW,QAAQ,GAAG,IAAI;GACnC,KAAA,MACE,OACE,WAAW,QAAQ,GAAG,IAAI,KAC1B,WAAW,QAAQ,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK;;GAGhD;IACE,OAAO,KAAK,EAAE,SAAS,GAAG,sBAAsB;IAChD,OAAO;EACX;CACF,CAEa,CAAC,CAAC,QAAQ,aAAa,UAAU,eAAe,OAAO,IAAI;AAC1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"redis.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/redis.ts"],"sourcesContent":["import type { RedisClusterOptions } from '@redis/client';\nimport { RESP_TYPES, createClient, createCluster } from '@redis/client';\nimport { logger } from '../../../../logger/index.ts';\nimport { regEx } from '../../../regex.ts';\nimport { parseUrl } from '../../../url.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\nexport function normalizeRedisUrl(url: string): string {\n return url.replace(\n regEx(/^(?<scheme>rediss?)\\+cluster:\\/\\//),\n '$<scheme>://',\n );\n}\n\ntype RedisClient =\n | ReturnType<typeof createClient>\n | ReturnType<typeof createCluster>;\n\ninterface RedisBinaryClient {\n get(key: string): Promise<Buffer | null>;\n}\n\nexport class PackageCacheRedis extends PackageCacheBase {\n static async create(\n url: string,\n prefix: string | undefined,\n ): Promise<PackageCacheRedis> {\n const rprefix = prefix ?? '';\n logger.debug('Redis cache init');\n\n const rewrittenUrl = normalizeRedisUrl(url);\n const clusteredMode = rewrittenUrl !== url;\n\n const config = {\n url: rewrittenUrl,\n socket: {\n reconnectStrategy: (retries: number) => Math.min(retries * 100, 3000),\n },\n pingInterval: 30000,\n };\n\n let client: RedisClient;\n\n if (clusteredMode) {\n const clusterConfig: RedisClusterOptions = { rootNodes: [config] };\n\n const parsedUrl = parseUrl(rewrittenUrl);\n if (parsedUrl?.username) {\n clusterConfig.defaults = {\n username: parsedUrl.username,\n };\n }\n\n if (parsedUrl?.password) {\n clusterConfig.defaults ??= {};\n clusterConfig.defaults.password = parsedUrl.password;\n }\n\n client = createCluster(clusterConfig);\n } else {\n client = createClient(config);\n }\n\n await client.connect();\n logger.debug('Redis cache connected');\n const binaryClient = client.withTypeMapping({\n [RESP_TYPES.BLOB_STRING]: Buffer,\n }) as RedisBinaryClient;\n return new PackageCacheRedis(client, binaryClient, rprefix);\n }\n\n private readonly client: RedisClient;\n private readonly binaryClient: RedisBinaryClient;\n private readonly rprefix: string;\n\n private constructor(\n client: RedisClient,\n binaryClient: RedisBinaryClient,\n rprefix: string,\n ) {\n super();\n this.client = client;\n this.binaryClient = binaryClient;\n this.rprefix = rprefix;\n }\n\n private getKey(namespace: PackageCacheNamespace, key: string): string {\n return `${this.rprefix}${namespace}-${key}`;\n }\n\n override destroy(): Promise<void> {\n try {\n // https://github.com/redis/node-redis#disconnecting\n this.client.destroy();\n } catch (err) {\n logger.warn({ err }, 'Redis cache destroy failed');\n }\n return Promise.resolve();\n }\n\n protected override async readRaw(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<Buffer | undefined> {\n const raw = await this.binaryClient.get(this.getKey(namespace, key));\n\n return raw ?? undefined;\n }\n\n protected override async writeRaw(\n namespace: PackageCacheNamespace,\n key: string,\n data: Buffer,\n ttlSeconds: number,\n ): Promise<void> {\n await this.client.set(this.getKey(namespace, key), data, {\n EX: ttlSeconds,\n });\n }\n\n protected override async rm(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<void> {\n logger.trace(\n { rprefix: this.rprefix, namespace, key },\n 'Removing cache entry',\n );\n await this.client.del(this.getKey(namespace, key));\n }\n}\n"],"mappings":";;;;;;AAQA,SAAgB,kBAAkB,KAAqB;CACrD,OAAO,IAAI,QACT,MAAM,mCAAmC,GACzC,cACF;AACF;AAUA,IAAa,oBAAb,MAAa,0BAA0B,iBAAiB;CACtD,aAAa,OACX,KACA,QAC4B;EAC5B,MAAM,UAAU,UAAU;EAC1B,OAAO,MAAM,kBAAkB;EAE/B,MAAM,eAAe,kBAAkB,GAAG;EAC1C,MAAM,gBAAgB,iBAAiB;EAEvC,MAAM,SAAS;GACb,KAAK;GACL,QAAQ,EACN,oBAAoB,YAAoB,KAAK,IAAI,UAAU,KAAK,GAAI,EACtE;GACA,cAAc;EAChB;EAEA,IAAI;EAEJ,IAAI,eAAe;GACjB,MAAM,gBAAqC,EAAE,WAAW,CAAC,MAAM,EAAE;GAEjE,MAAM,YAAY,SAAS,YAAY;GACvC,IAAI,WAAW,UACb,cAAc,WAAW,EACvB,UAAU,UAAU,SACtB;GAGF,IAAI,WAAW,UAAU;IACvB,cAAc,aAAa,CAAC;IAC5B,cAAc,SAAS,WAAW,UAAU;GAC9C;GAEA,SAAS,cAAc,aAAa;EACtC,OACE,SAAS,aAAa,MAAM;EAG9B,MAAM,OAAO,QAAQ;EACrB,OAAO,MAAM,uBAAuB;EACpC,MAAM,eAAe,OAAO,gBAAgB,GACzC,WAAW,cAAc,OAC5B,CAAC;EACD,OAAO,IAAI,kBAAkB,QAAQ,cAAc,OAAO;CAC5D;CAEA;CACA;CACA;CAEA,YACE,QACA,cACA,SACA;EACA,MAAM;EACN,KAAK,SAAS;EACd,KAAK,eAAe;EACpB,KAAK,UAAU;CACjB;CAEA,OAAe,WAAkC,KAAqB;EACpE,OAAO,GAAG,KAAK,UAAU,UAAU,GAAG;CACxC;CAEA,UAAkC;EAChC,IAAI;GAEF,KAAK,OAAO,QAAQ;EACtB,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,4BAA4B;EACnD;EACA,OAAO,QAAQ,QAAQ;CACzB;CAEA,MAAyB,QACvB,WACA,KAC6B;EAG7B,OAAO,MAFW,KAAK,aAAa,IAAI,KAAK,OAAO,WAAW,GAAG,CAAC,KAErD,KAAA;CAChB;CAEA,MAAyB,SACvB,WACA,KACA,MACA,YACe;EACf,MAAM,KAAK,OAAO,IAAI,KAAK,OAAO,WAAW,GAAG,GAAG,MAAM,EACvD,IAAI,WACN,CAAC;CACH;CAEA,MAAyB,GACvB,WACA,KACe;EACf,OAAO,MACL;GAAE,SAAS,KAAK;GAAS;GAAW;EAAI,GACxC,sBACF;EACA,MAAM,KAAK,OAAO,IAAI,KAAK,OAAO,WAAW,GAAG,CAAC;CACnD;AACF"}
1
+ {"version":3,"file":"redis.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/redis.ts"],"sourcesContent":["import type { RedisClusterOptions } from '@redis/client';\nimport { RESP_TYPES, createClient, createCluster } from '@redis/client';\nimport { logger } from '../../../../logger/index.ts';\nimport { regEx } from '../../../regex.ts';\nimport { parseUrl } from '../../../url.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\nexport function normalizeRedisUrl(url: string): string {\n return url.replace(\n regEx(/^(?<scheme>rediss?)\\+cluster:\\/\\//),\n '$<scheme>://',\n );\n}\n\ntype RedisClient =\n ReturnType<typeof createClient> | ReturnType<typeof createCluster>;\n\ninterface RedisBinaryClient {\n get(key: string): Promise<Buffer | null>;\n}\n\nexport class PackageCacheRedis extends PackageCacheBase {\n static async create(\n url: string,\n prefix: string | undefined,\n ): Promise<PackageCacheRedis> {\n const rprefix = prefix ?? '';\n logger.debug('Redis cache init');\n\n const rewrittenUrl = normalizeRedisUrl(url);\n const clusteredMode = rewrittenUrl !== url;\n\n const config = {\n url: rewrittenUrl,\n socket: {\n reconnectStrategy: (retries: number) => Math.min(retries * 100, 3000),\n },\n pingInterval: 30000,\n };\n\n let client: RedisClient;\n\n if (clusteredMode) {\n const clusterConfig: RedisClusterOptions = { rootNodes: [config] };\n\n const parsedUrl = parseUrl(rewrittenUrl);\n if (parsedUrl?.username) {\n clusterConfig.defaults = {\n username: parsedUrl.username,\n };\n }\n\n if (parsedUrl?.password) {\n clusterConfig.defaults ??= {};\n clusterConfig.defaults.password = parsedUrl.password;\n }\n\n client = createCluster(clusterConfig);\n } else {\n client = createClient(config);\n }\n\n await client.connect();\n logger.debug('Redis cache connected');\n const binaryClient = client.withTypeMapping({\n [RESP_TYPES.BLOB_STRING]: Buffer,\n }) as RedisBinaryClient;\n return new PackageCacheRedis(client, binaryClient, rprefix);\n }\n\n private readonly client: RedisClient;\n private readonly binaryClient: RedisBinaryClient;\n private readonly rprefix: string;\n\n private constructor(\n client: RedisClient,\n binaryClient: RedisBinaryClient,\n rprefix: string,\n ) {\n super();\n this.client = client;\n this.binaryClient = binaryClient;\n this.rprefix = rprefix;\n }\n\n private getKey(namespace: PackageCacheNamespace, key: string): string {\n return `${this.rprefix}${namespace}-${key}`;\n }\n\n override destroy(): Promise<void> {\n try {\n // https://github.com/redis/node-redis#disconnecting\n this.client.destroy();\n } catch (err) {\n logger.warn({ err }, 'Redis cache destroy failed');\n }\n return Promise.resolve();\n }\n\n protected override async readRaw(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<Buffer | undefined> {\n const raw = await this.binaryClient.get(this.getKey(namespace, key));\n\n return raw ?? undefined;\n }\n\n protected override async writeRaw(\n namespace: PackageCacheNamespace,\n key: string,\n data: Buffer,\n ttlSeconds: number,\n ): Promise<void> {\n await this.client.set(this.getKey(namespace, key), data, {\n EX: ttlSeconds,\n });\n }\n\n protected override async rm(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<void> {\n logger.trace(\n { rprefix: this.rprefix, namespace, key },\n 'Removing cache entry',\n );\n await this.client.del(this.getKey(namespace, key));\n }\n}\n"],"mappings":";;;;;;AAQA,SAAgB,kBAAkB,KAAqB;CACrD,OAAO,IAAI,QACT,MAAM,mCAAmC,GACzC,cACF;AACF;AASA,IAAa,oBAAb,MAAa,0BAA0B,iBAAiB;CACtD,aAAa,OACX,KACA,QAC4B;EAC5B,MAAM,UAAU,UAAU;EAC1B,OAAO,MAAM,kBAAkB;EAE/B,MAAM,eAAe,kBAAkB,GAAG;EAC1C,MAAM,gBAAgB,iBAAiB;EAEvC,MAAM,SAAS;GACb,KAAK;GACL,QAAQ,EACN,oBAAoB,YAAoB,KAAK,IAAI,UAAU,KAAK,GAAI,EACtE;GACA,cAAc;EAChB;EAEA,IAAI;EAEJ,IAAI,eAAe;GACjB,MAAM,gBAAqC,EAAE,WAAW,CAAC,MAAM,EAAE;GAEjE,MAAM,YAAY,SAAS,YAAY;GACvC,IAAI,WAAW,UACb,cAAc,WAAW,EACvB,UAAU,UAAU,SACtB;GAGF,IAAI,WAAW,UAAU;IACvB,cAAc,aAAa,CAAC;IAC5B,cAAc,SAAS,WAAW,UAAU;GAC9C;GAEA,SAAS,cAAc,aAAa;EACtC,OACE,SAAS,aAAa,MAAM;EAG9B,MAAM,OAAO,QAAQ;EACrB,OAAO,MAAM,uBAAuB;EACpC,MAAM,eAAe,OAAO,gBAAgB,GACzC,WAAW,cAAc,OAC5B,CAAC;EACD,OAAO,IAAI,kBAAkB,QAAQ,cAAc,OAAO;CAC5D;CAEA;CACA;CACA;CAEA,YACE,QACA,cACA,SACA;EACA,MAAM;EACN,KAAK,SAAS;EACd,KAAK,eAAe;EACpB,KAAK,UAAU;CACjB;CAEA,OAAe,WAAkC,KAAqB;EACpE,OAAO,GAAG,KAAK,UAAU,UAAU,GAAG;CACxC;CAEA,UAAkC;EAChC,IAAI;GAEF,KAAK,OAAO,QAAQ;EACtB,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,4BAA4B;EACnD;EACA,OAAO,QAAQ,QAAQ;CACzB;CAEA,MAAyB,QACvB,WACA,KAC6B;EAG7B,OAAO,MAFW,KAAK,aAAa,IAAI,KAAK,OAAO,WAAW,GAAG,CAAC,KAErD,KAAA;CAChB;CAEA,MAAyB,SACvB,WACA,KACA,MACA,YACe;EACf,MAAM,KAAK,OAAO,IAAI,KAAK,OAAO,WAAW,GAAG,GAAG,MAAM,EACvD,IAAI,WACN,CAAC;CACH;CAEA,MAAyB,GACvB,WACA,KACe;EACf,OAAO,MACL;GAAE,SAAS,KAAK;GAAS;GAAW;EAAI,GACxC,sBACF;EACA,MAAM,KAAK,OAAO,IAAI,KAAK,OAAO,WAAW,GAAG,CAAC;CACnD;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/sqlite.ts"],"sourcesContent":["import type { DatabaseSync, StatementSync } from 'node:sqlite';\n// oxlint-disable-next-line renovate/prefer-fs-util -- create() runs during global initialization with cacheDir passed as an explicit argument, before GlobalConfig (which the scoped cache helpers resolve against) contains cacheDir\nimport fs from 'fs-extra';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { getEnv } from '../../../env.ts';\nimport { ensureDir } from '../../../fs/index.ts';\nimport { parseInteger } from '../../../number.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\nconst { exists } = fs;\n\nexport class PackageCacheSqlite extends PackageCacheBase {\n static async create(cacheDir: string): Promise<PackageCacheSqlite> {\n const { DatabaseSync: Sqlite } = await import('node:sqlite');\n const sqliteDir = upath.join(cacheDir, 'renovate/renovate-cache-sqlite');\n await ensureDir(sqliteDir);\n const sqliteFile = upath.join(sqliteDir, 'db.sqlite');\n\n if (await exists(sqliteFile)) {\n logger.debug(`Using SQLite package cache: ${sqliteFile}`);\n } else {\n logger.debug(`Creating SQLite package cache: ${sqliteFile}`);\n }\n\n const { RENOVATE_X_SQLITE_BUSY_TIMEOUT } = getEnv();\n const timeout = parseInteger(RENOVATE_X_SQLITE_BUSY_TIMEOUT, 5000);\n\n const client = new Sqlite(sqliteFile, { timeout });\n return new PackageCacheSqlite(client);\n }\n\n private readonly upsertStatement: StatementSync;\n private readonly getStatement: StatementSync;\n private readonly deleteStatement: StatementSync;\n private readonly deleteExpiredRows: StatementSync;\n private readonly countStatement: StatementSync;\n\n readonly client: DatabaseSync;\n\n private constructor(client: DatabaseSync) {\n super();\n this.client = client;\n client.exec('PRAGMA journal_mode = WAL');\n client.exec(\"PRAGMA encoding = 'UTF-8'\");\n\n client.exec(\n `\n CREATE TABLE IF NOT EXISTS package_cache (\n namespace TEXT NOT NULL,\n key TEXT NOT NULL,\n expiry INTEGER NOT NULL,\n data BLOB NOT NULL,\n PRIMARY KEY (namespace, key)\n )\n `,\n );\n client.exec('CREATE INDEX IF NOT EXISTS expiry ON package_cache (expiry)');\n\n this.upsertStatement = client.prepare(`\n INSERT INTO package_cache (namespace, key, data, expiry)\n VALUES (@namespace, @key, @data, unixepoch() + @ttlSeconds)\n ON CONFLICT (namespace, key) DO UPDATE SET\n data = @data,\n expiry = unixepoch() + @ttlSeconds\n `);\n\n this.getStatement = client.prepare(\n `\n SELECT data FROM package_cache\n WHERE\n namespace = @namespace AND key = @key AND expiry > unixepoch()\n `,\n );\n\n this.deleteStatement = client.prepare(`\n DELETE FROM package_cache\n WHERE namespace = @namespace AND key = @key\n `);\n\n this.deleteExpiredRows = client.prepare(`\n DELETE FROM package_cache\n WHERE expiry <= unixepoch()\n `);\n\n this.countStatement = client.prepare(\n 'SELECT COUNT(*) as total FROM package_cache',\n );\n }\n\n protected override writeRaw(\n namespace: PackageCacheNamespace,\n key: string,\n data: Buffer,\n ttlSeconds: number,\n ): void {\n this.upsertStatement.run({\n namespace,\n key,\n data,\n ttlSeconds,\n });\n }\n\n protected override readRaw(\n namespace: PackageCacheNamespace,\n key: string,\n ): Buffer | undefined {\n const row = this.getStatement.get({ namespace, key }) as\n | { data: Uint8Array }\n | undefined;\n\n if (!row) {\n return undefined;\n }\n\n // `Buffer.from(row.data)` copies the whole payload.\n // This call does zero copy.\n return Buffer.from(\n row.data.buffer,\n row.data.byteOffset,\n row.data.byteLength,\n );\n }\n\n protected override rm(namespace: PackageCacheNamespace, key: string): void {\n logger.trace({ namespace, key }, 'Removing cache entry');\n this.deleteStatement.run({ namespace, key });\n }\n\n override destroy(): Promise<void> {\n try {\n const startTime = Date.now();\n // `COUNT(*)` is always returning a row\n const totalCount = this.countStatement.get()!.total as number;\n const { changes: deletedCount } = this.deleteExpiredRows.run();\n const durationMs = Date.now() - startTime;\n logger.debug(\n `SQLite package cache: deleted ${deletedCount} of ${totalCount} entries in ${durationMs}ms`,\n );\n } catch (err) {\n logger.warn({ err }, 'SQLite package cache cleanup failed');\n }\n\n try {\n this.client.close();\n } catch (err) {\n logger.warn({ err }, 'SQLite package cache close failed');\n }\n\n return Promise.resolve();\n }\n}\n"],"mappings":";;;;;;;;AAWA,MAAM,EAAE,WAAW;AAEnB,IAAa,qBAAb,MAAa,2BAA2B,iBAAiB;CACvD,aAAa,OAAO,UAA+C;EACjE,MAAM,EAAE,cAAc,WAAW,MAAM,OAAO;EAC9C,MAAM,YAAY,MAAM,KAAK,UAAU,gCAAgC;EACvE,MAAM,UAAU,SAAS;EACzB,MAAM,aAAa,MAAM,KAAK,WAAW,WAAW;EAEpD,IAAI,MAAM,OAAO,UAAU,GACzB,OAAO,MAAM,+BAA+B,YAAY;OAExD,OAAO,MAAM,kCAAkC,YAAY;EAG7D,MAAM,EAAE,mCAAmC,OAAO;EAGlD,MAAM,SAAS,IAAI,OAAO,YAAY,EAAE,SAFxB,aAAa,gCAAgC,GAEf,EAAE,CAAC;EACjD,OAAO,IAAI,mBAAmB,MAAM;CACtC;CAEA;CACA;CACA;CACA;CACA;CAEA;CAEA,YAAoB,QAAsB;EACxC,MAAM;EACN,KAAK,SAAS;EACd,OAAO,KAAK,2BAA2B;EACvC,OAAO,KAAK,2BAA2B;EAEvC,OAAO,KACL;;;;;;;;SASF;EACA,OAAO,KAAK,6DAA6D;EAEzE,KAAK,kBAAkB,OAAO,QAAQ;;;;;;KAMrC;EAED,KAAK,eAAe,OAAO,QACzB;;;;SAKF;EAEA,KAAK,kBAAkB,OAAO,QAAQ;;;KAGrC;EAED,KAAK,oBAAoB,OAAO,QAAQ;;;KAGvC;EAED,KAAK,iBAAiB,OAAO,QAC3B,6CACF;CACF;CAEA,SACE,WACA,KACA,MACA,YACM;EACN,KAAK,gBAAgB,IAAI;GACvB;GACA;GACA;GACA;EACF,CAAC;CACH;CAEA,QACE,WACA,KACoB;EACpB,MAAM,MAAM,KAAK,aAAa,IAAI;GAAE;GAAW;EAAI,CAAC;EAIpD,IAAI,CAAC,KACH;EAKF,OAAO,OAAO,KACZ,IAAI,KAAK,QACT,IAAI,KAAK,YACT,IAAI,KAAK,UACX;CACF;CAEA,GAAsB,WAAkC,KAAmB;EACzE,OAAO,MAAM;GAAE;GAAW;EAAI,GAAG,sBAAsB;EACvD,KAAK,gBAAgB,IAAI;GAAE;GAAW;EAAI,CAAC;CAC7C;CAEA,UAAkC;EAChC,IAAI;GACF,MAAM,YAAY,KAAK,IAAI;GAE3B,MAAM,aAAa,KAAK,eAAe,IAAI,CAAC,CAAE;GAC9C,MAAM,EAAE,SAAS,iBAAiB,KAAK,kBAAkB,IAAI;GAC7D,MAAM,aAAa,KAAK,IAAI,IAAI;GAChC,OAAO,MACL,iCAAiC,aAAa,MAAM,WAAW,cAAc,WAAW,GAC1F;EACF,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,qCAAqC;EAC5D;EAEA,IAAI;GACF,KAAK,OAAO,MAAM;EACpB,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,mCAAmC;EAC1D;EAEA,OAAO,QAAQ,QAAQ;CACzB;AACF"}
1
+ {"version":3,"file":"sqlite.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/sqlite.ts"],"sourcesContent":["import type { DatabaseSync, StatementSync } from 'node:sqlite';\n// oxlint-disable-next-line renovate/prefer-fs-util -- create() runs during global initialization with cacheDir passed as an explicit argument, before GlobalConfig (which the scoped cache helpers resolve against) contains cacheDir\nimport fs from 'fs-extra';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { getEnv } from '../../../env.ts';\nimport { ensureDir } from '../../../fs/index.ts';\nimport { parseInteger } from '../../../number.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\nconst { exists } = fs;\n\nexport class PackageCacheSqlite extends PackageCacheBase {\n static async create(cacheDir: string): Promise<PackageCacheSqlite> {\n const { DatabaseSync: Sqlite } = await import('node:sqlite');\n const sqliteDir = upath.join(cacheDir, 'renovate/renovate-cache-sqlite');\n await ensureDir(sqliteDir);\n const sqliteFile = upath.join(sqliteDir, 'db.sqlite');\n\n if (await exists(sqliteFile)) {\n logger.debug(`Using SQLite package cache: ${sqliteFile}`);\n } else {\n logger.debug(`Creating SQLite package cache: ${sqliteFile}`);\n }\n\n const { RENOVATE_X_SQLITE_BUSY_TIMEOUT } = getEnv();\n const timeout = parseInteger(RENOVATE_X_SQLITE_BUSY_TIMEOUT, 5000);\n\n const client = new Sqlite(sqliteFile, { timeout });\n return new PackageCacheSqlite(client);\n }\n\n private readonly upsertStatement: StatementSync;\n private readonly getStatement: StatementSync;\n private readonly deleteStatement: StatementSync;\n private readonly deleteExpiredRows: StatementSync;\n private readonly countStatement: StatementSync;\n\n readonly client: DatabaseSync;\n\n private constructor(client: DatabaseSync) {\n super();\n this.client = client;\n client.exec('PRAGMA journal_mode = WAL');\n client.exec(\"PRAGMA encoding = 'UTF-8'\");\n\n client.exec(\n `\n CREATE TABLE IF NOT EXISTS package_cache (\n namespace TEXT NOT NULL,\n key TEXT NOT NULL,\n expiry INTEGER NOT NULL,\n data BLOB NOT NULL,\n PRIMARY KEY (namespace, key)\n )\n `,\n );\n client.exec('CREATE INDEX IF NOT EXISTS expiry ON package_cache (expiry)');\n\n this.upsertStatement = client.prepare(`\n INSERT INTO package_cache (namespace, key, data, expiry)\n VALUES (@namespace, @key, @data, unixepoch() + @ttlSeconds)\n ON CONFLICT (namespace, key) DO UPDATE SET\n data = @data,\n expiry = unixepoch() + @ttlSeconds\n `);\n\n this.getStatement = client.prepare(\n `\n SELECT data FROM package_cache\n WHERE\n namespace = @namespace AND key = @key AND expiry > unixepoch()\n `,\n );\n\n this.deleteStatement = client.prepare(`\n DELETE FROM package_cache\n WHERE namespace = @namespace AND key = @key\n `);\n\n this.deleteExpiredRows = client.prepare(`\n DELETE FROM package_cache\n WHERE expiry <= unixepoch()\n `);\n\n this.countStatement = client.prepare(\n 'SELECT COUNT(*) as total FROM package_cache',\n );\n }\n\n protected override writeRaw(\n namespace: PackageCacheNamespace,\n key: string,\n data: Buffer,\n ttlSeconds: number,\n ): void {\n this.upsertStatement.run({\n namespace,\n key,\n data,\n ttlSeconds,\n });\n }\n\n protected override readRaw(\n namespace: PackageCacheNamespace,\n key: string,\n ): Buffer | undefined {\n const row = this.getStatement.get({ namespace, key }) as\n { data: Uint8Array } | undefined;\n\n if (!row) {\n return undefined;\n }\n\n // `Buffer.from(row.data)` copies the whole payload.\n // This call does zero copy.\n return Buffer.from(\n row.data.buffer,\n row.data.byteOffset,\n row.data.byteLength,\n );\n }\n\n protected override rm(namespace: PackageCacheNamespace, key: string): void {\n logger.trace({ namespace, key }, 'Removing cache entry');\n this.deleteStatement.run({ namespace, key });\n }\n\n override destroy(): Promise<void> {\n try {\n const startTime = Date.now();\n // `COUNT(*)` is always returning a row\n const totalCount = this.countStatement.get()!.total as number;\n const { changes: deletedCount } = this.deleteExpiredRows.run();\n const durationMs = Date.now() - startTime;\n logger.debug(\n `SQLite package cache: deleted ${deletedCount} of ${totalCount} entries in ${durationMs}ms`,\n );\n } catch (err) {\n logger.warn({ err }, 'SQLite package cache cleanup failed');\n }\n\n try {\n this.client.close();\n } catch (err) {\n logger.warn({ err }, 'SQLite package cache close failed');\n }\n\n return Promise.resolve();\n }\n}\n"],"mappings":";;;;;;;;AAWA,MAAM,EAAE,WAAW;AAEnB,IAAa,qBAAb,MAAa,2BAA2B,iBAAiB;CACvD,aAAa,OAAO,UAA+C;EACjE,MAAM,EAAE,cAAc,WAAW,MAAM,OAAO;EAC9C,MAAM,YAAY,MAAM,KAAK,UAAU,gCAAgC;EACvE,MAAM,UAAU,SAAS;EACzB,MAAM,aAAa,MAAM,KAAK,WAAW,WAAW;EAEpD,IAAI,MAAM,OAAO,UAAU,GACzB,OAAO,MAAM,+BAA+B,YAAY;OAExD,OAAO,MAAM,kCAAkC,YAAY;EAG7D,MAAM,EAAE,mCAAmC,OAAO;EAGlD,MAAM,SAAS,IAAI,OAAO,YAAY,EAAE,SAFxB,aAAa,gCAAgC,GAEf,EAAE,CAAC;EACjD,OAAO,IAAI,mBAAmB,MAAM;CACtC;CAEA;CACA;CACA;CACA;CACA;CAEA;CAEA,YAAoB,QAAsB;EACxC,MAAM;EACN,KAAK,SAAS;EACd,OAAO,KAAK,2BAA2B;EACvC,OAAO,KAAK,2BAA2B;EAEvC,OAAO,KACL;;;;;;;;SASF;EACA,OAAO,KAAK,6DAA6D;EAEzE,KAAK,kBAAkB,OAAO,QAAQ;;;;;;KAMrC;EAED,KAAK,eAAe,OAAO,QACzB;;;;SAKF;EAEA,KAAK,kBAAkB,OAAO,QAAQ;;;KAGrC;EAED,KAAK,oBAAoB,OAAO,QAAQ;;;KAGvC;EAED,KAAK,iBAAiB,OAAO,QAC3B,6CACF;CACF;CAEA,SACE,WACA,KACA,MACA,YACM;EACN,KAAK,gBAAgB,IAAI;GACvB;GACA;GACA;GACA;EACF,CAAC;CACH;CAEA,QACE,WACA,KACoB;EACpB,MAAM,MAAM,KAAK,aAAa,IAAI;GAAE;GAAW;EAAI,CAAC;EAGpD,IAAI,CAAC,KACH;EAKF,OAAO,OAAO,KACZ,IAAI,KAAK,QACT,IAAI,KAAK,YACT,IAAI,KAAK,UACX;CACF;CAEA,GAAsB,WAAkC,KAAmB;EACzE,OAAO,MAAM;GAAE;GAAW;EAAI,GAAG,sBAAsB;EACvD,KAAK,gBAAgB,IAAI;GAAE;GAAW;EAAI,CAAC;CAC7C;CAEA,UAAkC;EAChC,IAAI;GACF,MAAM,YAAY,KAAK,IAAI;GAE3B,MAAM,aAAa,KAAK,eAAe,IAAI,CAAC,CAAE;GAC9C,MAAM,EAAE,SAAS,iBAAiB,KAAK,kBAAkB,IAAI;GAC7D,MAAM,aAAa,KAAK,IAAI,IAAI;GAChC,OAAO,MACL,iCAAiC,aAAa,MAAM,WAAW,cAAc,WAAW,GAC1F;EACF,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,qCAAqC;EAC5D;EAEA,IAAI;GACF,KAAK,OAAO,MAAM;EACpB,SAAS,KAAK;GACZ,OAAO,KAAK,EAAE,IAAI,GAAG,mCAAmC;EAC1D;EAEA,OAAO,QAAQ,QAAQ;CACzB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"namespaces.js","names":[],"sources":["../../../../lib/util/cache/package/namespaces.ts"],"sourcesContent":["// v8 ignore file -- constant namespace list, no executable logic to cover\n/* IMPORTANT:\n * These namespaces below are used as part of the cacheTtlOverride feature\n * It's OK to add to them (e.g. for new datasources) but we should avoid\n * backwards-incompatible changes in non-major releases\n */\n\nexport const packageCacheNamespaces = [\n '_test-namespace',\n 'changelog-bitbucket-notes@v2',\n 'changelog-bitbucket-release',\n 'changelog-bitbucket-server-notes@v2',\n 'changelog-bitbucket-server-release',\n 'changelog-forgejo-notes@v2',\n 'changelog-forgejo-release',\n 'changelog-gitea-notes@v2',\n 'changelog-gitea-release',\n 'changelog-github-notes@v2',\n 'changelog-github-release',\n 'changelog-gitlab-notes@v2',\n 'changelog-gitlab-release',\n 'datasource-apk',\n 'datasource-artifactory',\n 'datasource-aws-machine-image',\n 'datasource-aws-rds',\n 'datasource-aws-eks-addon',\n 'datasource-azure-bicep-resource',\n 'datasource-azure-pipelines-tasks',\n 'datasource-azure-tags',\n 'datasource-bazel',\n 'datasource-bitbucket-tags',\n 'datasource-bitbucket-server-tags',\n 'datasource-bitrise',\n 'datasource-buildpacks-registry',\n 'datasource-cdnjs',\n 'datasource-conan',\n 'datasource-conda',\n 'datasource-cpan',\n 'datasource-crate-metadata',\n 'datasource-crate',\n 'datasource-deb',\n 'datasource-deno',\n 'datasource-docker-architecture',\n 'datasource-docker-hub-cache',\n 'datasource-docker-digest',\n 'datasource-docker-hub-tags',\n 'datasource-docker-imageconfig',\n 'datasource-docker-labels',\n 'datasource-docker-releases-v2',\n 'datasource-docker-tags',\n 'datasource-dotnet-version',\n 'datasource-elm-package',\n 'datasource-endoflife-date',\n 'datasource-galaxy-collection',\n 'datasource-galaxy',\n 'datasource-git-refs',\n 'datasource-git-tags',\n 'datasource-git',\n 'datasource-forgejo-releases',\n 'datasource-forgejo-tags',\n 'datasource-gitea-releases',\n 'datasource-gitea-tags',\n 'datasource-github-digest',\n 'datasource-github-release-attachments',\n 'datasource-gitlab-packages',\n 'datasource-gitlab-releases',\n 'datasource-gitlab-tags',\n 'datasource-glasskube-packages',\n 'datasource-go-direct',\n 'datasource-go-proxy',\n 'datasource-go',\n 'datasource-golang-version',\n 'datasource-gradle-version',\n 'datasource-helm',\n 'datasource-hermit',\n 'datasource-hex',\n 'datasource-hexpm-bob',\n 'datasource-java-version',\n 'datasource-jenkins-plugins',\n 'datasource-jsr',\n 'datasource-maven:cache-provider',\n 'datasource-maven:metadata-not-found',\n 'datasource-maven:pom-cache-provider',\n 'datasource-maven:postprocess-reject',\n 'datasource-nextcloud',\n 'datasource-node-version',\n 'datasource-npm:cache-provider',\n 'datasource-nuget-v3',\n 'datasource-orb',\n 'datasource-packagist',\n 'datasource-pod',\n 'datasource-python-version',\n 'datasource-repology',\n 'datasource-rpm',\n 'datasource-ruby-version',\n 'datasource-rubygems',\n 'datasource-rust-version',\n 'datasource-sbt-package',\n 'datasource-terraform-module',\n 'datasource-terraform-provider',\n 'datasource-terraform',\n 'datasource-typst:cache-provider',\n 'datasource-typst:registry-releases',\n 'datasource-unity3d',\n 'datasource-unity3d-packages',\n 'github-branches-datasource-v1',\n 'github-releases-datasource-v2',\n 'github-tags-datasource-v2',\n 'merge-confidence',\n 'preset',\n 'terraform-provider-hash',\n 'url-sha256',\n] as const;\n\nexport type PackageCacheNamespace =\n | (typeof packageCacheNamespaces)[number]\n | `datasource-releases-${string}`;\n\nexport type CombinedKey =\n `datasource-mem:pkg-fetch:${PackageCacheNamespace}:${string}`;\n"],"mappings":";;AAOA,MAAa,yBAAyB;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"namespaces.js","names":[],"sources":["../../../../lib/util/cache/package/namespaces.ts"],"sourcesContent":["// v8 ignore file -- constant namespace list, no executable logic to cover\n/* IMPORTANT:\n * These namespaces below are used as part of the cacheTtlOverride feature\n * It's OK to add to them (e.g. for new datasources) but we should avoid\n * backwards-incompatible changes in non-major releases\n */\n\nexport const packageCacheNamespaces = [\n '_test-namespace',\n 'changelog-bitbucket-notes@v2',\n 'changelog-bitbucket-release',\n 'changelog-bitbucket-server-notes@v2',\n 'changelog-bitbucket-server-release',\n 'changelog-forgejo-notes@v2',\n 'changelog-forgejo-release',\n 'changelog-gitea-notes@v2',\n 'changelog-gitea-release',\n 'changelog-github-notes@v2',\n 'changelog-github-release',\n 'changelog-gitlab-notes@v2',\n 'changelog-gitlab-release',\n 'datasource-apk',\n 'datasource-artifactory',\n 'datasource-aws-machine-image',\n 'datasource-aws-rds',\n 'datasource-aws-eks-addon',\n 'datasource-azure-bicep-resource',\n 'datasource-azure-pipelines-tasks',\n 'datasource-azure-tags',\n 'datasource-bazel',\n 'datasource-bitbucket-tags',\n 'datasource-bitbucket-server-tags',\n 'datasource-bitrise',\n 'datasource-buildpacks-registry',\n 'datasource-cdnjs',\n 'datasource-conan',\n 'datasource-conda',\n 'datasource-cpan',\n 'datasource-crate-metadata',\n 'datasource-crate',\n 'datasource-deb',\n 'datasource-deno',\n 'datasource-docker-architecture',\n 'datasource-docker-hub-cache',\n 'datasource-docker-digest',\n 'datasource-docker-hub-tags',\n 'datasource-docker-imageconfig',\n 'datasource-docker-labels',\n 'datasource-docker-releases-v2',\n 'datasource-docker-tags',\n 'datasource-dotnet-version',\n 'datasource-elm-package',\n 'datasource-endoflife-date',\n 'datasource-galaxy-collection',\n 'datasource-galaxy',\n 'datasource-git-refs',\n 'datasource-git-tags',\n 'datasource-git',\n 'datasource-forgejo-releases',\n 'datasource-forgejo-tags',\n 'datasource-gitea-releases',\n 'datasource-gitea-tags',\n 'datasource-github-digest',\n 'datasource-github-release-attachments',\n 'datasource-gitlab-packages',\n 'datasource-gitlab-releases',\n 'datasource-gitlab-tags',\n 'datasource-glasskube-packages',\n 'datasource-go-direct',\n 'datasource-go-proxy',\n 'datasource-go',\n 'datasource-golang-version',\n 'datasource-gradle-version',\n 'datasource-helm',\n 'datasource-hermit',\n 'datasource-hex',\n 'datasource-hexpm-bob',\n 'datasource-java-version',\n 'datasource-jenkins-plugins',\n 'datasource-jsr',\n 'datasource-maven:cache-provider',\n 'datasource-maven:metadata-not-found',\n 'datasource-maven:pom-cache-provider',\n 'datasource-maven:postprocess-reject',\n 'datasource-nextcloud',\n 'datasource-node-version',\n 'datasource-npm:cache-provider',\n 'datasource-nuget-v3',\n 'datasource-orb',\n 'datasource-packagist',\n 'datasource-pod',\n 'datasource-python-version',\n 'datasource-repology',\n 'datasource-rpm',\n 'datasource-ruby-version',\n 'datasource-rubygems',\n 'datasource-rust-version',\n 'datasource-sbt-package',\n 'datasource-terraform-module',\n 'datasource-terraform-provider',\n 'datasource-terraform',\n 'datasource-typst:cache-provider',\n 'datasource-typst:registry-releases',\n 'datasource-unity3d',\n 'datasource-unity3d-packages',\n 'github-branches-datasource-v1',\n 'github-releases-datasource-v2',\n 'github-tags-datasource-v2',\n 'merge-confidence',\n 'preset',\n 'terraform-provider-hash',\n 'url-sha256',\n] as const;\n\nexport type PackageCacheNamespace =\n (typeof packageCacheNamespaces)[number] | `datasource-releases-${string}`;\n\nexport type CombinedKey =\n `datasource-mem:pkg-fetch:${PackageCacheNamespace}:${string}`;\n"],"mappings":";;AAOA,MAAa,yBAAyB;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/exec/index.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RepoToolSettingsOptions } from '../../config/types.ts';\nimport { TEMPORARY_ERROR } from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { coerceArray } from '../array.ts';\nimport { getCustomEnv, getUserEnv } from '../env.ts';\nimport { coerceObject } from '../object.ts';\nimport { rawExec } from './common.ts';\nimport { generateInstallCommands, isDynamicInstall } from './containerbase.ts';\nimport {\n generateDockerCommand,\n removeDockerContainer,\n} from './docker/index.ts';\nimport { hardcodedProcessEnv } from './env.ts';\nimport { getHermitEnvs, isHermit } from './hermit.ts';\nimport type {\n CommandWithOptions,\n DockerOptions,\n ExecOptions,\n ExecResult,\n ExtraEnv,\n Opt,\n RawExecOptions,\n} from './types.ts';\nimport { getChildEnv } from './utils.ts';\n\nfunction dockerEnvVars(extraEnv: ExtraEnv, childEnv: ExtraEnv): string[] {\n const extraEnvKeys = Object.keys(extraEnv);\n return extraEnvKeys.filter((key) => isNonEmptyString(childEnv[key]));\n}\n\nfunction getCwd({ cwd, cwdFile }: ExecOptions): string | undefined {\n // TODO: types (#22198)\n const defaultCwd = GlobalConfig.get('localDir');\n const paramCwd = cwdFile\n ? upath.join(defaultCwd, upath.dirname(cwdFile))\n : cwd;\n return paramCwd ?? defaultCwd;\n}\n\nfunction getRawExecOptions(opts: ExecOptions): RawExecOptions {\n const defaultExecutionTimeout = GlobalConfig.get('executionTimeout');\n const childEnv = getChildEnv(opts);\n const cwd = getCwd(opts);\n let timeout = opts.timeout;\n timeout ??= defaultExecutionTimeout * 60 * 1000;\n\n // Set default max buffer size to 10MB\n const maxBuffer = opts.maxBuffer ?? 10 * 1024 * 1024;\n\n return {\n cwd,\n env: childEnv,\n maxBuffer,\n timeout,\n ...(opts.shell !== undefined && { shell: opts.shell }),\n stdin: 'pipe',\n stdout: opts.ignoreStdout ? 'ignore' : 'pipe',\n stderr: 'pipe',\n };\n}\n\nfunction isDocker(docker: Opt<DockerOptions>): docker is DockerOptions {\n return GlobalConfig.get('binarySource') === 'docker' && !!docker;\n}\n\ninterface RawExecArguments {\n rawCommands: (string | CommandWithOptions)[];\n rawOptions: RawExecOptions;\n}\n\nasync function prepareRawExec(\n cmd:\n | string\n | string[]\n | CommandWithOptions[]\n | (string | CommandWithOptions)[],\n opts: ExecOptions,\n sideCarImage: string,\n): Promise<RawExecArguments> {\n const { docker } = opts;\n const preCommands = coerceArray(opts.preCommands);\n const customEnvVariables = getCustomEnv();\n const userConfiguredEnv = getUserEnv();\n const { containerbaseDir, binarySource } = GlobalConfig.get();\n\n if (binarySource === 'docker' || binarySource === 'install') {\n logger.debug(`Setting CONTAINERBASE_CACHE_DIR to ${containerbaseDir!}`);\n opts.env ??= {};\n opts.env.CONTAINERBASE_CACHE_DIR = containerbaseDir;\n }\n\n let rawOptions = getRawExecOptions(opts);\n\n let rawCommands = isString(cmd) ? [cmd] : cmd;\n\n if (isDocker(docker)) {\n logger.debug({ image: sideCarImage }, 'Using docker to execute');\n const extraEnv = {\n ...hardcodedProcessEnv,\n ...opts.extraEnv,\n ...customEnvVariables,\n ...userConfiguredEnv,\n };\n const childEnv = getChildEnv(opts);\n const envVars = [\n ...dockerEnvVars(extraEnv, childEnv),\n ...coerceArray(docker.envVars),\n 'CONTAINERBASE_CACHE_DIR',\n ];\n const cwd = getCwd(opts);\n const dockerOptions: DockerOptions = { ...docker, cwd, envVars };\n const dockerCommand = await generateDockerCommand(\n rawCommands,\n [\n ...(await generateInstallCommands(opts.toolConstraints)),\n ...preCommands,\n ],\n dockerOptions,\n sideCarImage,\n );\n rawCommands = [dockerCommand];\n } else if (isDynamicInstall(opts.toolConstraints)) {\n logger.debug('Using containerbase dynamic installs');\n rawCommands = [\n ...(await generateInstallCommands(opts.toolConstraints)),\n ...preCommands,\n ...rawCommands,\n ];\n } else if (isHermit()) {\n const hermitEnvVars = await getHermitEnvs(rawOptions);\n logger.debug(\n { hermitEnvVars },\n 'merging hermit environment variables into the execution options',\n );\n rawOptions = {\n ...rawOptions,\n env: {\n ...rawOptions.env,\n ...hermitEnvVars,\n },\n };\n }\n\n if (\n GlobalConfig.get('binarySource') === 'global' &&\n opts.toolConstraints?.length\n ) {\n logger.once.debug(\n { toolConstraints: opts.toolConstraints },\n 'Ignoring tool contraints because of `binarySource=global`',\n );\n }\n\n return { rawCommands, rawOptions };\n}\n\nexport async function exec(\n cmd:\n | string\n | string[]\n | CommandWithOptions[]\n | (string | CommandWithOptions)[],\n opts: ExecOptions = {},\n): Promise<ExecResult> {\n const { docker } = opts;\n const dockerChildPrefix = GlobalConfig.get('dockerChildPrefix');\n const sideCarImage = GlobalConfig.get('dockerSidecarImage');\n\n const { rawCommands, rawOptions } = await prepareRawExec(\n cmd,\n opts,\n sideCarImage,\n );\n const useDocker = isDocker(docker);\n\n let res: ExecResult = { stdout: '', stderr: '' };\n for (const rawCmd of rawCommands) {\n const startTime = Date.now();\n if (useDocker) {\n await removeDockerContainer(sideCarImage, dockerChildPrefix);\n }\n logger.debug(\n { command: rawCmd, env: Object.keys(coerceObject(rawOptions.env)) },\n 'Executing command',\n );\n logger.trace({ commandOptions: rawOptions }, 'Command options');\n try {\n res = await rawExec(rawCmd, rawOptions);\n } catch (err) {\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug({ err, durationMs }, 'rawExec err');\n if (useDocker) {\n await removeDockerContainer(sideCarImage, dockerChildPrefix).catch(\n (removeErr: Error) => {\n const message: string = err.message;\n throw new Error(\n `Error: \"${removeErr.message}\" - Original Error: \"${message}\"`,\n );\n },\n );\n }\n if (err.signal === `SIGTERM`) {\n logger.debug(\n { err },\n 'exec interrupted by SIGTERM - run needs to be aborted',\n );\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug(\n {\n durationMs,\n stdout: res.stdout,\n stderr: res.stderr,\n },\n 'exec completed',\n );\n }\n\n return res;\n}\n\n/**\n * When we resolve `toolSettings` in `getToolSettingsOptions`, we provide a stronger type than our input types, because we set defaults on config options.\n *\n * We do not have a default that is set for `nodeMaxMemory`, so it must remain as optional.\n */\ntype ResolvedToolSettingsOptions = Required<\n Omit<RepoToolSettingsOptions, 'nodeMaxMemory'>\n> &\n Pick<RepoToolSettingsOptions, 'nodeMaxMemory'>;\n\nexport function getToolSettingsOptions(\n repoConfig?: RepoToolSettingsOptions,\n): ResolvedToolSettingsOptions {\n let defaults = GlobalConfig.get('toolSettings');\n defaults ??= {\n jvmMaxMemory: 512,\n jvmMemory: 512,\n };\n\n const jvmMaxMemory = defaults?.jvmMaxMemory ?? 512;\n const options: ResolvedToolSettingsOptions = {\n jvmMaxMemory,\n jvmMemory: defaults?.jvmMemory ?? jvmMaxMemory,\n nodeMaxMemory: defaults?.nodeMaxMemory,\n };\n\n if (repoConfig !== undefined) {\n if (repoConfig.jvmMaxMemory) {\n if (repoConfig.jvmMaxMemory > options.jvmMaxMemory) {\n logger.once.debug(\n `A higher jvmMaxMemory (${repoConfig.jvmMaxMemory}) than the global configuration (${options.jvmMaxMemory}) is not permitted for Java VM invocations. Using global configuration instead`,\n );\n }\n\n options.jvmMaxMemory = Math.min(\n options.jvmMaxMemory,\n repoConfig.jvmMaxMemory,\n );\n }\n\n if (repoConfig.jvmMemory) {\n options.jvmMemory = repoConfig.jvmMemory;\n }\n\n if (repoConfig.nodeMaxMemory) {\n if (\n options.nodeMaxMemory &&\n repoConfig.nodeMaxMemory > options.nodeMaxMemory\n ) {\n logger.once.debug(\n `A higher nodeMaxMemory (${repoConfig.nodeMaxMemory}) than the global configuration (${options.nodeMaxMemory}) is not permitted for Node invocations. Using global configuration instead`,\n );\n } else {\n options.nodeMaxMemory = repoConfig.nodeMaxMemory;\n }\n }\n }\n\n options.jvmMaxMemory = Math.floor(options.jvmMaxMemory);\n options.jvmMemory = Math.floor(options.jvmMemory);\n if (options.nodeMaxMemory) {\n options.nodeMaxMemory = Math.floor(options.nodeMaxMemory);\n }\n\n // make sure that the starting memory can't be more than the max memory\n options.jvmMemory = Math.min(options.jvmMemory, options.jvmMaxMemory);\n\n if (options.jvmMaxMemory < 512 || options.jvmMemory < 512) {\n options.jvmMaxMemory = Math.max(options.jvmMaxMemory, 512);\n\n logger.once.debug(\n 'Overriding low memory settings for Java VM invocations to a minimum of 512M',\n );\n options.jvmMemory = Math.max(options.jvmMemory, 512);\n }\n\n return options;\n}\n\nexport function gradleJvmArg(config: RepoToolSettingsOptions): string {\n return ` -Dorg.gradle.jvmargs=\"-Xms${config.jvmMemory}m -Xmx${config.jvmMaxMemory}m\"`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/exec/index.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RepoToolSettingsOptions } from '../../config/types.ts';\nimport { TEMPORARY_ERROR } from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { coerceArray } from '../array.ts';\nimport { getCustomEnv, getUserEnv } from '../env.ts';\nimport { coerceObject } from '../object.ts';\nimport { rawExec } from './common.ts';\nimport { generateInstallCommands, isDynamicInstall } from './containerbase.ts';\nimport {\n generateDockerCommand,\n removeDockerContainer,\n} from './docker/index.ts';\nimport { hardcodedProcessEnv } from './env.ts';\nimport { getHermitEnvs, isHermit } from './hermit.ts';\nimport type {\n CommandWithOptions,\n DockerOptions,\n ExecOptions,\n ExecResult,\n ExtraEnv,\n Opt,\n RawExecOptions,\n} from './types.ts';\nimport { getChildEnv } from './utils.ts';\n\nfunction dockerEnvVars(extraEnv: ExtraEnv, childEnv: ExtraEnv): string[] {\n const extraEnvKeys = Object.keys(extraEnv);\n return extraEnvKeys.filter((key) => isNonEmptyString(childEnv[key]));\n}\n\nfunction getCwd({ cwd, cwdFile }: ExecOptions): string | undefined {\n // TODO: types (#22198)\n const defaultCwd = GlobalConfig.get('localDir');\n const paramCwd = cwdFile\n ? upath.join(defaultCwd, upath.dirname(cwdFile))\n : cwd;\n return paramCwd ?? defaultCwd;\n}\n\nfunction getRawExecOptions(opts: ExecOptions): RawExecOptions {\n const defaultExecutionTimeout = GlobalConfig.get('executionTimeout');\n const childEnv = getChildEnv(opts);\n const cwd = getCwd(opts);\n let timeout = opts.timeout;\n timeout ??= defaultExecutionTimeout * 60 * 1000;\n\n // Set default max buffer size to 10MB\n const maxBuffer = opts.maxBuffer ?? 10 * 1024 * 1024;\n\n return {\n cwd,\n env: childEnv,\n maxBuffer,\n timeout,\n ...(opts.shell !== undefined && { shell: opts.shell }),\n stdin: 'pipe',\n stdout: opts.ignoreStdout ? 'ignore' : 'pipe',\n stderr: 'pipe',\n };\n}\n\nfunction isDocker(docker: Opt<DockerOptions>): docker is DockerOptions {\n return GlobalConfig.get('binarySource') === 'docker' && !!docker;\n}\n\ninterface RawExecArguments {\n rawCommands: (string | CommandWithOptions)[];\n rawOptions: RawExecOptions;\n}\n\nasync function prepareRawExec(\n cmd:\n string | string[] | CommandWithOptions[] | (string | CommandWithOptions)[],\n opts: ExecOptions,\n sideCarImage: string,\n): Promise<RawExecArguments> {\n const { docker } = opts;\n const preCommands = coerceArray(opts.preCommands);\n const customEnvVariables = getCustomEnv();\n const userConfiguredEnv = getUserEnv();\n const { containerbaseDir, binarySource } = GlobalConfig.get();\n\n if (binarySource === 'docker' || binarySource === 'install') {\n logger.debug(`Setting CONTAINERBASE_CACHE_DIR to ${containerbaseDir!}`);\n opts.env ??= {};\n opts.env.CONTAINERBASE_CACHE_DIR = containerbaseDir;\n }\n\n let rawOptions = getRawExecOptions(opts);\n\n let rawCommands = isString(cmd) ? [cmd] : cmd;\n\n if (isDocker(docker)) {\n logger.debug({ image: sideCarImage }, 'Using docker to execute');\n const extraEnv = {\n ...hardcodedProcessEnv,\n ...opts.extraEnv,\n ...customEnvVariables,\n ...userConfiguredEnv,\n };\n const childEnv = getChildEnv(opts);\n const envVars = [\n ...dockerEnvVars(extraEnv, childEnv),\n ...coerceArray(docker.envVars),\n 'CONTAINERBASE_CACHE_DIR',\n ];\n const cwd = getCwd(opts);\n const dockerOptions: DockerOptions = { ...docker, cwd, envVars };\n const dockerCommand = await generateDockerCommand(\n rawCommands,\n [\n ...(await generateInstallCommands(opts.toolConstraints)),\n ...preCommands,\n ],\n dockerOptions,\n sideCarImage,\n );\n rawCommands = [dockerCommand];\n } else if (isDynamicInstall(opts.toolConstraints)) {\n logger.debug('Using containerbase dynamic installs');\n rawCommands = [\n ...(await generateInstallCommands(opts.toolConstraints)),\n ...preCommands,\n ...rawCommands,\n ];\n } else if (isHermit()) {\n const hermitEnvVars = await getHermitEnvs(rawOptions);\n logger.debug(\n { hermitEnvVars },\n 'merging hermit environment variables into the execution options',\n );\n rawOptions = {\n ...rawOptions,\n env: {\n ...rawOptions.env,\n ...hermitEnvVars,\n },\n };\n }\n\n if (\n GlobalConfig.get('binarySource') === 'global' &&\n opts.toolConstraints?.length\n ) {\n logger.once.debug(\n { toolConstraints: opts.toolConstraints },\n 'Ignoring tool contraints because of `binarySource=global`',\n );\n }\n\n return { rawCommands, rawOptions };\n}\n\nexport async function exec(\n cmd:\n string | string[] | CommandWithOptions[] | (string | CommandWithOptions)[],\n opts: ExecOptions = {},\n): Promise<ExecResult> {\n const { docker } = opts;\n const dockerChildPrefix = GlobalConfig.get('dockerChildPrefix');\n const sideCarImage = GlobalConfig.get('dockerSidecarImage');\n\n const { rawCommands, rawOptions } = await prepareRawExec(\n cmd,\n opts,\n sideCarImage,\n );\n const useDocker = isDocker(docker);\n\n let res: ExecResult = { stdout: '', stderr: '' };\n for (const rawCmd of rawCommands) {\n const startTime = Date.now();\n if (useDocker) {\n await removeDockerContainer(sideCarImage, dockerChildPrefix);\n }\n logger.debug(\n { command: rawCmd, env: Object.keys(coerceObject(rawOptions.env)) },\n 'Executing command',\n );\n logger.trace({ commandOptions: rawOptions }, 'Command options');\n try {\n res = await rawExec(rawCmd, rawOptions);\n } catch (err) {\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug({ err, durationMs }, 'rawExec err');\n if (useDocker) {\n await removeDockerContainer(sideCarImage, dockerChildPrefix).catch(\n (removeErr: Error) => {\n const message: string = err.message;\n throw new Error(\n `Error: \"${removeErr.message}\" - Original Error: \"${message}\"`,\n );\n },\n );\n }\n if (err.signal === `SIGTERM`) {\n logger.debug(\n { err },\n 'exec interrupted by SIGTERM - run needs to be aborted',\n );\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n const durationMs = Math.round(Date.now() - startTime);\n logger.debug(\n {\n durationMs,\n stdout: res.stdout,\n stderr: res.stderr,\n },\n 'exec completed',\n );\n }\n\n return res;\n}\n\n/**\n * When we resolve `toolSettings` in `getToolSettingsOptions`, we provide a stronger type than our input types, because we set defaults on config options.\n *\n * We do not have a default that is set for `nodeMaxMemory`, so it must remain as optional.\n */\ntype ResolvedToolSettingsOptions = Required<\n Omit<RepoToolSettingsOptions, 'nodeMaxMemory'>\n> &\n Pick<RepoToolSettingsOptions, 'nodeMaxMemory'>;\n\nexport function getToolSettingsOptions(\n repoConfig?: RepoToolSettingsOptions,\n): ResolvedToolSettingsOptions {\n let defaults = GlobalConfig.get('toolSettings');\n defaults ??= {\n jvmMaxMemory: 512,\n jvmMemory: 512,\n };\n\n const jvmMaxMemory = defaults?.jvmMaxMemory ?? 512;\n const options: ResolvedToolSettingsOptions = {\n jvmMaxMemory,\n jvmMemory: defaults?.jvmMemory ?? jvmMaxMemory,\n nodeMaxMemory: defaults?.nodeMaxMemory,\n };\n\n if (repoConfig !== undefined) {\n if (repoConfig.jvmMaxMemory) {\n if (repoConfig.jvmMaxMemory > options.jvmMaxMemory) {\n logger.once.debug(\n `A higher jvmMaxMemory (${repoConfig.jvmMaxMemory}) than the global configuration (${options.jvmMaxMemory}) is not permitted for Java VM invocations. Using global configuration instead`,\n );\n }\n\n options.jvmMaxMemory = Math.min(\n options.jvmMaxMemory,\n repoConfig.jvmMaxMemory,\n );\n }\n\n if (repoConfig.jvmMemory) {\n options.jvmMemory = repoConfig.jvmMemory;\n }\n\n if (repoConfig.nodeMaxMemory) {\n if (\n options.nodeMaxMemory &&\n repoConfig.nodeMaxMemory > options.nodeMaxMemory\n ) {\n logger.once.debug(\n `A higher nodeMaxMemory (${repoConfig.nodeMaxMemory}) than the global configuration (${options.nodeMaxMemory}) is not permitted for Node invocations. Using global configuration instead`,\n );\n } else {\n options.nodeMaxMemory = repoConfig.nodeMaxMemory;\n }\n }\n }\n\n options.jvmMaxMemory = Math.floor(options.jvmMaxMemory);\n options.jvmMemory = Math.floor(options.jvmMemory);\n if (options.nodeMaxMemory) {\n options.nodeMaxMemory = Math.floor(options.nodeMaxMemory);\n }\n\n // make sure that the starting memory can't be more than the max memory\n options.jvmMemory = Math.min(options.jvmMemory, options.jvmMaxMemory);\n\n if (options.jvmMaxMemory < 512 || options.jvmMemory < 512) {\n options.jvmMaxMemory = Math.max(options.jvmMaxMemory, 512);\n\n logger.once.debug(\n 'Overriding low memory settings for Java VM invocations to a minimum of 512M',\n );\n options.jvmMemory = Math.max(options.jvmMemory, 512);\n }\n\n return options;\n}\n\nexport function gradleJvmArg(config: RepoToolSettingsOptions): string {\n return ` -Dorg.gradle.jvmargs=\"-Xms${config.jvmMemory}m -Xmx${config.jvmMaxMemory}m\"`;\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { MISSING_API_CREDENTIALS } from "../../constants/error-messages.js";
2
2
  import { GlobalConfig } from "../../config/global.js";
3
+ import { logger } from "../../logger/index.js";
3
4
  import { getApiToken } from "../merge-confidence/index.js";
4
5
  import { Matcher } from "./base.js";
5
6
  import { isArray, isNonEmptyString, isNullOrUndefined, isUndefined } from "@sindresorhus/is";
@@ -7,6 +8,10 @@ import { isArray, isNonEmptyString, isNullOrUndefined, isUndefined } from "@sind
7
8
  var MergeConfidenceMatcher = class extends Matcher {
8
9
  matches({ mergeConfidenceLevel }, { matchConfidence }) {
9
10
  if (isNullOrUndefined(matchConfidence)) return null;
11
+ if (GlobalConfig.get("platform") === "local") {
12
+ logger.once.debug("Skipping packageRule(s) with `matchConfidence`, as we're running in platform=local");
13
+ return null;
14
+ }
10
15
  if (isUndefined(getApiToken())) {
11
16
  const error = new Error(MISSING_API_CREDENTIALS);
12
17
  error.validationSource = "MatchConfidence Authenticator";
@@ -1 +1 @@
1
- {"version":3,"file":"merge-confidence.js","names":[],"sources":["../../../lib/util/package-rules/merge-confidence.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyString,\n isNullOrUndefined,\n isUndefined,\n} from '@sindresorhus/is';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type {\n PackageRule,\n PackageRuleInputConfig,\n} from '../../config/types.ts';\nimport { MISSING_API_CREDENTIALS } from '../../constants/error-messages.ts';\nimport { getApiToken } from '../merge-confidence/index.ts';\nimport { Matcher } from './base.ts';\n\nexport class MergeConfidenceMatcher extends Matcher {\n override matches(\n { mergeConfidenceLevel }: PackageRuleInputConfig,\n { matchConfidence }: PackageRule,\n ): boolean | null {\n if (isNullOrUndefined(matchConfidence)) {\n return null;\n }\n\n /*\n * Throw an error for unauthenticated use of the matchConfidence matcher.\n */\n if (isUndefined(getApiToken())) {\n const error = new Error(MISSING_API_CREDENTIALS);\n error.validationSource = 'MatchConfidence Authenticator';\n error.validationError = 'Missing credentials';\n error.validationMessage = `The \\`matchConfidence\\` matcher in \\`packageRules\\` requires authentication. Please refer to the [documentation](${GlobalConfig.get('productLinks').documentation}configuration-options/#packagerulesmatchconfidence) and add the required host rule.`;\n throw error;\n }\n\n return (\n isArray(matchConfidence) &&\n isNonEmptyString(mergeConfidenceLevel) &&\n matchConfidence.includes(mergeConfidenceLevel)\n );\n }\n}\n"],"mappings":";;;;;;AAeA,IAAa,yBAAb,cAA4C,QAAQ;CAClD,QACE,EAAE,wBACF,EAAE,mBACc;EAChB,IAAI,kBAAkB,eAAe,GACnC,OAAO;EAMT,IAAI,YAAY,YAAY,CAAC,GAAG;GAC9B,MAAM,QAAQ,IAAI,MAAM,uBAAuB;GAC/C,MAAM,mBAAmB;GACzB,MAAM,kBAAkB;GACxB,MAAM,oBAAoB,oHAAoH,aAAa,IAAI,cAAc,CAAC,CAAC,cAAc;GAC7L,MAAM;EACR;EAEA,OACE,QAAQ,eAAe,KACvB,iBAAiB,oBAAoB,KACrC,gBAAgB,SAAS,oBAAoB;CAEjD;AACF"}
1
+ {"version":3,"file":"merge-confidence.js","names":[],"sources":["../../../lib/util/package-rules/merge-confidence.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyString,\n isNullOrUndefined,\n isUndefined,\n} from '@sindresorhus/is';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type {\n PackageRule,\n PackageRuleInputConfig,\n} from '../../config/types.ts';\nimport { MISSING_API_CREDENTIALS } from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { getApiToken } from '../merge-confidence/index.ts';\nimport { Matcher } from './base.ts';\n\nexport class MergeConfidenceMatcher extends Matcher {\n override matches(\n { mergeConfidenceLevel }: PackageRuleInputConfig,\n { matchConfidence }: PackageRule,\n ): boolean | null {\n if (isNullOrUndefined(matchConfidence)) {\n return null;\n }\n\n // if we're on `local` platform - for instance to test against a repo - don't error, but don't allow the packageRule either\n if (GlobalConfig.get('platform') === 'local') {\n logger.once.debug(\n \"Skipping packageRule(s) with `matchConfidence`, as we're running in platform=local\",\n );\n return null;\n }\n\n /*\n * Throw an error for unauthenticated use of the matchConfidence matcher.\n */\n if (isUndefined(getApiToken())) {\n const error = new Error(MISSING_API_CREDENTIALS);\n error.validationSource = 'MatchConfidence Authenticator';\n error.validationError = 'Missing credentials';\n error.validationMessage = `The \\`matchConfidence\\` matcher in \\`packageRules\\` requires authentication. Please refer to the [documentation](${GlobalConfig.get('productLinks').documentation}configuration-options/#packagerulesmatchconfidence) and add the required host rule.`;\n throw error;\n }\n\n return (\n isArray(matchConfidence) &&\n isNonEmptyString(mergeConfidenceLevel) &&\n matchConfidence.includes(mergeConfidenceLevel)\n );\n }\n}\n"],"mappings":";;;;;;;AAgBA,IAAa,yBAAb,cAA4C,QAAQ;CAClD,QACE,EAAE,wBACF,EAAE,mBACc;EAChB,IAAI,kBAAkB,eAAe,GACnC,OAAO;EAIT,IAAI,aAAa,IAAI,UAAU,MAAM,SAAS;GAC5C,OAAO,KAAK,MACV,oFACF;GACA,OAAO;EACT;EAKA,IAAI,YAAY,YAAY,CAAC,GAAG;GAC9B,MAAM,QAAQ,IAAI,MAAM,uBAAuB;GAC/C,MAAM,mBAAmB;GACzB,MAAM,kBAAkB;GACxB,MAAM,oBAAoB,oHAAoH,aAAa,IAAI,cAAc,CAAC,CAAC,cAAc;GAC7L,MAAM;EACR;EAEA,OACE,QAAQ,eAAe,KACvB,iBAAiB,oBAAoB,KACrC,gBAAgB,SAAS,oBAAoB;CAEjD;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"result.js","names":[],"sources":["../../lib/util/result.ts"],"sourcesContent":["import { isBoolean, isUndefined } from '@sindresorhus/is';\nimport type { ZodError, output as ZodOutput, ZodType } from 'zod/v4';\nimport { NEVER } from 'zod/v4';\nimport { logger } from '../logger/index.ts';\nimport type { Nullish } from '../types/index.ts';\n\ntype Val = NonNullable<unknown>;\n\n// ZodSafeParseResult is not exported from zod/v4 public API, derive from safeParse return type\ntype ZodSafeParseResult<T> = ReturnType<ZodType<T>['safeParse']>;\n\ninterface Ok<T extends Val> {\n readonly ok: true;\n readonly val: T;\n readonly err?: never;\n}\n\ninterface Err<E extends Val> {\n readonly ok: false;\n readonly err: E;\n readonly val?: never;\n\n /**\n * Internal flag to indicate that the error was thrown during `.transform()`\n * and will be re-thrown on `.unwrap()`.\n */\n readonly _uncaught?: true;\n}\n\ntype Res<T extends Val, E extends Val> = Ok<T> | Err<E>;\n\nfunction isZodResult<Output extends Val>(\n input: unknown,\n): input is ZodSafeParseResult<Output> {\n if (\n // oxlint-disable-next-line renovate/prefer-is-object -- guards arbitrary callback results; isObject() matches functions, which must never be classified as zod results\n typeof input !== 'object' ||\n input === null ||\n Object.keys(input).length !== 2 ||\n !('success' in input) ||\n !isBoolean(input.success)\n ) {\n return false;\n }\n\n if (input.success) {\n return 'data' in input && !isUndefined(input.data) && input.data !== null;\n }\n return 'error' in input;\n}\n\nfunction fromZodResult<ZodOutput extends Val>(\n input: ZodSafeParseResult<ZodOutput>,\n): Result<ZodOutput, ZodError> {\n return input.success ? Result.ok(input.data) : Result.err(input.error);\n}\n\n/**\n * All non-nullable values that also are not Promises nor Zod results.\n * It's useful for restricting Zod results to not return `null` or `undefined`.\n */\ntype RawValue<T extends Val> = Exclude<\n T,\n ZodSafeParseResult<T> | Promise<unknown>\n>;\n\nfunction fromNullable<\n T extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n>(\n input: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n): Result<T, ErrForNull | ErrForUndefined> {\n if (input === null) {\n return Result.err(errForNull);\n }\n\n if (input === undefined) {\n return Result.err(errForUndefined);\n }\n\n return Result.ok(input);\n}\n\n/**\n * Class for representing a result that can fail.\n *\n * The mental model:\n * - `.wrap()` and `.wrapNullable()` are sinks\n * - `.transform()` are pipes which can be chained\n * - `.unwrap()` is the point of consumption\n */\nexport class Result<T extends Val, E extends Val = Error> {\n private readonly res: Res<T, E>;\n\n private constructor(res: Res<T, E>) {\n this.res = res;\n }\n\n static ok<T extends Val>(val: T): Result<T, never> {\n return new Result({ ok: true, val });\n }\n\n static err<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err });\n }\n\n static _uncaught<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err, _uncaught: true });\n }\n\n /**\n * Wrap a callback or promise in a Result in such a way that any thrown errors\n * are caught and wrapped with `Result.err()` (and hence never re-thrown).\n *\n * In case of a promise, the `AsyncResult` is returned.\n * Use `.unwrap()` to get the `Promise<Result<T, E>>` from `AsyncResult`.\n *\n * ```ts\n *\n * // SYNC\n * const parse = (json: string) => Result.wrap(() => JSON.parse(json));\n *\n * const { val, err } = parse('{\"foo\": \"bar\"}').unwrap();\n * expect(val).toEqual({ foo: 'bar' });\n * expect(err).toBeUndefined();\n *\n * const { val, err } = parse('!!!').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBeInstanceOf(SyntaxError);\n *\n * // ASYNC\n * const request = (url: string) => Result.wrap(http.get(url));\n *\n * const { val, err } = await request('https://example.com').unwrap();\n * expect(val).toBeString();\n * expect(err).toBeUndefined();\n *\n * ```\n */\n static wrap<T extends Val>(\n zodResult: ZodSafeParseResult<T>,\n ): Result<T, ZodError>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => RawValue<T>,\n ): Result<T, E>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise: Promise<Result<T, EE>>,\n ): AsyncResult<T, E | EE>;\n static wrap<T extends Val, E extends Val = Error>(\n promise: Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n input:\n | ZodSafeParseResult<T>\n | (() => RawValue<T>)\n | (() => Promise<RawValue<T>>)\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n ): Result<T, ZodError> | Result<T, E | EE> | AsyncResult<T, E | EE> {\n if (isZodResult<T>(input)) {\n return fromZodResult<T>(input);\n }\n\n if (input instanceof Promise) {\n return AsyncResult.wrap(input);\n }\n\n try {\n const result = input();\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result);\n }\n\n return Result.ok(result);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n /**\n * Similar to `Result.wrap()`, but helps to undo the billion dollar mistake by\n * replacing `null` or `undefined` with an error of provided type.\n *\n * Errors thrown inside the callback or promise are caught and wrapped with `Result.err()`,\n * hence never re-thrown.\n *\n * Since functions and promises returning nullable can't be wrapped with `Result.wrap()`\n * because `val` is constrained by being `NonNullable`, `null` and `undefined`\n * must be converted to some sort of `err` value.\n *\n * This method does exactly this, i.g. it is the feature-rich shorthand for:\n *\n * ```ts\n * const { val, err } = Result.wrap(() => {\n * const result = callback();\n * return result === null || result === undefined\n * ? Result.err('oops')\n * : Result.ok(result);\n * }).unwrap();\n * ```\n *\n * In case of a promise, the `AsyncResult` is returned.\n *\n * ```ts\n *\n * // SYNC\n * const getHostname = (url: string) =>\n * Result.wrapNullable(\n * () => parseUrl(url)?.hostname,\n * 'invalid-url' as const\n * );\n * const { val, err } = getHostname('foobar').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBe('invalid-url');\n *\n * // ASYNC\n * const { val, err } = await Result.wrapNullable(\n * readLocalFile('yarn.lock'),\n * 'file-read-error' as const\n * ).unwrap();\n *\n * ```\n */\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNullable: ErrForNullable,\n ): AsyncResult<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n value: Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n value: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n input: (() => Nullish<T>) | Promise<Nullish<T>> | Nullish<T>,\n arg2: ErrForNull,\n arg3?: ErrForUndefined,\n ):\n | Result<T, E | ErrForNull | ErrForUndefined>\n | AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n const errForNull = arg2;\n const errForUndefined = arg3 ?? arg2;\n\n if (input instanceof Promise) {\n return AsyncResult.wrapNullable(input, errForNull, errForUndefined);\n }\n\n if (input instanceof Function) {\n try {\n const result = input();\n return fromNullable(result, errForNull, errForUndefined);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n return fromNullable(input, errForNull, errForUndefined);\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const { val, err } = Result.ok('foo').unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Res<T, E> {\n if (this.res.ok) {\n return this.res;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return this.res;\n }\n\n /**\n * Returns a success value or a fallback value.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const value = Result.err('bar').unwrapOr('foo');\n * expect(val).toBe('foo');\n *\n * ```\n */\n unwrapOr(fallback: T): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return fallback;\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n unwrapOrThrow(): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n /**\n * Returns the ok-value or `null`.\n * When error was uncaught during transformation, it's being re-thrown here.\n */\n unwrapOrNull(): T | null {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return null;\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * // SYNC\n * const { val, err } = Result.ok('foo')\n * .transform((x) => x.length)\n * .unwrap();\n * expect(val).toBe(3);\n *\n * // ASYNC\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): Result<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => ZodSafeParseResult<NonNullable<U>>,\n ): Result<U, E | ZodError>;\n transform<U extends Val>(\n fn: (value: T) => Promise<ZodSafeParseResult<NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): Result<U, E>;\n transform<U extends Val, EE extends Val>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | ZodSafeParseResult<NonNullable<U>>\n | Promise<ZodSafeParseResult<NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ): Result<U, E | EE | ZodError> | AsyncResult<U, E | EE | ZodError> {\n if (!this.res.ok) {\n return Result.err(this.res.err);\n }\n\n try {\n const result = fn(this.res.val);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<U>(result)) {\n return fromZodResult<U>(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn({ err }, 'Result: unhandled async transform error');\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'Result: unhandled transform error');\n return Result._uncaught(err);\n }\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE>,\n ): Result<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): Result<T | U, EE> | AsyncResult<T | U, EE> {\n if (this.res.ok) {\n return this as never;\n }\n\n if (this.res._uncaught) {\n return this as never;\n }\n\n try {\n const result = fn(this.res.err);\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'Result: unexpected error in async catch handler',\n );\n return Result._uncaught(err);\n });\n }\n\n return result;\n } catch (err) {\n logger.warn({ err }, 'Result: unexpected error in catch handler');\n return Result._uncaught(err);\n }\n }\n\n /**\n * Given a `schema` and `input`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n static parse<Schema extends ZodType<any, any, any>>(\n input: unknown,\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, ZodError> {\n const parseResult = schema\n .transform((result, ctx): NonNullable<ZodOutput<Schema>> => {\n if (result === undefined) {\n ctx.addIssue({\n code: 'custom',\n message: `Result can't accept nullish values, but input was parsed by Zod schema to undefined`,\n });\n return NEVER;\n }\n\n if (result === null) {\n ctx.addIssue({\n code: 'custom',\n message: `Result can't accept nullish values, but input was parsed by Zod schema to null`,\n });\n return NEVER;\n }\n\n return result;\n })\n .safeParse(input);\n\n return fromZodResult<NonNullable<ZodOutput<Schema>>>(parseResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, E | ZodError> {\n if (this.res.ok) {\n return Result.parse(this.res.val, schema);\n }\n\n const err = this.res.err;\n\n if (this.res._uncaught) {\n return Result._uncaught(err);\n }\n\n return Result.err(err);\n }\n\n /**\n * Call `fn` on the `val` if the result is ok.\n */\n onValue(fn: (value: T) => void): Result<T, E> {\n if (this.res.ok) {\n try {\n fn(this.res.val);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n\n /**\n * Call `fn` on the `err` if the result is err.\n */\n onError(fn: (err: E) => void): Result<T, E> {\n if (!this.res.ok) {\n try {\n fn(this.res.err);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n}\n\n/**\n * This class is being used when `Result` methods encounter async code.\n * It isn't meant to be used directly, but exported for usage in type annotations.\n *\n * All the methods resemble `Result` methods, but work asynchronously.\n */\nexport class AsyncResult<T extends Val, E extends Val> implements PromiseLike<\n Result<T, E>\n> {\n private asyncResult: Promise<Result<T, E>>;\n\n private constructor(asyncResult: Promise<Result<T, E>>) {\n this.asyncResult = asyncResult;\n }\n\n // oxlint-disable-next-line unicorn/no-thenable -- required to implement PromiseLike\n then<TResult1 = Result<T, E>>(\n onfulfilled?:\n | ((value: Result<T, E>) => TResult1 | PromiseLike<TResult1>)\n | null,\n ): PromiseLike<TResult1> {\n return this.asyncResult.then(onfulfilled);\n }\n\n static ok<T extends Val>(val: T): AsyncResult<T, never> {\n return new AsyncResult(Promise.resolve(Result.ok(val)));\n }\n\n static err<E extends Val>(err: NonNullable<E>): AsyncResult<never, E> {\n return new AsyncResult(Promise.resolve(Result.err(err)));\n }\n\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise:\n | Promise<ZodSafeParseResult<T>>\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n onErr?: (err: NonNullable<E>) => Result<T, E>,\n ): AsyncResult<T, E | EE> {\n return new AsyncResult(\n promise\n .then((value) => {\n if (value instanceof Result) {\n return value;\n }\n\n if (isZodResult<T>(value)) {\n return fromZodResult<T>(value);\n }\n\n return Result.ok(value);\n })\n .catch((err) => {\n if (onErr) {\n return onErr(err);\n }\n return Result.err(err);\n }),\n );\n }\n\n static wrapNullable<\n T extends Val,\n E extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: NonNullable<ErrForNull>,\n errForUndefined: NonNullable<ErrForUndefined>,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n return new AsyncResult(\n promise\n .then((value) => fromNullable(value, errForNull, errForUndefined))\n .catch((err) => Result.err(err)),\n );\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(readFile('foo.txt')).unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Promise<Res<T, E>> {\n return this.asyncResult.then<Res<T, E>>((res) => res.unwrap());\n }\n\n /**\n * Returns a success value or a fallback value.\n *\n * ```ts\n *\n * const val = await Result.wrap(readFile('foo.txt')).unwrapOr('bar');\n * expect(val).toBe('bar');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrapOr(fallback: T): Promise<T> {\n return this.asyncResult.then<T>((res) => res.unwrapOr(fallback));\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n async unwrapOrThrow(): Promise<T> {\n const result = await this.asyncResult;\n return result.unwrapOrThrow();\n }\n\n /**\n * Returns the ok-value or `null`.\n */\n unwrapOrNull(): Promise<T | null> {\n return this.asyncResult.then<T | null>((res) => res.unwrapOrNull());\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => ZodSafeParseResult<NonNullable<U>>,\n ): AsyncResult<U, E | ZodError>;\n transform<U extends Val>(\n fn: (value: T) => Promise<ZodSafeParseResult<NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): AsyncResult<U, E>;\n transform<U extends Val, EE extends Val>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | ZodSafeParseResult<NonNullable<U>>\n | Promise<ZodSafeParseResult<NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ): AsyncResult<U, E | EE | ZodError> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => {\n const { ok, val: value, err: error } = oldResult.unwrap();\n if (!ok) {\n return Result.err(error);\n }\n\n try {\n const result = fn(value);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<U>(result)) {\n return fromZodResult<U>(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'AsyncResult: unhandled async transform error',\n );\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'AsyncResult: unhandled transform error');\n return Result._uncaught(err);\n }\n })\n .catch((err) => {\n // Happens when `.unwrap()` of `oldResult` throws\n return Result._uncaught(err);\n }),\n );\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Result<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (\n err: NonNullable<E>,\n ) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE> {\n const caughtAsyncResult: Promise<Result<T, EE>> = this.asyncResult.then(\n (result) => result.catch(fn as never),\n );\n return AsyncResult.wrap(caughtAsyncResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): AsyncResult<NonNullable<ZodOutput<Schema>>, E | ZodError> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => oldResult.parse(schema))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onValue(fn: (value: T) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onValue(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onError(fn: (err: E) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onError(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"result.js","names":[],"sources":["../../lib/util/result.ts"],"sourcesContent":["import { isBoolean, isUndefined } from '@sindresorhus/is';\nimport type { ZodError, output as ZodOutput, ZodType } from 'zod/v4';\nimport { NEVER } from 'zod/v4';\nimport { logger } from '../logger/index.ts';\nimport type { Nullish } from '../types/index.ts';\n\ntype Val = NonNullable<unknown>;\n\n// ZodSafeParseResult is not exported from zod/v4 public API, derive from safeParse return type\ntype ZodSafeParseResult<T> = ReturnType<ZodType<T>['safeParse']>;\n\ninterface Ok<T extends Val> {\n readonly ok: true;\n readonly val: T;\n readonly err?: never;\n}\n\ninterface Err<E extends Val> {\n readonly ok: false;\n readonly err: E;\n readonly val?: never;\n\n /**\n * Internal flag to indicate that the error was thrown during `.transform()`\n * and will be re-thrown on `.unwrap()`.\n */\n readonly _uncaught?: true;\n}\n\ntype Res<T extends Val, E extends Val> = Ok<T> | Err<E>;\n\nfunction isZodResult<Output extends Val>(\n input: unknown,\n): input is ZodSafeParseResult<Output> {\n if (\n // oxlint-disable-next-line renovate/prefer-is-object -- guards arbitrary callback results; isObject() matches functions, which must never be classified as zod results\n typeof input !== 'object' ||\n input === null ||\n Object.keys(input).length !== 2 ||\n !('success' in input) ||\n !isBoolean(input.success)\n ) {\n return false;\n }\n\n if (input.success) {\n return 'data' in input && !isUndefined(input.data) && input.data !== null;\n }\n return 'error' in input;\n}\n\nfunction fromZodResult<ZodOutput extends Val>(\n input: ZodSafeParseResult<ZodOutput>,\n): Result<ZodOutput, ZodError> {\n return input.success ? Result.ok(input.data) : Result.err(input.error);\n}\n\n/**\n * All non-nullable values that also are not Promises nor Zod results.\n * It's useful for restricting Zod results to not return `null` or `undefined`.\n */\ntype RawValue<T extends Val> = Exclude<\n T,\n ZodSafeParseResult<T> | Promise<unknown>\n>;\n\nfunction fromNullable<\n T extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n>(\n input: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n): Result<T, ErrForNull | ErrForUndefined> {\n if (input === null) {\n return Result.err(errForNull);\n }\n\n if (input === undefined) {\n return Result.err(errForUndefined);\n }\n\n return Result.ok(input);\n}\n\n/**\n * Class for representing a result that can fail.\n *\n * The mental model:\n * - `.wrap()` and `.wrapNullable()` are sinks\n * - `.transform()` are pipes which can be chained\n * - `.unwrap()` is the point of consumption\n */\nexport class Result<T extends Val, E extends Val = Error> {\n private readonly res: Res<T, E>;\n\n private constructor(res: Res<T, E>) {\n this.res = res;\n }\n\n static ok<T extends Val>(val: T): Result<T, never> {\n return new Result({ ok: true, val });\n }\n\n static err<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err });\n }\n\n static _uncaught<E extends Val>(err: E): Result<never, E> {\n return new Result({ ok: false, err, _uncaught: true });\n }\n\n /**\n * Wrap a callback or promise in a Result in such a way that any thrown errors\n * are caught and wrapped with `Result.err()` (and hence never re-thrown).\n *\n * In case of a promise, the `AsyncResult` is returned.\n * Use `.unwrap()` to get the `Promise<Result<T, E>>` from `AsyncResult`.\n *\n * ```ts\n *\n * // SYNC\n * const parse = (json: string) => Result.wrap(() => JSON.parse(json));\n *\n * const { val, err } = parse('{\"foo\": \"bar\"}').unwrap();\n * expect(val).toEqual({ foo: 'bar' });\n * expect(err).toBeUndefined();\n *\n * const { val, err } = parse('!!!').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBeInstanceOf(SyntaxError);\n *\n * // ASYNC\n * const request = (url: string) => Result.wrap(http.get(url));\n *\n * const { val, err } = await request('https://example.com').unwrap();\n * expect(val).toBeString();\n * expect(err).toBeUndefined();\n *\n * ```\n */\n static wrap<T extends Val>(\n zodResult: ZodSafeParseResult<T>,\n ): Result<T, ZodError>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => RawValue<T>,\n ): Result<T, E>;\n static wrap<T extends Val, E extends Val = Error>(\n callback: () => Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise: Promise<Result<T, EE>>,\n ): AsyncResult<T, E | EE>;\n static wrap<T extends Val, E extends Val = Error>(\n promise: Promise<RawValue<T>>,\n ): AsyncResult<T, E>;\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n input:\n | ZodSafeParseResult<T>\n | (() => RawValue<T>)\n | (() => Promise<RawValue<T>>)\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n ): Result<T, ZodError> | Result<T, E | EE> | AsyncResult<T, E | EE> {\n if (isZodResult<T>(input)) {\n return fromZodResult<T>(input);\n }\n\n if (input instanceof Promise) {\n return AsyncResult.wrap(input);\n }\n\n try {\n const result = input();\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result);\n }\n\n return Result.ok(result);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n /**\n * Similar to `Result.wrap()`, but helps to undo the billion dollar mistake by\n * replacing `null` or `undefined` with an error of provided type.\n *\n * Errors thrown inside the callback or promise are caught and wrapped with `Result.err()`,\n * hence never re-thrown.\n *\n * Since functions and promises returning nullable can't be wrapped with `Result.wrap()`\n * because `val` is constrained by being `NonNullable`, `null` and `undefined`\n * must be converted to some sort of `err` value.\n *\n * This method does exactly this, i.g. it is the feature-rich shorthand for:\n *\n * ```ts\n * const { val, err } = Result.wrap(() => {\n * const result = callback();\n * return result === null || result === undefined\n * ? Result.err('oops')\n * : Result.ok(result);\n * }).unwrap();\n * ```\n *\n * In case of a promise, the `AsyncResult` is returned.\n *\n * ```ts\n *\n * // SYNC\n * const getHostname = (url: string) =>\n * Result.wrapNullable(\n * () => parseUrl(url)?.hostname,\n * 'invalid-url' as const\n * );\n * const { val, err } = getHostname('foobar').unwrap();\n * expect(val).toBeUndefined();\n * expect(err).toBe('invalid-url');\n *\n * // ASYNC\n * const { val, err } = await Result.wrapNullable(\n * readLocalFile('yarn.lock'),\n * 'file-read-error' as const\n * ).unwrap();\n *\n * ```\n */\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n callback: () => Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNullable: ErrForNullable,\n ): AsyncResult<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNullable extends Val = Error,\n >(\n value: Nullish<T>,\n errForNullable: ErrForNullable,\n ): Result<T, E | ErrForNullable>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n value: Nullish<T>,\n errForNull: ErrForNull,\n errForUndefined: ErrForUndefined,\n ): Result<T, E | ErrForNull | ErrForUndefined>;\n static wrapNullable<\n T extends Val,\n E extends Val = Error,\n ErrForNull extends Val = Error,\n ErrForUndefined extends Val = Error,\n >(\n input: (() => Nullish<T>) | Promise<Nullish<T>> | Nullish<T>,\n arg2: ErrForNull,\n arg3?: ErrForUndefined,\n ):\n | Result<T, E | ErrForNull | ErrForUndefined>\n | AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n const errForNull = arg2;\n const errForUndefined = arg3 ?? arg2;\n\n if (input instanceof Promise) {\n return AsyncResult.wrapNullable(input, errForNull, errForUndefined);\n }\n\n if (input instanceof Function) {\n try {\n const result = input();\n return fromNullable(result, errForNull, errForUndefined);\n } catch (error) {\n return Result.err(error);\n }\n }\n\n return fromNullable(input, errForNull, errForUndefined);\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const { val, err } = Result.ok('foo').unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Res<T, E> {\n if (this.res.ok) {\n return this.res;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return this.res;\n }\n\n /**\n * Returns a success value or a fallback value.\n * When error was uncaught during transformation, it's being re-thrown here.\n *\n * ```ts\n *\n * const value = Result.err('bar').unwrapOr('foo');\n * expect(val).toBe('foo');\n *\n * ```\n */\n unwrapOr(fallback: T): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return fallback;\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n unwrapOrThrow(): T {\n if (this.res.ok) {\n return this.res.val;\n }\n\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n /**\n * Returns the ok-value or `null`.\n * When error was uncaught during transformation, it's being re-thrown here.\n */\n unwrapOrNull(): T | null {\n if (this.res.ok) {\n return this.res.val;\n }\n\n if (this.res._uncaught) {\n // TODO: fix, should only allow `Error` type\n // oxlint-disable-next-line typescript/only-throw-error\n throw this.res.err;\n }\n\n return null;\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * // SYNC\n * const { val, err } = Result.ok('foo')\n * .transform((x) => x.length)\n * .unwrap();\n * expect(val).toBe(3);\n *\n * // ASYNC\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): Result<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => ZodSafeParseResult<NonNullable<U>>,\n ): Result<U, E | ZodError>;\n transform<U extends Val>(\n fn: (value: T) => Promise<ZodSafeParseResult<NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): Result<U, E>;\n transform<U extends Val, EE extends Val>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | ZodSafeParseResult<NonNullable<U>>\n | Promise<ZodSafeParseResult<NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ): Result<U, E | EE | ZodError> | AsyncResult<U, E | EE | ZodError> {\n if (!this.res.ok) {\n return Result.err(this.res.err);\n }\n\n try {\n const result = fn(this.res.val);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<U>(result)) {\n return fromZodResult<U>(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn({ err }, 'Result: unhandled async transform error');\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'Result: unhandled transform error');\n return Result._uncaught(err);\n }\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE>,\n ): Result<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: E) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): Result<T | U, EE> | AsyncResult<T | U, EE> {\n if (this.res.ok) {\n return this as never;\n }\n\n if (this.res._uncaught) {\n return this as never;\n }\n\n try {\n const result = fn(this.res.err);\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'Result: unexpected error in async catch handler',\n );\n return Result._uncaught(err);\n });\n }\n\n return result;\n } catch (err) {\n logger.warn({ err }, 'Result: unexpected error in catch handler');\n return Result._uncaught(err);\n }\n }\n\n /**\n * Given a `schema` and `input`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n static parse<Schema extends ZodType<any, any, any>>(\n input: unknown,\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, ZodError> {\n const parseResult = schema\n .transform((result, ctx): NonNullable<ZodOutput<Schema>> => {\n if (result === undefined) {\n ctx.addIssue({\n code: 'custom',\n message: `Result can't accept nullish values, but input was parsed by Zod schema to undefined`,\n });\n return NEVER;\n }\n\n if (result === null) {\n ctx.addIssue({\n code: 'custom',\n message: `Result can't accept nullish values, but input was parsed by Zod schema to null`,\n });\n return NEVER;\n }\n\n return result;\n })\n .safeParse(input);\n\n return fromZodResult<NonNullable<ZodOutput<Schema>>>(parseResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): Result<NonNullable<ZodOutput<Schema>>, E | ZodError> {\n if (this.res.ok) {\n return Result.parse(this.res.val, schema);\n }\n\n const err = this.res.err;\n\n if (this.res._uncaught) {\n return Result._uncaught(err);\n }\n\n return Result.err(err);\n }\n\n /**\n * Call `fn` on the `val` if the result is ok.\n */\n onValue(fn: (value: T) => void): Result<T, E> {\n if (this.res.ok) {\n try {\n fn(this.res.val);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n\n /**\n * Call `fn` on the `err` if the result is err.\n */\n onError(fn: (err: E) => void): Result<T, E> {\n if (!this.res.ok) {\n try {\n fn(this.res.err);\n } catch (err) {\n return Result._uncaught(err);\n }\n }\n\n return this;\n }\n}\n\n/**\n * This class is being used when `Result` methods encounter async code.\n * It isn't meant to be used directly, but exported for usage in type annotations.\n *\n * All the methods resemble `Result` methods, but work asynchronously.\n */\nexport class AsyncResult<T extends Val, E extends Val> implements PromiseLike<\n Result<T, E>\n> {\n private asyncResult: Promise<Result<T, E>>;\n\n private constructor(asyncResult: Promise<Result<T, E>>) {\n this.asyncResult = asyncResult;\n }\n\n // oxlint-disable-next-line unicorn/no-thenable -- required to implement PromiseLike\n then<TResult1 = Result<T, E>>(\n onfulfilled?:\n ((value: Result<T, E>) => TResult1 | PromiseLike<TResult1>) | null,\n ): PromiseLike<TResult1> {\n return this.asyncResult.then(onfulfilled);\n }\n\n static ok<T extends Val>(val: T): AsyncResult<T, never> {\n return new AsyncResult(Promise.resolve(Result.ok(val)));\n }\n\n static err<E extends Val>(err: NonNullable<E>): AsyncResult<never, E> {\n return new AsyncResult(Promise.resolve(Result.err(err)));\n }\n\n static wrap<T extends Val, E extends Val = Error, EE extends Val = never>(\n promise:\n | Promise<ZodSafeParseResult<T>>\n | Promise<Result<T, EE>>\n | Promise<RawValue<T>>,\n onErr?: (err: NonNullable<E>) => Result<T, E>,\n ): AsyncResult<T, E | EE> {\n return new AsyncResult(\n promise\n .then((value) => {\n if (value instanceof Result) {\n return value;\n }\n\n if (isZodResult<T>(value)) {\n return fromZodResult<T>(value);\n }\n\n return Result.ok(value);\n })\n .catch((err) => {\n if (onErr) {\n return onErr(err);\n }\n return Result.err(err);\n }),\n );\n }\n\n static wrapNullable<\n T extends Val,\n E extends Val,\n ErrForNull extends Val,\n ErrForUndefined extends Val,\n >(\n promise: Promise<Nullish<T>>,\n errForNull: NonNullable<ErrForNull>,\n errForUndefined: NonNullable<ErrForUndefined>,\n ): AsyncResult<T, E | ErrForNull | ErrForUndefined> {\n return new AsyncResult(\n promise\n .then((value) => fromNullable(value, errForNull, errForUndefined))\n .catch((err) => Result.err(err)),\n );\n }\n\n /**\n * Returns a discriminated union for type-safe consumption of the result.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(readFile('foo.txt')).unwrap();\n * expect(val).toBe('foo');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrap(): Promise<Res<T, E>> {\n return this.asyncResult.then<Res<T, E>>((res) => res.unwrap());\n }\n\n /**\n * Returns a success value or a fallback value.\n *\n * ```ts\n *\n * const val = await Result.wrap(readFile('foo.txt')).unwrapOr('bar');\n * expect(val).toBe('bar');\n * expect(err).toBeUndefined();\n *\n * ```\n */\n unwrapOr(fallback: T): Promise<T> {\n return this.asyncResult.then<T>((res) => res.unwrapOr(fallback));\n }\n\n /**\n * Returns the ok-value or throw the error.\n */\n async unwrapOrThrow(): Promise<T> {\n const result = await this.asyncResult;\n return result.unwrapOrThrow();\n }\n\n /**\n * Returns the ok-value or `null`.\n */\n unwrapOrNull(): Promise<T | null> {\n return this.asyncResult.then<T | null>((res) => res.unwrapOrNull());\n }\n\n /**\n * Transforms the ok-value, sync or async way.\n *\n * Transform functions SHOULD NOT throw.\n * Uncaught errors are logged and wrapped to `Result._uncaught()`,\n * which leads to re-throwing them in `unwrap()`.\n *\n * Zod `.safeParse()` results are converted automatically.\n *\n * ```ts\n *\n * const { val, err } = await Result.wrap(\n * http.getJson('https://api.example.com/data.json')\n * )\n * .transform(({ body }) => body)\n * .unwrap();\n *\n * ```\n */\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Result<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => AsyncResult<U, E | EE>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => ZodSafeParseResult<NonNullable<U>>,\n ): AsyncResult<U, E | ZodError>;\n transform<U extends Val>(\n fn: (value: T) => Promise<ZodSafeParseResult<NonNullable<U>>>,\n ): AsyncResult<U, E | ZodError>;\n transform<U extends Val, EE extends Val>(\n fn: (value: T) => Promise<Result<U, E | EE>>,\n ): AsyncResult<U, E | EE>;\n transform<U extends Val>(\n fn: (value: T) => Promise<RawValue<U>>,\n ): AsyncResult<U, E>;\n transform<U extends Val>(fn: (value: T) => RawValue<U>): AsyncResult<U, E>;\n transform<U extends Val, EE extends Val>(\n fn: (\n value: T,\n ) =>\n | Result<U, E | EE>\n | AsyncResult<U, E | EE>\n | ZodSafeParseResult<NonNullable<U>>\n | Promise<ZodSafeParseResult<NonNullable<U>>>\n | Promise<Result<U, E | EE>>\n | Promise<RawValue<U>>\n | RawValue<U>,\n ): AsyncResult<U, E | EE | ZodError> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => {\n const { ok, val: value, err: error } = oldResult.unwrap();\n if (!ok) {\n return Result.err(error);\n }\n\n try {\n const result = fn(value);\n\n if (result instanceof Result) {\n return result;\n }\n\n if (result instanceof AsyncResult) {\n return result;\n }\n\n if (isZodResult<U>(result)) {\n return fromZodResult<U>(result);\n }\n\n if (result instanceof Promise) {\n return AsyncResult.wrap(result, (err) => {\n logger.warn(\n { err },\n 'AsyncResult: unhandled async transform error',\n );\n return Result._uncaught(err);\n });\n }\n\n return Result.ok(result);\n } catch (err) {\n logger.warn({ err }, 'AsyncResult: unhandled transform error');\n return Result._uncaught(err);\n }\n })\n .catch((err) => {\n // Happens when `.unwrap()` of `oldResult` throws\n return Result._uncaught(err);\n }),\n );\n }\n\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Result<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => AsyncResult<U, EE>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (err: NonNullable<E>) => Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE>;\n catch<U extends Val = T, EE extends Val = E>(\n fn: (\n err: NonNullable<E>,\n ) => Result<U, EE> | AsyncResult<U, EE> | Promise<Result<U, EE>>,\n ): AsyncResult<T | U, EE> {\n const caughtAsyncResult: Promise<Result<T, EE>> = this.asyncResult.then(\n (result) => result.catch(fn as never),\n );\n return AsyncResult.wrap(caughtAsyncResult);\n }\n\n /**\n * Given a `schema`, returns a `Result` with `val` being the parsed value.\n * Additionally, `null` and `undefined` values are converted into Zod error.\n */\n parse<Schema extends ZodType<any, any, any>>(\n schema: Schema,\n ): AsyncResult<NonNullable<ZodOutput<Schema>>, E | ZodError> {\n return new AsyncResult(\n this.asyncResult\n .then((oldResult) => oldResult.parse(schema))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onValue(fn: (value: T) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onValue(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n\n onError(fn: (err: E) => void): AsyncResult<T, E> {\n return new AsyncResult(\n this.asyncResult\n .then((result) => result.onError(fn))\n .catch(\n /* istanbul ignore next: should never happen */\n (err) => Result._uncaught(err),\n ),\n );\n }\n}\n"],"mappings":"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"}
package/dist/util/yaml.js CHANGED
@@ -44,7 +44,7 @@ function parseYaml(content, options) {
44
44
  }
45
45
  if (options?.failureBehaviour === "filter") {
46
46
  logger.trace({
47
- error: result.error,
47
+ err: result.error,
48
48
  document
49
49
  }, "Failed to parse schema for YAML");
50
50
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"yaml.js","names":[],"sources":["../../lib/util/yaml.ts"],"sourcesContent":["import type {\n CreateNodeOptions,\n Document,\n DocumentOptions,\n ParseOptions,\n SchemaOptions,\n ToStringOptions,\n} from 'yaml';\nimport { parseAllDocuments, parseDocument, stringify } from 'yaml';\nimport type { ZodType } from 'zod/v4';\nimport { logger } from '../logger/index.ts';\nimport { stripTemplates } from './string.ts';\n\nexport interface YamlOptions<\n ResT = unknown,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n>\n extends ParseOptions, DocumentOptions, SchemaOptions {\n customSchema?: Schema;\n removeTemplates?: boolean;\n}\n\ninterface YamlParseDocumentOptions\n extends ParseOptions, DocumentOptions, SchemaOptions {\n removeTemplates?: boolean;\n}\n\nexport interface YamlOptionsMultiple<\n ResT = unknown,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n> extends YamlOptions<ResT, Schema> {\n failureBehaviour?: 'throw' | 'filter';\n}\n\nexport type DumpOptions = DocumentOptions &\n SchemaOptions &\n ParseOptions &\n CreateNodeOptions &\n ToStringOptions;\n\n/**\n * Parse a YAML string into a JavaScript object.\n *\n * Multiple documents are supported.\n *\n * If a schema is provided, the parsed object will be validated against it.\n *\n * If failureBehaviour is set to 'filter',\n * the function will return an empty array if the YAML parsing or schema validation fails and therefore will not throw an error.\n *\n * If failureBehaviour is set to 'throw',\n * the function will throw an error if the YAML parsing or schema validation fails for ANY document.\n * @param content\n * @param options\n */\nexport function parseYaml<ResT = unknown>(\n content: string,\n options?: YamlOptionsMultiple<ResT>,\n): ResT[] {\n const massagedContent = massageContent(content, options);\n\n const rawDocuments = parseAllDocuments(\n massagedContent,\n prepareParseOption(options),\n );\n\n const schema = options?.customSchema;\n\n const results: ResT[] = [];\n for (const rawDocument of rawDocuments) {\n const errors = rawDocument.errors;\n // handle YAML parse errors\n if (errors?.length) {\n const error = new AggregateError(errors, 'Failed to parse YAML file');\n if (options?.failureBehaviour === 'filter') {\n logger.debug(`Failed to parse YAML file`);\n continue;\n }\n throw error;\n }\n\n const document = rawDocument.toJS({ maxAliasCount: 10000 });\n\n // skip schema validation if no schema is provided\n if (!schema) {\n results.push(document as ResT);\n continue;\n }\n\n const result = schema.safeParse(document);\n if (result.success) {\n results.push(result.data);\n continue;\n }\n\n // handle schema validation errors\n if (options?.failureBehaviour === 'filter') {\n logger.trace(\n { error: result.error, document },\n 'Failed to parse schema for YAML',\n );\n continue;\n }\n throw new Error('Failed to parse YAML file', { cause: result.error });\n }\n\n return results;\n}\n\n/**\n * Parse a YAML string into a JavaScript object.\n *\n * Only a single document is supported.\n *\n * If a schema is provided, the parsed object will be validated against it.\n * Should the YAML parsing or schemata validation fail, an error will be thrown.\n *\n * @param content\n * @param options\n */\nexport function parseSingleYaml<ResT = unknown>(\n content: string,\n options?: YamlOptions<ResT>,\n): ResT {\n const rawDocument = parseSingleYamlDocument(content, options);\n\n const document = rawDocument.toJS({ maxAliasCount: 10000 });\n const schema = options?.customSchema;\n if (!schema) {\n return document as ResT;\n }\n\n return schema.parse(document);\n}\n\n/**\n * Parse a YAML string into a Document representation.\n *\n * Only a single document is supported.\n *\n * @param content\n * @param options\n */\nexport function parseSingleYamlDocument(\n content: string,\n options?: YamlParseDocumentOptions,\n): Document {\n const massagedContent = massageContent(content, options);\n const rawDocument = parseDocument(\n massagedContent,\n prepareParseOption(options),\n );\n\n if (rawDocument?.errors?.length) {\n throw new AggregateError(rawDocument.errors, 'Failed to parse YAML file');\n }\n\n return rawDocument;\n}\n\nexport function dump(obj: any, opts?: DumpOptions): string {\n return stringify(obj, opts);\n}\n\nfunction massageContent(content: string, options?: YamlOptions): string {\n if (options?.removeTemplates) {\n return stripTemplates(content);\n }\n\n return content;\n}\n\nfunction prepareParseOption(options: YamlOptions | undefined): YamlOptions {\n return {\n prettyErrors: true,\n // if we're removing templates, we can run into the situation where we have duplicate keys\n uniqueKeys: !options?.removeTemplates,\n strict: false,\n ...options,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuDA,SAAgB,UACd,SACA,SACQ;CACR,MAAM,kBAAkB,eAAe,SAAS,OAAO;CAEvD,MAAM,eAAe,kBACnB,iBACA,mBAAmB,OAAO,CAC5B;CAEA,MAAM,SAAS,SAAS;CAExB,MAAM,UAAkB,CAAC;CACzB,KAAK,MAAM,eAAe,cAAc;EACtC,MAAM,SAAS,YAAY;EAE3B,IAAI,QAAQ,QAAQ;GAClB,MAAM,QAAQ,IAAI,eAAe,QAAQ,2BAA2B;GACpE,IAAI,SAAS,qBAAqB,UAAU;IAC1C,OAAO,MAAM,2BAA2B;IACxC;GACF;GACA,MAAM;EACR;EAEA,MAAM,WAAW,YAAY,KAAK,EAAE,eAAe,IAAM,CAAC;EAG1D,IAAI,CAAC,QAAQ;GACX,QAAQ,KAAK,QAAgB;GAC7B;EACF;EAEA,MAAM,SAAS,OAAO,UAAU,QAAQ;EACxC,IAAI,OAAO,SAAS;GAClB,QAAQ,KAAK,OAAO,IAAI;GACxB;EACF;EAGA,IAAI,SAAS,qBAAqB,UAAU;GAC1C,OAAO,MACL;IAAE,OAAO,OAAO;IAAO;GAAS,GAChC,iCACF;GACA;EACF;EACA,MAAM,IAAI,MAAM,6BAA6B,EAAE,OAAO,OAAO,MAAM,CAAC;CACtE;CAEA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,gBACd,SACA,SACM;CAGN,MAAM,WAFc,wBAAwB,SAAS,OAE1B,CAAC,CAAC,KAAK,EAAE,eAAe,IAAM,CAAC;CAC1D,MAAM,SAAS,SAAS;CACxB,IAAI,CAAC,QACH,OAAO;CAGT,OAAO,OAAO,MAAM,QAAQ;AAC9B;;;;;;;;;AAUA,SAAgB,wBACd,SACA,SACU;CACV,MAAM,kBAAkB,eAAe,SAAS,OAAO;CACvD,MAAM,cAAc,cAClB,iBACA,mBAAmB,OAAO,CAC5B;CAEA,IAAI,aAAa,QAAQ,QACvB,MAAM,IAAI,eAAe,YAAY,QAAQ,2BAA2B;CAG1E,OAAO;AACT;AAEA,SAAgB,KAAK,KAAU,MAA4B;CACzD,OAAO,UAAU,KAAK,IAAI;AAC5B;AAEA,SAAS,eAAe,SAAiB,SAA+B;CACtE,IAAI,SAAS,iBACX,OAAO,eAAe,OAAO;CAG/B,OAAO;AACT;AAEA,SAAS,mBAAmB,SAA+C;CACzE,OAAO;EACL,cAAc;EAEd,YAAY,CAAC,SAAS;EACtB,QAAQ;EACR,GAAG;CACL;AACF"}
1
+ {"version":3,"file":"yaml.js","names":[],"sources":["../../lib/util/yaml.ts"],"sourcesContent":["import type {\n CreateNodeOptions,\n Document,\n DocumentOptions,\n ParseOptions,\n SchemaOptions,\n ToStringOptions,\n} from 'yaml';\nimport { parseAllDocuments, parseDocument, stringify } from 'yaml';\nimport type { ZodType } from 'zod/v4';\nimport { logger } from '../logger/index.ts';\nimport { stripTemplates } from './string.ts';\n\nexport interface YamlOptions<\n ResT = unknown,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n>\n extends ParseOptions, DocumentOptions, SchemaOptions {\n customSchema?: Schema;\n removeTemplates?: boolean;\n}\n\ninterface YamlParseDocumentOptions\n extends ParseOptions, DocumentOptions, SchemaOptions {\n removeTemplates?: boolean;\n}\n\nexport interface YamlOptionsMultiple<\n ResT = unknown,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n> extends YamlOptions<ResT, Schema> {\n failureBehaviour?: 'throw' | 'filter';\n}\n\nexport type DumpOptions = DocumentOptions &\n SchemaOptions &\n ParseOptions &\n CreateNodeOptions &\n ToStringOptions;\n\n/**\n * Parse a YAML string into a JavaScript object.\n *\n * Multiple documents are supported.\n *\n * If a schema is provided, the parsed object will be validated against it.\n *\n * If failureBehaviour is set to 'filter',\n * the function will return an empty array if the YAML parsing or schema validation fails and therefore will not throw an error.\n *\n * If failureBehaviour is set to 'throw',\n * the function will throw an error if the YAML parsing or schema validation fails for ANY document.\n * @param content\n * @param options\n */\nexport function parseYaml<ResT = unknown>(\n content: string,\n options?: YamlOptionsMultiple<ResT>,\n): ResT[] {\n const massagedContent = massageContent(content, options);\n\n const rawDocuments = parseAllDocuments(\n massagedContent,\n prepareParseOption(options),\n );\n\n const schema = options?.customSchema;\n\n const results: ResT[] = [];\n for (const rawDocument of rawDocuments) {\n const errors = rawDocument.errors;\n // handle YAML parse errors\n if (errors?.length) {\n const error = new AggregateError(errors, 'Failed to parse YAML file');\n if (options?.failureBehaviour === 'filter') {\n logger.debug(`Failed to parse YAML file`);\n continue;\n }\n throw error;\n }\n\n const document = rawDocument.toJS({ maxAliasCount: 10000 });\n\n // skip schema validation if no schema is provided\n if (!schema) {\n results.push(document as ResT);\n continue;\n }\n\n const result = schema.safeParse(document);\n if (result.success) {\n results.push(result.data);\n continue;\n }\n\n // handle schema validation errors\n if (options?.failureBehaviour === 'filter') {\n logger.trace(\n { err: result.error, document },\n 'Failed to parse schema for YAML',\n );\n continue;\n }\n throw new Error('Failed to parse YAML file', { cause: result.error });\n }\n\n return results;\n}\n\n/**\n * Parse a YAML string into a JavaScript object.\n *\n * Only a single document is supported.\n *\n * If a schema is provided, the parsed object will be validated against it.\n * Should the YAML parsing or schemata validation fail, an error will be thrown.\n *\n * @param content\n * @param options\n */\nexport function parseSingleYaml<ResT = unknown>(\n content: string,\n options?: YamlOptions<ResT>,\n): ResT {\n const rawDocument = parseSingleYamlDocument(content, options);\n\n const document = rawDocument.toJS({ maxAliasCount: 10000 });\n const schema = options?.customSchema;\n if (!schema) {\n return document as ResT;\n }\n\n return schema.parse(document);\n}\n\n/**\n * Parse a YAML string into a Document representation.\n *\n * Only a single document is supported.\n *\n * @param content\n * @param options\n */\nexport function parseSingleYamlDocument(\n content: string,\n options?: YamlParseDocumentOptions,\n): Document {\n const massagedContent = massageContent(content, options);\n const rawDocument = parseDocument(\n massagedContent,\n prepareParseOption(options),\n );\n\n if (rawDocument?.errors?.length) {\n throw new AggregateError(rawDocument.errors, 'Failed to parse YAML file');\n }\n\n return rawDocument;\n}\n\nexport function dump(obj: any, opts?: DumpOptions): string {\n return stringify(obj, opts);\n}\n\nfunction massageContent(content: string, options?: YamlOptions): string {\n if (options?.removeTemplates) {\n return stripTemplates(content);\n }\n\n return content;\n}\n\nfunction prepareParseOption(options: YamlOptions | undefined): YamlOptions {\n return {\n prettyErrors: true,\n // if we're removing templates, we can run into the situation where we have duplicate keys\n uniqueKeys: !options?.removeTemplates,\n strict: false,\n ...options,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuDA,SAAgB,UACd,SACA,SACQ;CACR,MAAM,kBAAkB,eAAe,SAAS,OAAO;CAEvD,MAAM,eAAe,kBACnB,iBACA,mBAAmB,OAAO,CAC5B;CAEA,MAAM,SAAS,SAAS;CAExB,MAAM,UAAkB,CAAC;CACzB,KAAK,MAAM,eAAe,cAAc;EACtC,MAAM,SAAS,YAAY;EAE3B,IAAI,QAAQ,QAAQ;GAClB,MAAM,QAAQ,IAAI,eAAe,QAAQ,2BAA2B;GACpE,IAAI,SAAS,qBAAqB,UAAU;IAC1C,OAAO,MAAM,2BAA2B;IACxC;GACF;GACA,MAAM;EACR;EAEA,MAAM,WAAW,YAAY,KAAK,EAAE,eAAe,IAAM,CAAC;EAG1D,IAAI,CAAC,QAAQ;GACX,QAAQ,KAAK,QAAgB;GAC7B;EACF;EAEA,MAAM,SAAS,OAAO,UAAU,QAAQ;EACxC,IAAI,OAAO,SAAS;GAClB,QAAQ,KAAK,OAAO,IAAI;GACxB;EACF;EAGA,IAAI,SAAS,qBAAqB,UAAU;GAC1C,OAAO,MACL;IAAE,KAAK,OAAO;IAAO;GAAS,GAC9B,iCACF;GACA;EACF;EACA,MAAM,IAAI,MAAM,6BAA6B,EAAE,OAAO,OAAO,MAAM,CAAC;CACtE;CAEA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,gBACd,SACA,SACM;CAGN,MAAM,WAFc,wBAAwB,SAAS,OAE1B,CAAC,CAAC,KAAK,EAAE,eAAe,IAAM,CAAC;CAC1D,MAAM,SAAS,SAAS;CACxB,IAAI,CAAC,QACH,OAAO;CAGT,OAAO,OAAO,MAAM,QAAQ;AAC9B;;;;;;;;;AAUA,SAAgB,wBACd,SACA,SACU;CACV,MAAM,kBAAkB,eAAe,SAAS,OAAO;CACvD,MAAM,cAAc,cAClB,iBACA,mBAAmB,OAAO,CAC5B;CAEA,IAAI,aAAa,QAAQ,QACvB,MAAM,IAAI,eAAe,YAAY,QAAQ,2BAA2B;CAG1E,OAAO;AACT;AAEA,SAAgB,KAAK,KAAU,MAA4B;CACzD,OAAO,UAAU,KAAK,IAAI;AAC5B;AAEA,SAAS,eAAe,SAAiB,SAA+B;CACtE,IAAI,SAAS,iBACX,OAAO,eAAe,OAAO;CAG/B,OAAO;AACT;AAEA,SAAS,mBAAmB,SAA+C;CACzE,OAAO;EACL,cAAc;EAEd,YAAY,CAAC,SAAS;EACtB,QAAQ;EACR,GAAG;CACL;AACF"}
@@ -19,7 +19,7 @@ async function getConfig(env) {
19
19
  config = await getParsedContent(configFile);
20
20
  } catch (err) {
21
21
  if (err instanceof SyntaxError || err instanceof TypeError) {
22
- logger.fatal({ error: err.stack }, "Could not parse additional config file");
22
+ logger.fatal({ err }, "Could not parse additional config file");
23
23
  process.exit(1);
24
24
  } else if (err instanceof ReferenceError) {
25
25
  logger.fatal({ err }, "Error parsing additional config file due to unresolved variable(s)");
@@ -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 { 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"}
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({ err }, 'Could not parse additional config file');\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,MAAM,EAAE,IAAI,GAAG,wCAAwC;GAC9D,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"}
@@ -20,7 +20,7 @@ async function getConfig(env) {
20
20
  config = await getParsedContent(configFile);
21
21
  } catch (err) {
22
22
  if (err instanceof SyntaxError || err instanceof TypeError) {
23
- logger.fatal({ error: err.stack }, "Could not parse config file");
23
+ logger.fatal({ err }, "Could not parse config file");
24
24
  process.exit(1);
25
25
  } else if (err instanceof ReferenceError) {
26
26
  logger.fatal({ err }, "Error parsing config file due to unresolved variable(s)");
@@ -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 { 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"}
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({ err }, '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,IAAI,GAAG,6BAA6B;GACnD,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"}