renovate 44.196.0 → 44.197.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 (31) hide show
  1. package/dist/instrumentation/reporting.js +19 -1
  2. package/dist/instrumentation/reporting.js.map +1 -1
  3. package/dist/instrumentation/types.d.ts +27 -0
  4. package/dist/instrumentation/types.js.map +1 -1
  5. package/dist/modules/manager/index.d.ts +5 -1
  6. package/dist/modules/manager/index.js +9 -1
  7. package/dist/modules/manager/index.js.map +1 -1
  8. package/dist/modules/manager/mise/index.js +3 -1
  9. package/dist/modules/manager/mise/index.js.map +1 -1
  10. package/dist/modules/manager/npm/index.js +10 -1
  11. package/dist/modules/manager/npm/index.js.map +1 -1
  12. package/dist/modules/manager/pep621/index.js +6 -1
  13. package/dist/modules/manager/pep621/index.js.map +1 -1
  14. package/dist/modules/manager/poetry/index.js +6 -1
  15. package/dist/modules/manager/poetry/index.js.map +1 -1
  16. package/dist/modules/manager/types.d.ts +30 -1
  17. package/dist/util/minimum-release-age.js +11 -6
  18. package/dist/util/minimum-release-age.js.map +1 -1
  19. package/dist/workers/global/index.js +1 -1
  20. package/dist/workers/repository/finalize/index.js +3 -1
  21. package/dist/workers/repository/finalize/index.js.map +1 -1
  22. package/dist/workers/repository/finalize/repository-statistics.js +2 -1
  23. package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
  24. package/dist/workers/repository/index.js +1 -1
  25. package/dist/workers/repository/result.js +2 -0
  26. package/dist/workers/repository/result.js.map +1 -1
  27. package/dist/workers/repository/update/branch/index.js +14 -2
  28. package/dist/workers/repository/update/branch/index.js.map +1 -1
  29. package/dist/workers/types.d.ts +1 -0
  30. package/package.json +4 -7
  31. package/renovate-schema.json +2 -2
@@ -1,6 +1,8 @@
1
1
  import { prettier } from "../expose.js";
2
+ import { GlobalConfig } from "../config/global.js";
2
3
  import { sanitizeValue } from "../logger/utils.js";
3
4
  import { getProblems, logger } from "../logger/index.js";
5
+ import { getInheritedOrGlobal } from "../util/common.js";
4
6
  import { writeSystemFile } from "../util/fs/index.js";
5
7
  import { getS3Client, parseS3Url } from "../util/s3.js";
6
8
  import { isNullOrUndefined, isUndefined } from "@sindresorhus/is";
@@ -15,6 +17,22 @@ function addBranchStats(config, branchesInformation) {
15
17
  coerceRepo(config.repository);
16
18
  report.repositories[config.repository].branches = branchesInformation;
17
19
  }
20
+ function addRepositoryMetadata(config, configFileName, prList) {
21
+ if (isNullOrUndefined(config.reportType)) return;
22
+ coerceRepo(config.repository);
23
+ const repoReport = report.repositories[config.repository];
24
+ repoReport.platform = GlobalConfig.get("platform");
25
+ repoReport.defaultBranch = config.defaultBranch;
26
+ repoReport.dependencyDashboardIssue = config.dependencyDashboardIssue ?? null;
27
+ if (configFileName) repoReport.configFileName = configFileName;
28
+ const onboardingBranch = getInheritedOrGlobal("onboardingBranch");
29
+ repoReport.onboardingPrNumber = prList.find((pr) => pr.sourceBranch === onboardingBranch && pr.state === "open")?.number ?? null;
30
+ }
31
+ function addRepositoryStatus(config, status) {
32
+ if (isNullOrUndefined(config.reportType)) return;
33
+ coerceRepo(config.repository);
34
+ report.repositories[config.repository].status = status;
35
+ }
18
36
  function addExtractionStats(config, extractResult) {
19
37
  if (isNullOrUndefined(config.reportType)) return;
20
38
  coerceRepo(config.repository);
@@ -87,6 +105,6 @@ function coerceRepo(repository) {
87
105
  };
88
106
  }
89
107
  //#endregion
90
- export { addBranchStats, addExtractionStats, addLibYears, exportStats, finalizeReport };
108
+ export { addBranchStats, addExtractionStats, addLibYears, addRepositoryMetadata, addRepositoryStatus, exportStats, finalizeReport };
91
109
 
92
110
  //# sourceMappingURL=reporting.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reporting.js","names":[],"sources":["../../lib/instrumentation/reporting.ts"],"sourcesContent":["import type { PutObjectCommandInput } from '@aws-sdk/client-s3';\nimport { PutObjectCommand } from '@aws-sdk/client-s3';\nimport { isNullOrUndefined, isUndefined } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../config/types.ts';\nimport { prettier } from '../expose.ts';\nimport { getProblems, logger } from '../logger/index.ts';\nimport { sanitizeValue } from '../logger/utils.ts';\nimport type { BranchCache } from '../util/cache/repository/types.ts';\nimport { writeSystemFile } from '../util/fs/index.ts';\nimport { getS3Client, parseS3Url } from '../util/s3.ts';\nimport type { ExtractResult } from '../workers/repository/process/extract-update.ts';\nimport type { LibYearsWithStatus, Report } from './types.ts';\n\nconst report: Report = {\n problems: [],\n repositories: {},\n};\n\n/**\n * Reset the report\n * Should only be used for testing\n */\nexport function resetReport(): void {\n report.problems = [];\n report.repositories = {};\n}\n\nexport function addBranchStats(\n config: RenovateConfig,\n branchesInformation: Partial<BranchCache>[],\n): void {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n coerceRepo(config.repository!);\n report.repositories[config.repository!].branches = branchesInformation;\n}\n\nexport function addExtractionStats(\n config: RenovateConfig,\n extractResult: ExtractResult,\n): void {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n coerceRepo(config.repository!);\n report.repositories[config.repository!].packageFiles =\n extractResult.packageFiles;\n}\n\nexport function addLibYears(\n config: RenovateConfig,\n libYearsWithDepCount: LibYearsWithStatus,\n): void {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n coerceRepo(config.repository!);\n report.repositories[config.repository!].libYearsWithStatus =\n libYearsWithDepCount;\n}\n\nexport function finalizeReport(): void {\n const allProblems = structuredClone(getProblems());\n for (const problem of allProblems) {\n const repository = problem.repository;\n delete problem.repository;\n\n // if the problem can be connected to a repository add it their else add to the root list\n if (repository) {\n coerceRepo(repository);\n report.repositories[repository].problems.push(problem);\n } else {\n report.problems.push(problem);\n }\n }\n}\n\n/**\n * Returns the report as JSON, sanitized like a log record.\n */\nasync function getReportBody(config: RenovateConfig): Promise<string> {\n const json = JSON.stringify(sanitizeValue(report));\n if (!config.reportFormatting) {\n return json;\n }\n return prettier().format(json, { parser: 'json' });\n}\n\nexport async function exportStats(config: RenovateConfig): Promise<void> {\n try {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n if (config.reportType === 'logging') {\n logger.info({ report }, 'Printing report');\n return;\n }\n\n if (config.reportType === 'file') {\n const path = config.reportPath!;\n await writeSystemFile(path, await getReportBody(config));\n logger.debug({ path }, 'Writing report');\n return;\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (config.reportType === 's3') {\n const s3Url = parseS3Url(config.reportPath!);\n if (isNullOrUndefined(s3Url)) {\n logger.warn(\n { reportPath: config.reportPath },\n 'Failed to parse s3 URL',\n );\n return;\n }\n\n const s3Params: PutObjectCommandInput = {\n Bucket: s3Url.Bucket,\n Key: s3Url.Key,\n Body: await getReportBody(config),\n ContentType: 'application/json',\n };\n\n const client = getS3Client(config.s3Endpoint, config.s3PathStyle);\n const command = new PutObjectCommand(s3Params);\n await client.send(command);\n }\n } catch (err) {\n logger.warn({ err }, 'Reporting.exportStats() - failure');\n }\n}\n\nexport function getReport(): Report {\n return structuredClone(report);\n}\n\nfunction coerceRepo(repository: string): void {\n if (!isUndefined(report.repositories[repository])) {\n return;\n }\n\n report.repositories[repository] = {\n problems: [],\n branches: [],\n packageFiles: {},\n };\n}\n"],"mappings":";;;;;;;;AAaA,MAAM,SAAiB;CACrB,UAAU,CAAC;CACX,cAAc,CAAC;AACjB;AAWA,SAAgB,eACd,QACA,qBACM;CACN,IAAI,kBAAkB,OAAO,UAAU,GACrC;CAGF,WAAW,OAAO,UAAW;CAC7B,OAAO,aAAa,OAAO,WAAY,CAAC,WAAW;AACrD;AAEA,SAAgB,mBACd,QACA,eACM;CACN,IAAI,kBAAkB,OAAO,UAAU,GACrC;CAGF,WAAW,OAAO,UAAW;CAC7B,OAAO,aAAa,OAAO,WAAY,CAAC,eACtC,cAAc;AAClB;AAEA,SAAgB,YACd,QACA,sBACM;CACN,IAAI,kBAAkB,OAAO,UAAU,GACrC;CAGF,WAAW,OAAO,UAAW;CAC7B,OAAO,aAAa,OAAO,WAAY,CAAC,qBACtC;AACJ;AAEA,SAAgB,iBAAuB;CACrC,MAAM,cAAc,gBAAgB,YAAY,CAAC;CACjD,KAAK,MAAM,WAAW,aAAa;EACjC,MAAM,aAAa,QAAQ;EAC3B,OAAO,QAAQ;EAGf,IAAI,YAAY;GACd,WAAW,UAAU;GACrB,OAAO,aAAa,WAAW,CAAC,SAAS,KAAK,OAAO;EACvD,OACE,OAAO,SAAS,KAAK,OAAO;CAEhC;AACF;;;;AAKA,eAAe,cAAc,QAAyC;CACpE,MAAM,OAAO,KAAK,UAAU,cAAc,MAAM,CAAC;CACjD,IAAI,CAAC,OAAO,kBACV,OAAO;CAET,OAAO,SAAS,CAAC,CAAC,OAAO,MAAM,EAAE,QAAQ,OAAO,CAAC;AACnD;AAEA,eAAsB,YAAY,QAAuC;CACvE,IAAI;EACF,IAAI,kBAAkB,OAAO,UAAU,GACrC;EAGF,IAAI,OAAO,eAAe,WAAW;GACnC,OAAO,KAAK,EAAE,OAAO,GAAG,iBAAiB;GACzC;EACF;EAEA,IAAI,OAAO,eAAe,QAAQ;GAChC,MAAM,OAAO,OAAO;GACpB,MAAM,gBAAgB,MAAM,MAAM,cAAc,MAAM,CAAC;GACvD,OAAO,MAAM,EAAE,KAAK,GAAG,gBAAgB;GACvC;EACF;;EAGA,IAAI,OAAO,eAAe,MAAM;GAC9B,MAAM,QAAQ,WAAW,OAAO,UAAW;GAC3C,IAAI,kBAAkB,KAAK,GAAG;IAC5B,OAAO,KACL,EAAE,YAAY,OAAO,WAAW,GAChC,wBACF;IACA;GACF;GAEA,MAAM,WAAkC;IACtC,QAAQ,MAAM;IACd,KAAK,MAAM;IACX,MAAM,MAAM,cAAc,MAAM;IAChC,aAAa;GACf;GAEA,MAAM,SAAS,YAAY,OAAO,YAAY,OAAO,WAAW;GAChE,MAAM,UAAU,IAAI,iBAAiB,QAAQ;GAC7C,MAAM,OAAO,KAAK,OAAO;EAC3B;CACF,SAAS,KAAK;EACZ,OAAO,KAAK,EAAE,IAAI,GAAG,mCAAmC;CAC1D;AACF;AAMA,SAAS,WAAW,YAA0B;CAC5C,IAAI,CAAC,YAAY,OAAO,aAAa,WAAW,GAC9C;CAGF,OAAO,aAAa,cAAc;EAChC,UAAU,CAAC;EACX,UAAU,CAAC;EACX,cAAc,CAAC;CACjB;AACF"}
1
+ {"version":3,"file":"reporting.js","names":[],"sources":["../../lib/instrumentation/reporting.ts"],"sourcesContent":["import type { PutObjectCommandInput } from '@aws-sdk/client-s3';\nimport { PutObjectCommand } from '@aws-sdk/client-s3';\nimport { isNullOrUndefined, isUndefined } from '@sindresorhus/is';\nimport { GlobalConfig } from '../config/global.ts';\nimport type { RenovateConfig } from '../config/types.ts';\nimport { prettier } from '../expose.ts';\nimport { getProblems, logger } from '../logger/index.ts';\nimport { sanitizeValue } from '../logger/utils.ts';\nimport type { Pr } from '../modules/platform/index.ts';\nimport type { BranchCache } from '../util/cache/repository/types.ts';\nimport { getInheritedOrGlobal } from '../util/common.ts';\nimport { writeSystemFile } from '../util/fs/index.ts';\nimport { getS3Client, parseS3Url } from '../util/s3.ts';\nimport type { ExtractResult } from '../workers/repository/process/extract-update.ts';\nimport type { ProcessStatus } from '../workers/repository/result.ts';\nimport type { LibYearsWithStatus, Report } from './types.ts';\n\nconst report: Report = {\n problems: [],\n repositories: {},\n};\n\n/**\n * Reset the report\n * Should only be used for testing\n */\nexport function resetReport(): void {\n report.problems = [];\n report.repositories = {};\n}\n\nexport function addBranchStats(\n config: RenovateConfig,\n branchesInformation: Partial<BranchCache>[],\n): void {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n coerceRepo(config.repository!);\n report.repositories[config.repository!].branches = branchesInformation;\n}\n\nexport function addRepositoryMetadata(\n config: RenovateConfig,\n configFileName: string | undefined,\n prList: Pr[],\n): void {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n coerceRepo(config.repository!);\n const repoReport = report.repositories[config.repository!];\n repoReport.platform = GlobalConfig.get('platform');\n repoReport.defaultBranch = config.defaultBranch;\n repoReport.dependencyDashboardIssue = config.dependencyDashboardIssue ?? null;\n // Omit when there is no in-repo config file (cache stores an empty string).\n if (configFileName) {\n repoReport.configFileName = configFileName;\n }\n\n const onboardingBranch = getInheritedOrGlobal('onboardingBranch');\n const onboardingPr = prList.find(\n (pr) => pr.sourceBranch === onboardingBranch && pr.state === 'open',\n );\n repoReport.onboardingPrNumber = onboardingPr?.number ?? null;\n}\n\nexport function addRepositoryStatus(\n config: RenovateConfig,\n status: ProcessStatus,\n): void {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n coerceRepo(config.repository!);\n report.repositories[config.repository!].status = status;\n}\n\nexport function addExtractionStats(\n config: RenovateConfig,\n extractResult: ExtractResult,\n): void {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n coerceRepo(config.repository!);\n report.repositories[config.repository!].packageFiles =\n extractResult.packageFiles;\n}\n\nexport function addLibYears(\n config: RenovateConfig,\n libYearsWithDepCount: LibYearsWithStatus,\n): void {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n coerceRepo(config.repository!);\n report.repositories[config.repository!].libYearsWithStatus =\n libYearsWithDepCount;\n}\n\nexport function finalizeReport(): void {\n const allProblems = structuredClone(getProblems());\n for (const problem of allProblems) {\n const repository = problem.repository;\n delete problem.repository;\n\n // if the problem can be connected to a repository add it their else add to the root list\n if (repository) {\n coerceRepo(repository);\n report.repositories[repository].problems.push(problem);\n } else {\n report.problems.push(problem);\n }\n }\n}\n\n/**\n * Returns the report as JSON, sanitized like a log record.\n */\nasync function getReportBody(config: RenovateConfig): Promise<string> {\n const json = JSON.stringify(sanitizeValue(report));\n if (!config.reportFormatting) {\n return json;\n }\n return prettier().format(json, { parser: 'json' });\n}\n\nexport async function exportStats(config: RenovateConfig): Promise<void> {\n try {\n if (isNullOrUndefined(config.reportType)) {\n return;\n }\n\n if (config.reportType === 'logging') {\n logger.info({ report }, 'Printing report');\n return;\n }\n\n if (config.reportType === 'file') {\n const path = config.reportPath!;\n await writeSystemFile(path, await getReportBody(config));\n logger.debug({ path }, 'Writing report');\n return;\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (config.reportType === 's3') {\n const s3Url = parseS3Url(config.reportPath!);\n if (isNullOrUndefined(s3Url)) {\n logger.warn(\n { reportPath: config.reportPath },\n 'Failed to parse s3 URL',\n );\n return;\n }\n\n const s3Params: PutObjectCommandInput = {\n Bucket: s3Url.Bucket,\n Key: s3Url.Key,\n Body: await getReportBody(config),\n ContentType: 'application/json',\n };\n\n const client = getS3Client(config.s3Endpoint, config.s3PathStyle);\n const command = new PutObjectCommand(s3Params);\n await client.send(command);\n }\n } catch (err) {\n logger.warn({ err }, 'Reporting.exportStats() - failure');\n }\n}\n\nexport function getReport(): Report {\n return structuredClone(report);\n}\n\nfunction coerceRepo(repository: string): void {\n if (!isUndefined(report.repositories[repository])) {\n return;\n }\n\n report.repositories[repository] = {\n problems: [],\n branches: [],\n packageFiles: {},\n };\n}\n"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
+ import { PlatformId } from "../constants/platforms.js";
1
2
  import { BunyanRecord } from "../logger/types.js";
2
3
  import { GitOperationType } from "../util/git/types.js";
3
4
  import { BranchCache } from "../util/cache/repository/types.js";
5
+ import { ProcessStatus } from "../workers/repository/result.js";
4
6
  import { PackageFile } from "../modules/manager/types.js";
5
7
  import { RenovateSplit } from "../config/types.js";
6
8
  import { Attributes, SpanKind, SpanOptions } from "@opentelemetry/api";
@@ -47,6 +49,31 @@ interface RepoReport {
47
49
  branches: Partial<BranchCache>[];
48
50
  packageFiles: Record<string, PackageFile[]>;
49
51
  libYearsWithStatus?: LibYearsWithStatus;
52
+ /**
53
+ * The platform type of the repository (ex: `github`, `gitlab`).
54
+ */
55
+ platform?: PlatformId;
56
+ /**
57
+ * The default branch name of the repository.
58
+ */
59
+ defaultBranch?: string;
60
+ /**
61
+ * The issue number of the Dependency Dashboard, or `null` if none exists.
62
+ */
63
+ dependencyDashboardIssue?: number | null;
64
+ /**
65
+ * Path to the repository's Renovate config file (ex: `.github/renovate.json5`).
66
+ * Omitted when the repository has no in-repo config file.
67
+ */
68
+ configFileName?: string;
69
+ /**
70
+ * The repository's processing status (ex: `onboarding`, `onboarded`, `activated`).
71
+ */
72
+ status?: ProcessStatus;
73
+ /**
74
+ * The number of the open (unmerged) onboarding PR, or `null` if none exists.
75
+ */
76
+ onboardingPrNumber?: number | null;
50
77
  }
51
78
  export interface LibYearsWithStatus {
52
79
  libYears: LibYears;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../lib/instrumentation/types.ts"],"sourcesContent":["import type { Attributes, SpanKind, SpanOptions } from '@opentelemetry/api';\nimport type { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport type { RenovateSplit } from '../config/types.ts';\nimport type { BunyanRecord } from '../logger/types.ts';\nimport type { PackageFile } from '../modules/manager/types.ts';\nimport type { BranchCache } from '../util/cache/repository/types.ts';\nimport type { GitOperationType } from '../util/git/types.ts';\n\nexport type RenovateSpanOptions = {\n attributes?: RenovateSpanAttributes;\n} & SpanOptions;\n\nexport type RenovateSpanAttributes = {\n [ATTR_RENOVATE_SPLIT]?: RenovateSplit;\n [ATTR_VCS_GIT_OPERATION_TYPE]?: GitOperationType;\n [ATTR_CODE_FUNCTION_NAME]?: string;\n [ATTR_RENOVATE_DATASOURCE]?: string;\n [ATTR_RENOVATE_REGISTRY_URL]?: string;\n [ATTR_RENOVATE_PACKAGE_NAME]?: string;\n} & Attributes;\n\n/**\n * The instrumentation parameters.\n */\nexport interface SpanParameters {\n /**\n * The name of the span\n */\n name: string;\n\n /**\n * Attributes which should be added to the span\n */\n attributes?: RenovateSpanAttributes | undefined;\n\n /**\n * Should this span be added to the root span or to the current active span\n */\n ignoreParentSpan?: boolean;\n\n /**\n * Type of span this represents. Default: SpanKind.Internal\n */\n kind?: SpanKind;\n}\n\nexport interface Report {\n problems: BunyanRecord[];\n repositories: Record<string, RepoReport>;\n}\n\ninterface RepoReport {\n problems: BunyanRecord[];\n branches: Partial<BranchCache>[];\n packageFiles: Record<string, PackageFile[]>;\n libYearsWithStatus?: LibYearsWithStatus;\n}\n\nexport interface LibYearsWithStatus {\n libYears: LibYears;\n dependencyStatus: DependencyStatus;\n}\n\nexport interface LibYears {\n total: number;\n managers: Record<string, number>;\n}\n\nexport interface DependencyStatus {\n outdated: number;\n total: number;\n}\n\nexport const ATTR_RENOVATE_SPLIT = 'renovate.split';\n\n/**\n * The name of a Renovate datasource (ex: `github-tags`, `npm`, `docker`, etc).\n */\nexport const ATTR_RENOVATE_DATASOURCE = 'renovate.datasource';\n\n/**\n * The registry URL of a registry URL as might be used with a datasource and package name.\n */\nexport const ATTR_RENOVATE_REGISTRY_URL = 'renovate.registryUrl';\n\n/**\n * The package name of a package.\n */\nexport const ATTR_RENOVATE_PACKAGE_NAME = 'renovate.packageName';\n\n/**\n * the Git Version Control System (VCS)'s Operation Type\n *\n * @see GitOperationType\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/vcs/\n *\n */\nexport const ATTR_VCS_GIT_OPERATION_TYPE = 'vcs.git.operation.type';\n\n/**\n * the Git Version Control System (VCS)'s subcommand\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/vcs/\n * */\nexport const ATTR_VCS_GIT_SUBCOMMAND = 'vcs.git.subcommand';\n"],"mappings":";AAyEA,MAAa,sBAAsB;;;;AAKnC,MAAa,2BAA2B;;;;AAKxC,MAAa,6BAA6B;;;;AAK1C,MAAa,6BAA6B;;;;;;;;AAS1C,MAAa,8BAA8B;;;;;;AAO3C,MAAa,0BAA0B"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../lib/instrumentation/types.ts"],"sourcesContent":["import type { Attributes, SpanKind, SpanOptions } from '@opentelemetry/api';\nimport type { ATTR_CODE_FUNCTION_NAME } from '@opentelemetry/semantic-conventions';\nimport type { RenovateSplit } from '../config/types.ts';\nimport type { PlatformId } from '../constants/index.ts';\nimport type { BunyanRecord } from '../logger/types.ts';\nimport type { PackageFile } from '../modules/manager/types.ts';\nimport type { BranchCache } from '../util/cache/repository/types.ts';\nimport type { GitOperationType } from '../util/git/types.ts';\nimport type { ProcessStatus } from '../workers/repository/result.ts';\n\nexport type RenovateSpanOptions = {\n attributes?: RenovateSpanAttributes;\n} & SpanOptions;\n\nexport type RenovateSpanAttributes = {\n [ATTR_RENOVATE_SPLIT]?: RenovateSplit;\n [ATTR_VCS_GIT_OPERATION_TYPE]?: GitOperationType;\n [ATTR_CODE_FUNCTION_NAME]?: string;\n [ATTR_RENOVATE_DATASOURCE]?: string;\n [ATTR_RENOVATE_REGISTRY_URL]?: string;\n [ATTR_RENOVATE_PACKAGE_NAME]?: string;\n} & Attributes;\n\n/**\n * The instrumentation parameters.\n */\nexport interface SpanParameters {\n /**\n * The name of the span\n */\n name: string;\n\n /**\n * Attributes which should be added to the span\n */\n attributes?: RenovateSpanAttributes | undefined;\n\n /**\n * Should this span be added to the root span or to the current active span\n */\n ignoreParentSpan?: boolean;\n\n /**\n * Type of span this represents. Default: SpanKind.Internal\n */\n kind?: SpanKind;\n}\n\nexport interface Report {\n problems: BunyanRecord[];\n repositories: Record<string, RepoReport>;\n}\n\ninterface RepoReport {\n problems: BunyanRecord[];\n branches: Partial<BranchCache>[];\n packageFiles: Record<string, PackageFile[]>;\n libYearsWithStatus?: LibYearsWithStatus;\n /**\n * The platform type of the repository (ex: `github`, `gitlab`).\n */\n platform?: PlatformId;\n /**\n * The default branch name of the repository.\n */\n defaultBranch?: string;\n /**\n * The issue number of the Dependency Dashboard, or `null` if none exists.\n */\n dependencyDashboardIssue?: number | null;\n /**\n * Path to the repository's Renovate config file (ex: `.github/renovate.json5`).\n * Omitted when the repository has no in-repo config file.\n */\n configFileName?: string;\n /**\n * The repository's processing status (ex: `onboarding`, `onboarded`, `activated`).\n */\n status?: ProcessStatus;\n /**\n * The number of the open (unmerged) onboarding PR, or `null` if none exists.\n */\n onboardingPrNumber?: number | null;\n}\n\nexport interface LibYearsWithStatus {\n libYears: LibYears;\n dependencyStatus: DependencyStatus;\n}\n\nexport interface LibYears {\n total: number;\n managers: Record<string, number>;\n}\n\nexport interface DependencyStatus {\n outdated: number;\n total: number;\n}\n\nexport const ATTR_RENOVATE_SPLIT = 'renovate.split';\n\n/**\n * The name of a Renovate datasource (ex: `github-tags`, `npm`, `docker`, etc).\n */\nexport const ATTR_RENOVATE_DATASOURCE = 'renovate.datasource';\n\n/**\n * The registry URL of a registry URL as might be used with a datasource and package name.\n */\nexport const ATTR_RENOVATE_REGISTRY_URL = 'renovate.registryUrl';\n\n/**\n * The package name of a package.\n */\nexport const ATTR_RENOVATE_PACKAGE_NAME = 'renovate.packageName';\n\n/**\n * the Git Version Control System (VCS)'s Operation Type\n *\n * @see GitOperationType\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/vcs/\n *\n */\nexport const ATTR_VCS_GIT_OPERATION_TYPE = 'vcs.git.operation.type';\n\n/**\n * the Git Version Control System (VCS)'s subcommand\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/vcs/\n * */\nexport const ATTR_VCS_GIT_SUBCOMMAND = 'vcs.git.subcommand';\n"],"mappings":";AAoGA,MAAa,sBAAsB;;;;AAKnC,MAAa,2BAA2B;;;;AAKxC,MAAa,6BAA6B;;;;AAK1C,MAAa,6BAA6B;;;;;;;;AAS1C,MAAa,8BAA8B;;;;;;AAO3C,MAAa,0BAA0B"}
@@ -1,6 +1,6 @@
1
1
  import { RangeStrategy } from "../../types/versioning.js";
2
2
  import { MaybePromise } from "../../types/index.js";
3
- import { ExtractConfig, GlobalManagerConfig, ManagerApi, PackageFile, PackageFileContent, RangeConfig } from "./types.js";
3
+ import { ExtractConfig, GlobalManagerConfig, ManagerApi, PackageFile, PackageFileContent, RangeConfig, UpdateArtifactsConfig } from "./types.js";
4
4
  import { hashMap } from "./fingerprint.generated.js";
5
5
  //#region lib/modules/manager/index.d.ts
6
6
  export declare function getManagerList(): string[];
@@ -11,6 +11,10 @@ export declare function detectAllGlobalConfig(): Promise<GlobalManagerConfig>;
11
11
  export declare function extractAllPackageFiles(manager: string, config: ExtractConfig, files: string[]): Promise<PackageFile[] | null>;
12
12
  export declare function extractPackageFile(manager: string, content: string, fileName: string, config: ExtractConfig): MaybePromise<PackageFileContent | null>;
13
13
  export declare function getRangeStrategy(config: RangeConfig): RangeStrategy | null;
14
+ /**
15
+ * Whether the package manager of `manager` enforces the minimum release age itself when regenerating the lock file.
16
+ */
17
+ export declare function enforcesMinimumReleaseAge(manager: string, config: UpdateArtifactsConfig): Promise<boolean>;
14
18
  export declare function getPrettyDepType(manager: string, depType: string): string | undefined;
15
19
  export declare function isKnownManager(mgr: string): boolean;
16
20
  /**
@@ -57,6 +57,14 @@ function getRangeStrategy(config) {
57
57
  if (rangeStrategy === "in-range-only") return "update-lockfile";
58
58
  return config.rangeStrategy;
59
59
  }
60
+ /**
61
+ * Whether the package manager of `manager` enforces the minimum release age itself when regenerating the lock file.
62
+ */
63
+ async function enforcesMinimumReleaseAge(manager, config) {
64
+ const enforces = get(manager, "enforcesMinimumReleaseAge");
65
+ if (!enforces) return false;
66
+ return await enforces(config);
67
+ }
60
68
  function getPrettyDepType(manager, depType) {
61
69
  return (api$1.get(manager) ?? api.get(manager))?.knownDepTypes?.find((meta) => meta.depType === depType)?.prettyDepType;
62
70
  }
@@ -75,6 +83,6 @@ function getEnabledManagersList(enabledManagers) {
75
83
  return allManagersList;
76
84
  }
77
85
  //#endregion
78
- export { allManagersList, detectAllGlobalConfig, extractAllPackageFiles, extractPackageFile, get, getEnabledManagersList, getManagerList, getManagers, getPrettyDepType, getRangeStrategy, hashMap, isKnownManager };
86
+ export { allManagersList, detectAllGlobalConfig, enforcesMinimumReleaseAge, extractAllPackageFiles, extractPackageFile, get, getEnabledManagersList, getManagerList, getManagers, getPrettyDepType, getRangeStrategy, hashMap, isKnownManager };
79
87
 
80
88
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["managers","customManagers"],"sources":["../../../lib/modules/manager/index.ts"],"sourcesContent":["import type { MaybePromise, RangeStrategy } from '../../types/index.ts';\nimport managers from './api.ts';\nimport customManagers from './custom/api.ts';\nimport { customManagerList, isCustomManager } from './custom/index.ts';\nimport type {\n ExtractConfig,\n GlobalManagerConfig,\n ManagerApi,\n PackageFile,\n PackageFileContent,\n RangeConfig,\n} from './types.ts';\n\nexport { hashMap } from './fingerprint.generated.ts';\n\nconst managerList = Array.from(managers.keys()); // does not include custom managers\nexport function getManagerList(): string[] {\n return managerList;\n}\nexport function getManagers(): Map<string, ManagerApi> {\n return managers;\n}\nexport const allManagersList = [...managerList, ...customManagerList];\n\nexport function get<T extends keyof ManagerApi>(\n manager: string,\n name: T,\n): ManagerApi[T] | undefined {\n return isCustomManager(manager)\n ? customManagers.get(manager)?.[name]\n : managers.get(manager)?.[name];\n}\n\nexport async function detectAllGlobalConfig(): Promise<GlobalManagerConfig> {\n let config: GlobalManagerConfig = {};\n for (const managerName of allManagersList) {\n const manager =\n managers.get(managerName)! ?? customManagers.get(managerName)!;\n if (manager.detectGlobalConfig) {\n // This should use mergeChildConfig once more than one manager is supported, but introduces a cyclic dependency\n config = { ...config, ...(await manager.detectGlobalConfig()) };\n }\n }\n return config;\n}\n\nexport async function extractAllPackageFiles(\n manager: string,\n config: ExtractConfig,\n files: string[],\n): Promise<PackageFile[] | null> {\n if (!managers.has(manager)) {\n return null;\n }\n const m = managers.get(manager)!;\n if (m.extractAllPackageFiles) {\n const res = await m.extractAllPackageFiles(config, files);\n // istanbul ignore if\n if (!res) {\n return null;\n }\n return res;\n }\n return null;\n}\n\nexport function extractPackageFile(\n manager: string,\n content: string,\n fileName: string,\n config: ExtractConfig,\n): MaybePromise<PackageFileContent | null> {\n const m = managers.get(manager)! ?? customManagers.get(manager)!;\n if (!m) {\n return null;\n }\n\n return m.extractPackageFile\n ? m.extractPackageFile(content, fileName, config)\n : null;\n}\n\nexport function getRangeStrategy(config: RangeConfig): RangeStrategy | null {\n const { manager, rangeStrategy } = config;\n if (!manager || !managers.has(manager)) {\n return null;\n }\n const m = managers.get(manager)!;\n if (m.getRangeStrategy) {\n // Use manager's own function if it exists\n const managerRangeStrategy = m.getRangeStrategy(config);\n if (managerRangeStrategy === 'in-range-only') {\n return 'update-lockfile';\n }\n return managerRangeStrategy;\n }\n if (rangeStrategy === 'auto') {\n if (m.updateLockedDependency) {\n return 'update-lockfile';\n }\n // default to 'replace' for auto\n return 'replace';\n }\n if (rangeStrategy === 'in-range-only') {\n return 'update-lockfile';\n }\n\n return config.rangeStrategy!;\n}\n\nexport function getPrettyDepType(\n manager: string,\n depType: string,\n): string | undefined {\n const m = managers.get(manager) ?? customManagers.get(manager);\n return m?.knownDepTypes?.find((meta) => meta.depType === depType)\n ?.prettyDepType;\n}\n\nexport function isKnownManager(mgr: string): boolean {\n return allManagersList.includes(mgr.replace('custom.', ''));\n}\n\n/**\n * Filter a list of managers based on enabled managers.\n *\n * If enabledManagers is provided, this function returns a subset of allManagersList\n * that matches the enabled manager names, including custom managers. If enabledManagers\n * is not provided or is an empty array, it returns the full list of managers.\n */\nexport function getEnabledManagersList(enabledManagers?: string[]): string[] {\n if (enabledManagers?.length) {\n return allManagersList.filter(\n (manager) =>\n enabledManagers.includes(manager) ||\n enabledManagers.includes(`custom.${manager}`),\n );\n }\n\n return allManagersList;\n}\n"],"mappings":";;;;;AAeA,MAAM,cAAc,MAAM,KAAKA,MAAS,KAAK,CAAC;AAC9C,SAAgB,iBAA2B;CACzC,OAAO;AACT;AACA,SAAgB,cAAuC;CACrD,OAAOA;AACT;AACA,MAAa,kBAAkB,CAAC,GAAG,aAAa,GAAG,iBAAiB;AAEpE,SAAgB,IACd,SACA,MAC2B;CAC3B,OAAO,gBAAgB,OAAO,IAC1BC,IAAe,IAAI,OAAO,CAAC,GAAG,QAC9BD,MAAS,IAAI,OAAO,CAAC,GAAG;AAC9B;AAEA,eAAsB,wBAAsD;CAC1E,IAAI,SAA8B,CAAC;CACnC,KAAK,MAAM,eAAe,iBAAiB;EACzC,MAAM,UACJA,MAAS,IAAI,WAAW,KAAMC,IAAe,IAAI,WAAW;EAC9D,IAAI,QAAQ,oBAEV,SAAS;GAAE,GAAG;GAAQ,GAAI,MAAM,QAAQ,mBAAmB;EAAG;CAElE;CACA,OAAO;AACT;AAEA,eAAsB,uBACpB,SACA,QACA,OAC+B;CAC/B,IAAI,CAACD,MAAS,IAAI,OAAO,GACvB,OAAO;CAET,MAAM,IAAIA,MAAS,IAAI,OAAO;CAC9B,IAAI,EAAE,wBAAwB;EAC5B,MAAM,MAAM,MAAM,EAAE,uBAAuB,QAAQ,KAAK;;EAExD,IAAI,CAAC,KACH,OAAO;EAET,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,SACA,UACA,QACyC;CACzC,MAAM,IAAIA,MAAS,IAAI,OAAO,KAAMC,IAAe,IAAI,OAAO;CAC9D,IAAI,CAAC,GACH,OAAO;CAGT,OAAO,EAAE,qBACL,EAAE,mBAAmB,SAAS,UAAU,MAAM,IAC9C;AACN;AAEA,SAAgB,iBAAiB,QAA2C;CAC1E,MAAM,EAAE,SAAS,kBAAkB;CACnC,IAAI,CAAC,WAAW,CAACD,MAAS,IAAI,OAAO,GACnC,OAAO;CAET,MAAM,IAAIA,MAAS,IAAI,OAAO;CAC9B,IAAI,EAAE,kBAAkB;EAEtB,MAAM,uBAAuB,EAAE,iBAAiB,MAAM;EACtD,IAAI,yBAAyB,iBAC3B,OAAO;EAET,OAAO;CACT;CACA,IAAI,kBAAkB,QAAQ;EAC5B,IAAI,EAAE,wBACJ,OAAO;EAGT,OAAO;CACT;CACA,IAAI,kBAAkB,iBACpB,OAAO;CAGT,OAAO,OAAO;AAChB;AAEA,SAAgB,iBACd,SACA,SACoB;CAEpB,QADUA,MAAS,IAAI,OAAO,KAAKC,IAAe,IAAI,OAAO,EAAA,EACnD,eAAe,MAAM,SAAS,KAAK,YAAY,OAAO,CAAC,EAC7D;AACN;AAEA,SAAgB,eAAe,KAAsB;CACnD,OAAO,gBAAgB,SAAS,IAAI,QAAQ,WAAW,EAAE,CAAC;AAC5D;;;;;;;;AASA,SAAgB,uBAAuB,iBAAsC;CAC3E,IAAI,iBAAiB,QACnB,OAAO,gBAAgB,QACpB,YACC,gBAAgB,SAAS,OAAO,KAChC,gBAAgB,SAAS,UAAU,SAAS,CAChD;CAGF,OAAO;AACT"}
1
+ {"version":3,"file":"index.js","names":["managers","customManagers"],"sources":["../../../lib/modules/manager/index.ts"],"sourcesContent":["import type { MaybePromise, RangeStrategy } from '../../types/index.ts';\nimport managers from './api.ts';\nimport customManagers from './custom/api.ts';\nimport { customManagerList, isCustomManager } from './custom/index.ts';\nimport type {\n ExtractConfig,\n GlobalManagerConfig,\n ManagerApi,\n PackageFile,\n PackageFileContent,\n RangeConfig,\n UpdateArtifactsConfig,\n} from './types.ts';\n\nexport { hashMap } from './fingerprint.generated.ts';\n\nconst managerList = Array.from(managers.keys()); // does not include custom managers\nexport function getManagerList(): string[] {\n return managerList;\n}\nexport function getManagers(): Map<string, ManagerApi> {\n return managers;\n}\nexport const allManagersList = [...managerList, ...customManagerList];\n\nexport function get<T extends keyof ManagerApi>(\n manager: string,\n name: T,\n): ManagerApi[T] | undefined {\n return isCustomManager(manager)\n ? customManagers.get(manager)?.[name]\n : managers.get(manager)?.[name];\n}\n\nexport async function detectAllGlobalConfig(): Promise<GlobalManagerConfig> {\n let config: GlobalManagerConfig = {};\n for (const managerName of allManagersList) {\n const manager =\n managers.get(managerName)! ?? customManagers.get(managerName)!;\n if (manager.detectGlobalConfig) {\n // This should use mergeChildConfig once more than one manager is supported, but introduces a cyclic dependency\n config = { ...config, ...(await manager.detectGlobalConfig()) };\n }\n }\n return config;\n}\n\nexport async function extractAllPackageFiles(\n manager: string,\n config: ExtractConfig,\n files: string[],\n): Promise<PackageFile[] | null> {\n if (!managers.has(manager)) {\n return null;\n }\n const m = managers.get(manager)!;\n if (m.extractAllPackageFiles) {\n const res = await m.extractAllPackageFiles(config, files);\n // istanbul ignore if\n if (!res) {\n return null;\n }\n return res;\n }\n return null;\n}\n\nexport function extractPackageFile(\n manager: string,\n content: string,\n fileName: string,\n config: ExtractConfig,\n): MaybePromise<PackageFileContent | null> {\n const m = managers.get(manager)! ?? customManagers.get(manager)!;\n if (!m) {\n return null;\n }\n\n return m.extractPackageFile\n ? m.extractPackageFile(content, fileName, config)\n : null;\n}\n\nexport function getRangeStrategy(config: RangeConfig): RangeStrategy | null {\n const { manager, rangeStrategy } = config;\n if (!manager || !managers.has(manager)) {\n return null;\n }\n const m = managers.get(manager)!;\n if (m.getRangeStrategy) {\n // Use manager's own function if it exists\n const managerRangeStrategy = m.getRangeStrategy(config);\n if (managerRangeStrategy === 'in-range-only') {\n return 'update-lockfile';\n }\n return managerRangeStrategy;\n }\n if (rangeStrategy === 'auto') {\n if (m.updateLockedDependency) {\n return 'update-lockfile';\n }\n // default to 'replace' for auto\n return 'replace';\n }\n if (rangeStrategy === 'in-range-only') {\n return 'update-lockfile';\n }\n\n return config.rangeStrategy!;\n}\n\n/**\n * Whether the package manager of `manager` enforces the minimum release age itself when regenerating the lock file.\n */\nexport async function enforcesMinimumReleaseAge(\n manager: string,\n config: UpdateArtifactsConfig,\n): Promise<boolean> {\n const enforces = get(manager, 'enforcesMinimumReleaseAge');\n if (!enforces) {\n return false;\n }\n return await enforces(config);\n}\n\nexport function getPrettyDepType(\n manager: string,\n depType: string,\n): string | undefined {\n const m = managers.get(manager) ?? customManagers.get(manager);\n return m?.knownDepTypes?.find((meta) => meta.depType === depType)\n ?.prettyDepType;\n}\n\nexport function isKnownManager(mgr: string): boolean {\n return allManagersList.includes(mgr.replace('custom.', ''));\n}\n\n/**\n * Filter a list of managers based on enabled managers.\n *\n * If enabledManagers is provided, this function returns a subset of allManagersList\n * that matches the enabled manager names, including custom managers. If enabledManagers\n * is not provided or is an empty array, it returns the full list of managers.\n */\nexport function getEnabledManagersList(enabledManagers?: string[]): string[] {\n if (enabledManagers?.length) {\n return allManagersList.filter(\n (manager) =>\n enabledManagers.includes(manager) ||\n enabledManagers.includes(`custom.${manager}`),\n );\n }\n\n return allManagersList;\n}\n"],"mappings":";;;;;AAgBA,MAAM,cAAc,MAAM,KAAKA,MAAS,KAAK,CAAC;AAC9C,SAAgB,iBAA2B;CACzC,OAAO;AACT;AACA,SAAgB,cAAuC;CACrD,OAAOA;AACT;AACA,MAAa,kBAAkB,CAAC,GAAG,aAAa,GAAG,iBAAiB;AAEpE,SAAgB,IACd,SACA,MAC2B;CAC3B,OAAO,gBAAgB,OAAO,IAC1BC,IAAe,IAAI,OAAO,CAAC,GAAG,QAC9BD,MAAS,IAAI,OAAO,CAAC,GAAG;AAC9B;AAEA,eAAsB,wBAAsD;CAC1E,IAAI,SAA8B,CAAC;CACnC,KAAK,MAAM,eAAe,iBAAiB;EACzC,MAAM,UACJA,MAAS,IAAI,WAAW,KAAMC,IAAe,IAAI,WAAW;EAC9D,IAAI,QAAQ,oBAEV,SAAS;GAAE,GAAG;GAAQ,GAAI,MAAM,QAAQ,mBAAmB;EAAG;CAElE;CACA,OAAO;AACT;AAEA,eAAsB,uBACpB,SACA,QACA,OAC+B;CAC/B,IAAI,CAACD,MAAS,IAAI,OAAO,GACvB,OAAO;CAET,MAAM,IAAIA,MAAS,IAAI,OAAO;CAC9B,IAAI,EAAE,wBAAwB;EAC5B,MAAM,MAAM,MAAM,EAAE,uBAAuB,QAAQ,KAAK;;EAExD,IAAI,CAAC,KACH,OAAO;EAET,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,SACA,UACA,QACyC;CACzC,MAAM,IAAIA,MAAS,IAAI,OAAO,KAAMC,IAAe,IAAI,OAAO;CAC9D,IAAI,CAAC,GACH,OAAO;CAGT,OAAO,EAAE,qBACL,EAAE,mBAAmB,SAAS,UAAU,MAAM,IAC9C;AACN;AAEA,SAAgB,iBAAiB,QAA2C;CAC1E,MAAM,EAAE,SAAS,kBAAkB;CACnC,IAAI,CAAC,WAAW,CAACD,MAAS,IAAI,OAAO,GACnC,OAAO;CAET,MAAM,IAAIA,MAAS,IAAI,OAAO;CAC9B,IAAI,EAAE,kBAAkB;EAEtB,MAAM,uBAAuB,EAAE,iBAAiB,MAAM;EACtD,IAAI,yBAAyB,iBAC3B,OAAO;EAET,OAAO;CACT;CACA,IAAI,kBAAkB,QAAQ;EAC5B,IAAI,EAAE,wBACJ,OAAO;EAGT,OAAO;CACT;CACA,IAAI,kBAAkB,iBACpB,OAAO;CAGT,OAAO,OAAO;AAChB;;;;AAKA,eAAsB,0BACpB,SACA,QACkB;CAClB,MAAM,WAAW,IAAI,SAAS,2BAA2B;CACzD,IAAI,CAAC,UACH,OAAO;CAET,OAAO,MAAM,SAAS,MAAM;AAC9B;AAEA,SAAgB,iBACd,SACA,SACoB;CAEpB,QADUA,MAAS,IAAI,OAAO,KAAKC,IAAe,IAAI,OAAO,EAAA,EACnD,eAAe,MAAM,SAAS,KAAK,YAAY,OAAO,CAAC,EAC7D;AACN;AAEA,SAAgB,eAAe,KAAsB;CACnD,OAAO,gBAAgB,SAAS,IAAI,QAAQ,WAAW,EAAE,CAAC;AAC5D;;;;;;;;AASA,SAAgB,uBAAuB,iBAAsC;CAC3E,IAAI,iBAAiB,QACnB,OAAO,gBAAgB,QACpB,YACC,gBAAgB,SAAS,OAAO,KAChC,gBAAgB,SAAS,UAAU,SAAS,CAChD;CAGF,OAAO;AACT"}
@@ -34,6 +34,7 @@ var mise_exports = /* @__PURE__ */ __exportAll({
34
34
  lockFileMaintenanceIsDelegatedToPackageManager: () => true,
35
35
  lockFileNames: () => lockFileNames,
36
36
  maybeSupportedBackendDatasources: () => maybeSupportedBackendDatasources,
37
+ minimumReleaseAgeSupport: () => minimumReleaseAgeSupport,
37
38
  supportedBackendDatasources: () => supportedBackendDatasources,
38
39
  supportedDatasources: () => supportedDatasources,
39
40
  supportsDynamicDepTypesNote: () => supportsDynamicDepTypesNote,
@@ -45,6 +46,7 @@ var mise_exports = /* @__PURE__ */ __exportAll({
45
46
  const displayName = "mise-en-place";
46
47
  const lockFileNames = ["mise.lock"];
47
48
  const url = "https://mise.jdx.dev";
49
+ const minimumReleaseAgeSupport = { mise: { note: "mise has its own `minimum_release_age` setting, which Renovate does not read yet." } };
48
50
  const defaultConfig = {
49
51
  managerFilePatterns: [
50
52
  "**/{,.}mise{,.*}.toml",
@@ -112,6 +114,6 @@ const supportedBackendDatasources = new Set(Object.keys(backendDatasources).filt
112
114
  const maybeSupportedBackendDatasources = new Set(Object.keys(backendDatasources).filter((key) => key === "vfox" || key === "aqua"));
113
115
  const supportedDatasources = deduplicateArray([...Object.values(backendDatasources).flat(), ...remoteReferenceDatasources]).sort();
114
116
  //#endregion
115
- export { defaultConfig, displayName, extractPackageFile, knownDepTypes, lockFileNames, maybeSupportedBackendDatasources, mise_exports, supportedBackendDatasources, supportedDatasources, supportsDynamicDepTypesNote, updateArtifacts, updateLockedDependency, url };
117
+ export { defaultConfig, displayName, extractPackageFile, knownDepTypes, lockFileNames, maybeSupportedBackendDatasources, minimumReleaseAgeSupport, mise_exports, supportedBackendDatasources, supportedDatasources, supportsDynamicDepTypesNote, updateArtifacts, updateLockedDependency, url };
116
118
 
117
119
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["asdfSupportedDatasources"],"sources":["../../../../lib/modules/manager/mise/index.ts"],"sourcesContent":["import { deduplicateArray } from '../../../util/array.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { CondaDatasource } from '../../datasource/conda/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubDigestDatasource } from '../../datasource/github-digest/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabReleasesDatasource } from '../../datasource/gitlab-releases/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { GoDatasource } from '../../datasource/go/index.ts';\nimport { JavaVersionDatasource } from '../../datasource/java-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { NugetDatasource } from '../../datasource/nuget/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { RubygemsDatasource } from '../../datasource/rubygems/index.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport { supportedDatasources as asdfSupportedDatasources } from '../asdf/index.ts';\n\nexport { updateArtifacts } from './artifacts.ts';\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\nexport { extractPackageFile } from './extract.ts';\nexport { updateLockedDependency } from './update-locked.ts';\n\nexport const displayName = 'mise-en-place';\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['mise.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager = true;\nexport const url = 'https://mise.jdx.dev';\n\nexport const defaultConfig = {\n managerFilePatterns: [\n '**/{,.}mise{,.*}.toml',\n '**/{,.}mise/config{,.*}.toml',\n '**/.config/mise{,.*}.toml',\n '**/.config/mise/{mise,config}{,.*}.toml',\n '**/.config/mise/conf.d/*.toml',\n '**/.rtx{,.*}.toml',\n ],\n pinDigests: false,\n};\n\nconst backendDatasources = {\n core: [\n GithubReleasesDatasource.id,\n GithubTagsDatasource.id,\n JavaVersionDatasource.id,\n NodeVersionDatasource.id,\n RubyVersionDatasource.id,\n RustVersionDatasource.id,\n ],\n // Re-use the asdf datasources, as mise and asdf support the same plugins.\n asdf: asdfSupportedDatasources,\n aqua: [GithubTagsDatasource.id],\n cargo: [CrateDatasource.id, GitTagsDatasource.id, GitRefsDatasource.id],\n conda: [CondaDatasource.id],\n dotnet: [NugetDatasource.id],\n gem: [RubygemsDatasource.id],\n github: [GithubReleasesDatasource.id],\n gitlab: [GitlabReleasesDatasource.id],\n go: [GoDatasource.id],\n npm: [NpmDatasource.id],\n pipx: [PypiDatasource.id, GithubTagsDatasource.id, GitRefsDatasource.id],\n pypi: [PypiDatasource.id, GithubTagsDatasource.id, GitRefsDatasource.id],\n spm: [GithubReleasesDatasource.id],\n ubi: [GithubReleasesDatasource.id],\n // not supported\n vfox: [],\n};\n\n// datasources of remote `include` entries and git task files\nconst remoteReferenceDatasources = [\n BitbucketTagsDatasource.id,\n DockerDatasource.id,\n GitRefsDatasource.id,\n GitTagsDatasource.id,\n GithubDigestDatasource.id,\n GithubTagsDatasource.id,\n GitlabTagsDatasource.id,\n];\n\n/**\n * Backends that are definitely supported out-of-the-box with Renovate.\n */\nexport const supportedBackendDatasources = new Set(\n Object.keys(backendDatasources).filter((key) => key !== 'vfox'),\n);\n\n/**\n * Backends that may require some additional work for users to configure Renovate to update them.\n */\nexport const maybeSupportedBackendDatasources = new Set<string>(\n Object.keys(backendDatasources).filter(\n (key) => key === 'vfox' || key === 'aqua',\n ),\n);\n\nexport const supportedDatasources = deduplicateArray([\n ...Object.values(backendDatasources).flat(),\n ...remoteReferenceDatasources,\n]).sort();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAa,cAAc;AAE3B,MAAa,gBAAgB,CAAC,WAAW;AAEzC,MAAa,MAAM;AAEnB,MAAa,gBAAgB;CAC3B,qBAAqB;EACnB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,YAAY;AACd;AAEA,MAAM,qBAAqB;CACzB,MAAM;EACJ,yBAAyB;EACzB,qBAAqB;EACrB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;CACxB;CAEA,MAAMA;CACN,MAAM,CAAC,qBAAqB,EAAE;CAC9B,OAAO;EAAC,gBAAgB;EAAI,kBAAkB;EAAI,kBAAkB;CAAE;CACtE,OAAO,CAAC,gBAAgB,EAAE;CAC1B,QAAQ,CAAC,gBAAgB,EAAE;CAC3B,KAAK,CAAC,mBAAmB,EAAE;CAC3B,QAAQ,CAAC,yBAAyB,EAAE;CACpC,QAAQ,CAAC,yBAAyB,EAAE;CACpC,IAAI,CAAC,aAAa,EAAE;CACpB,KAAK,CAAC,cAAc,EAAE;CACtB,MAAM;EAAC,eAAe;EAAI,qBAAqB;EAAI,kBAAkB;CAAE;CACvE,MAAM;EAAC,eAAe;EAAI,qBAAqB;EAAI,kBAAkB;CAAE;CACvE,KAAK,CAAC,yBAAyB,EAAE;CACjC,KAAK,CAAC,yBAAyB,EAAE;CAEjC,MAAM,CAAC;AACT;AAGA,MAAM,6BAA6B;CACjC,wBAAwB;CACxB,iBAAiB;CACjB,kBAAkB;CAClB,kBAAkB;CAClB,uBAAuB;CACvB,qBAAqB;CACrB,qBAAqB;AACvB;;;;AAKA,MAAa,8BAA8B,IAAI,IAC7C,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAAQ,QAAQ,QAAQ,MAAM,CAChE;;;;AAKA,MAAa,mCAAmC,IAAI,IAClD,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAC7B,QAAQ,QAAQ,UAAU,QAAQ,MACrC,CACF;AAEA,MAAa,uBAAuB,iBAAiB,CACnD,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,KAAK,GAC1C,GAAG,0BACL,CAAC,CAAC,CAAC,KAAK"}
1
+ {"version":3,"file":"index.js","names":["asdfSupportedDatasources"],"sources":["../../../../lib/modules/manager/mise/index.ts"],"sourcesContent":["import { deduplicateArray } from '../../../util/array.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { CondaDatasource } from '../../datasource/conda/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubDigestDatasource } from '../../datasource/github-digest/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabReleasesDatasource } from '../../datasource/gitlab-releases/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { GoDatasource } from '../../datasource/go/index.ts';\nimport { JavaVersionDatasource } from '../../datasource/java-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { NugetDatasource } from '../../datasource/nuget/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { RubygemsDatasource } from '../../datasource/rubygems/index.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport { supportedDatasources as asdfSupportedDatasources } from '../asdf/index.ts';\nimport type { MinimumReleaseAgeSupport } from '../types.ts';\n\nexport { updateArtifacts } from './artifacts.ts';\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\nexport { extractPackageFile } from './extract.ts';\nexport { updateLockedDependency } from './update-locked.ts';\n\nexport const displayName = 'mise-en-place';\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['mise.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager = true;\nexport const url = 'https://mise.jdx.dev';\n\nexport const minimumReleaseAgeSupport: MinimumReleaseAgeSupport = {\n mise: {\n note: 'mise has its own `minimum_release_age` setting, which Renovate does not read yet.',\n },\n};\n\nexport const defaultConfig = {\n managerFilePatterns: [\n '**/{,.}mise{,.*}.toml',\n '**/{,.}mise/config{,.*}.toml',\n '**/.config/mise{,.*}.toml',\n '**/.config/mise/{mise,config}{,.*}.toml',\n '**/.config/mise/conf.d/*.toml',\n '**/.rtx{,.*}.toml',\n ],\n pinDigests: false,\n};\n\nconst backendDatasources = {\n core: [\n GithubReleasesDatasource.id,\n GithubTagsDatasource.id,\n JavaVersionDatasource.id,\n NodeVersionDatasource.id,\n RubyVersionDatasource.id,\n RustVersionDatasource.id,\n ],\n // Re-use the asdf datasources, as mise and asdf support the same plugins.\n asdf: asdfSupportedDatasources,\n aqua: [GithubTagsDatasource.id],\n cargo: [CrateDatasource.id, GitTagsDatasource.id, GitRefsDatasource.id],\n conda: [CondaDatasource.id],\n dotnet: [NugetDatasource.id],\n gem: [RubygemsDatasource.id],\n github: [GithubReleasesDatasource.id],\n gitlab: [GitlabReleasesDatasource.id],\n go: [GoDatasource.id],\n npm: [NpmDatasource.id],\n pipx: [PypiDatasource.id, GithubTagsDatasource.id, GitRefsDatasource.id],\n pypi: [PypiDatasource.id, GithubTagsDatasource.id, GitRefsDatasource.id],\n spm: [GithubReleasesDatasource.id],\n ubi: [GithubReleasesDatasource.id],\n // not supported\n vfox: [],\n};\n\n// datasources of remote `include` entries and git task files\nconst remoteReferenceDatasources = [\n BitbucketTagsDatasource.id,\n DockerDatasource.id,\n GitRefsDatasource.id,\n GitTagsDatasource.id,\n GithubDigestDatasource.id,\n GithubTagsDatasource.id,\n GitlabTagsDatasource.id,\n];\n\n/**\n * Backends that are definitely supported out-of-the-box with Renovate.\n */\nexport const supportedBackendDatasources = new Set(\n Object.keys(backendDatasources).filter((key) => key !== 'vfox'),\n);\n\n/**\n * Backends that may require some additional work for users to configure Renovate to update them.\n */\nexport const maybeSupportedBackendDatasources = new Set<string>(\n Object.keys(backendDatasources).filter(\n (key) => key === 'vfox' || key === 'aqua',\n ),\n);\n\nexport const supportedDatasources = deduplicateArray([\n ...Object.values(backendDatasources).flat(),\n ...remoteReferenceDatasources,\n]).sort();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAa,cAAc;AAE3B,MAAa,gBAAgB,CAAC,WAAW;AAEzC,MAAa,MAAM;AAEnB,MAAa,2BAAqD,EAChE,MAAM,EACJ,MAAM,oFACR,EACF;AAEA,MAAa,gBAAgB;CAC3B,qBAAqB;EACnB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,YAAY;AACd;AAEA,MAAM,qBAAqB;CACzB,MAAM;EACJ,yBAAyB;EACzB,qBAAqB;EACrB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;CACxB;CAEA,MAAMA;CACN,MAAM,CAAC,qBAAqB,EAAE;CAC9B,OAAO;EAAC,gBAAgB;EAAI,kBAAkB;EAAI,kBAAkB;CAAE;CACtE,OAAO,CAAC,gBAAgB,EAAE;CAC1B,QAAQ,CAAC,gBAAgB,EAAE;CAC3B,KAAK,CAAC,mBAAmB,EAAE;CAC3B,QAAQ,CAAC,yBAAyB,EAAE;CACpC,QAAQ,CAAC,yBAAyB,EAAE;CACpC,IAAI,CAAC,aAAa,EAAE;CACpB,KAAK,CAAC,cAAc,EAAE;CACtB,MAAM;EAAC,eAAe;EAAI,qBAAqB;EAAI,kBAAkB;CAAE;CACvE,MAAM;EAAC,eAAe;EAAI,qBAAqB;EAAI,kBAAkB;CAAE;CACvE,KAAK,CAAC,yBAAyB,EAAE;CACjC,KAAK,CAAC,yBAAyB,EAAE;CAEjC,MAAM,CAAC;AACT;AAGA,MAAM,6BAA6B;CACjC,wBAAwB;CACxB,iBAAiB;CACjB,kBAAkB;CAClB,kBAAkB;CAClB,uBAAuB;CACvB,qBAAqB;CACrB,qBAAqB;AACvB;;;;AAKA,MAAa,8BAA8B,IAAI,IAC7C,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAAQ,QAAQ,QAAQ,MAAM,CAChE;;;;AAKA,MAAa,mCAAmC,IAAI,IAClD,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAC7B,QAAQ,QAAQ,UAAU,QAAQ,MACrC,CACF;AAEA,MAAa,uBAAuB,iBAAiB,CACnD,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,KAAK,GAC1C,GAAG,0BACL,CAAC,CAAC,CAAC,KAAK"}
@@ -23,6 +23,7 @@ var npm_exports = /* @__PURE__ */ __exportAll({
23
23
  knownDepTypes: () => knownDepTypes,
24
24
  lockFileMaintenanceIsDelegatedToPackageManager: () => lockFileMaintenanceIsDelegatedToPackageManager,
25
25
  lockFileNames: () => lockFileNames,
26
+ minimumReleaseAgeSupport: () => minimumReleaseAgeSupport,
26
27
  supportedDatasources: () => supportedDatasources,
27
28
  supportsDynamicDepTypesNote: () => supportsDynamicDepTypesNote,
28
29
  supportsLockFileMaintenance: () => true,
@@ -40,6 +41,14 @@ const lockFileNames = [
40
41
  const lockFileMaintenanceIsDelegatedToPackageManager = "Delegated to the underlying package manager CLI - `npm`, `pnpm`, or Yarn - depending on which lock file is present.";
41
42
  const url = "https://docs.npmjs.com";
42
43
  const categories = ["js"];
44
+ const minimumReleaseAgeSupport = {
45
+ npm: {
46
+ passesMinimumReleaseAge: true,
47
+ note: "Passes `--before`. Uses the older date if the repository `.npmrc` has a `before` setting. Skipped if the `.npmrc` has `min-release-age`."
48
+ },
49
+ pnpm: {},
50
+ yarn: {}
51
+ };
43
52
  const defaultConfig = {
44
53
  managerFilePatterns: [
45
54
  "/(^|/)package\\.json$/",
@@ -55,6 +64,6 @@ const supportedDatasources = [
55
64
  NodeVersionDatasource.id
56
65
  ];
57
66
  //#endregion
58
- export { bumpPackageVersion, categories, defaultConfig, detectGlobalConfig, extractAllPackageFiles, getRangeStrategy, knownDepTypes, lockFileMaintenanceIsDelegatedToPackageManager, lockFileNames, npm_exports, supportedDatasources, supportsDynamicDepTypesNote, updateArtifacts, updateDependency, updateLockedDependency, url };
67
+ export { bumpPackageVersion, categories, defaultConfig, detectGlobalConfig, extractAllPackageFiles, getRangeStrategy, knownDepTypes, lockFileMaintenanceIsDelegatedToPackageManager, lockFileNames, minimumReleaseAgeSupport, npm_exports, supportedDatasources, supportsDynamicDepTypesNote, updateArtifacts, updateDependency, updateLockedDependency, url };
59
68
 
60
69
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/npm/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\n\nexport { updateArtifacts } from './artifacts.ts';\nexport { detectGlobalConfig } from './detect.ts';\nexport { extractAllPackageFiles } from './extract/index.ts';\nexport { getRangeStrategy } from './range.ts';\nexport {\n bumpPackageVersion,\n updateDependency,\n updateLockedDependency,\n} from './update/index.ts';\n\nexport const supportsLockFileMaintenance = true;\nexport const supportsNpmrc = true;\nexport const lockFileNames = [\n 'package-lock.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n];\nexport const lockFileMaintenanceIsDelegatedToPackageManager =\n 'Delegated to the underlying package manager CLI - `npm`, `pnpm`, or Yarn - depending on which lock file is present.';\n\nexport const displayName = 'npm';\nexport const url = 'https://docs.npmjs.com';\nexport const categories: Category[] = ['js'];\n\nexport const defaultConfig = {\n managerFilePatterns: [\n '/(^|/)package\\\\.json$/',\n '/(^|/)pnpm-workspace\\\\.yaml$/',\n '/(^|/)\\\\.yarnrc\\\\.yml$/',\n ],\n digest: {\n prBodyDefinitions: {\n Change:\n '{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}',\n },\n },\n prBodyDefinitions: {\n Change:\n \"[{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}})\",\n },\n};\n\nexport const supportedDatasources = [\n GithubTagsDatasource.id,\n NpmDatasource.id,\n NodeVersionDatasource.id,\n];\n\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAa,gBAAgB;CAC3B;CACA;CACA;AACF;AACA,MAAa,iDACX;AAGF,MAAa,MAAM;AACnB,MAAa,aAAyB,CAAC,IAAI;AAE3C,MAAa,gBAAgB;CAC3B,qBAAqB;EACnB;EACA;EACA;CACF;CACA,QAAQ,EACN,mBAAmB,EACjB,QACE,8KACJ,EACF;CACA,mBAAmB,EACjB,QACE,6SACJ;AACF;AAEA,MAAa,uBAAuB;CAClC,qBAAqB;CACrB,cAAc;CACd,sBAAsB;AACxB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/npm/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport type { MinimumReleaseAgeSupport } from '../types.ts';\n\nexport { updateArtifacts } from './artifacts.ts';\nexport { detectGlobalConfig } from './detect.ts';\nexport { extractAllPackageFiles } from './extract/index.ts';\nexport { getRangeStrategy } from './range.ts';\nexport {\n bumpPackageVersion,\n updateDependency,\n updateLockedDependency,\n} from './update/index.ts';\n\nexport const supportsLockFileMaintenance = true;\nexport const supportsNpmrc = true;\nexport const lockFileNames = [\n 'package-lock.json',\n 'pnpm-lock.yaml',\n 'yarn.lock',\n];\nexport const lockFileMaintenanceIsDelegatedToPackageManager =\n 'Delegated to the underlying package manager CLI - `npm`, `pnpm`, or Yarn - depending on which lock file is present.';\n\nexport const displayName = 'npm';\nexport const url = 'https://docs.npmjs.com';\nexport const categories: Category[] = ['js'];\n\nexport const minimumReleaseAgeSupport: MinimumReleaseAgeSupport = {\n npm: {\n passesMinimumReleaseAge: true,\n note: 'Passes `--before`. Uses the older date if the repository `.npmrc` has a `before` setting. Skipped if the `.npmrc` has `min-release-age`.',\n },\n pnpm: {},\n yarn: {},\n};\n\nexport const defaultConfig = {\n managerFilePatterns: [\n '/(^|/)package\\\\.json$/',\n '/(^|/)pnpm-workspace\\\\.yaml$/',\n '/(^|/)\\\\.yarnrc\\\\.yml$/',\n ],\n digest: {\n prBodyDefinitions: {\n Change:\n '{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}',\n },\n },\n prBodyDefinitions: {\n Change:\n \"[{{#if displayFrom}}`{{{displayFrom}}}` → {{else}}{{#if currentValue}}`{{{currentValue}}}` → {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}})\",\n },\n};\n\nexport const supportedDatasources = [\n GithubTagsDatasource.id,\n NpmDatasource.id,\n NodeVersionDatasource.id,\n];\n\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAa,gBAAgB;CAC3B;CACA;CACA;AACF;AACA,MAAa,iDACX;AAGF,MAAa,MAAM;AACnB,MAAa,aAAyB,CAAC,IAAI;AAE3C,MAAa,2BAAqD;CAChE,KAAK;EACH,yBAAyB;EACzB,MAAM;CACR;CACA,MAAM,CAAC;CACP,MAAM,CAAC;AACT;AAEA,MAAa,gBAAgB;CAC3B,qBAAqB;EACnB;EACA;EACA;CACF;CACA,QAAQ,EACN,mBAAmB,EACjB,QACE,8KACJ,EACF;CACA,mBAAmB,EACjB,QACE,6SACJ;AACF;AAEA,MAAa,uBAAuB;CAClC,qBAAqB;CACrB,cAAc;CACd,sBAAsB;AACxB"}
@@ -14,6 +14,7 @@ var pep621_exports = /* @__PURE__ */ __exportAll({
14
14
  knownDepTypes: () => knownDepTypes,
15
15
  lockFileMaintenanceIsDelegatedToPackageManager: () => lockFileMaintenanceIsDelegatedToPackageManager,
16
16
  lockFileNames: () => lockFileNames,
17
+ minimumReleaseAgeSupport: () => minimumReleaseAgeSupport,
17
18
  supportedDatasources: () => supportedDatasources,
18
19
  supportsDynamicDepTypesNote: () => supportsDynamicDepTypesNote,
19
20
  supportsLockFileMaintenance: () => true,
@@ -25,9 +26,13 @@ const lockFileMaintenanceIsDelegatedToPackageManager = "Delegated to the underly
25
26
  const displayName = "PEP 621";
26
27
  const url = "https://peps.python.org/pep-0621";
27
28
  const categories = ["python"];
29
+ const minimumReleaseAgeSupport = {
30
+ uv: {},
31
+ pdm: {}
32
+ };
28
33
  const defaultConfig = { managerFilePatterns: ["/(^|/)pyproject\\.toml$/"] };
29
34
  const supportedDatasources = [PypiDatasource.id];
30
35
  //#endregion
31
- export { bumpPackageVersion, categories, defaultConfig, displayName, extractPackageFile, knownDepTypes, lockFileMaintenanceIsDelegatedToPackageManager, lockFileNames, pep621_exports, supportedDatasources, supportsDynamicDepTypesNote, updateArtifacts, url };
36
+ export { bumpPackageVersion, categories, defaultConfig, displayName, extractPackageFile, knownDepTypes, lockFileMaintenanceIsDelegatedToPackageManager, lockFileNames, minimumReleaseAgeSupport, pep621_exports, supportedDatasources, supportsDynamicDepTypesNote, updateArtifacts, url };
32
37
 
33
38
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/pep621/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\n\nexport { updateArtifacts } from './artifacts.ts';\nexport { extractPackageFile } from './extract.ts';\nexport { bumpPackageVersion } from './update.ts';\n\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['pdm.lock', 'uv.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager =\n 'Delegated to the underlying package manager CLI - `pdm` or `uv` - depending on which lockfile format the project uses.';\n\nexport const displayName = 'PEP 621';\nexport const url = 'https://peps.python.org/pep-0621';\nexport const categories: Category[] = ['python'];\n\nexport const defaultConfig = {\n managerFilePatterns: ['/(^|/)pyproject\\\\.toml$/'],\n};\n\nexport const supportedDatasources = [PypiDatasource.id];\n\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAQA,MAAa,gBAAgB,CAAC,YAAY,SAAS;AACnD,MAAa,iDACX;AAEF,MAAa,cAAc;AAC3B,MAAa,MAAM;AACnB,MAAa,aAAyB,CAAC,QAAQ;AAE/C,MAAa,gBAAgB,EAC3B,qBAAqB,CAAC,0BAA0B,EAClD;AAEA,MAAa,uBAAuB,CAAC,eAAe,EAAE"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/pep621/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport type { MinimumReleaseAgeSupport } from '../types.ts';\n\nexport { updateArtifacts } from './artifacts.ts';\nexport { extractPackageFile } from './extract.ts';\nexport { bumpPackageVersion } from './update.ts';\n\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['pdm.lock', 'uv.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager =\n 'Delegated to the underlying package manager CLI - `pdm` or `uv` - depending on which lockfile format the project uses.';\n\nexport const displayName = 'PEP 621';\nexport const url = 'https://peps.python.org/pep-0621';\nexport const categories: Category[] = ['python'];\n\nexport const minimumReleaseAgeSupport: MinimumReleaseAgeSupport = {\n uv: {},\n pdm: {},\n};\n\nexport const defaultConfig = {\n managerFilePatterns: ['/(^|/)pyproject\\\\.toml$/'],\n};\n\nexport const supportedDatasources = [PypiDatasource.id];\n\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AASA,MAAa,gBAAgB,CAAC,YAAY,SAAS;AACnD,MAAa,iDACX;AAEF,MAAa,cAAc;AAC3B,MAAa,MAAM;AACnB,MAAa,aAAyB,CAAC,QAAQ;AAE/C,MAAa,2BAAqD;CAChE,IAAI,CAAC;CACL,KAAK,CAAC;AACR;AAEA,MAAa,gBAAgB,EAC3B,qBAAqB,CAAC,0BAA0B,EAClD;AAEA,MAAa,uBAAuB,CAAC,eAAe,EAAE"}
@@ -19,6 +19,7 @@ var poetry_exports = /* @__PURE__ */ __exportAll({
19
19
  knownDepTypes: () => knownDepTypes,
20
20
  lockFileMaintenanceIsDelegatedToPackageManager: () => true,
21
21
  lockFileNames: () => lockFileNames,
22
+ minimumReleaseAgeSupport: () => minimumReleaseAgeSupport,
22
23
  supersedesManagers: () => supersedesManagers,
23
24
  supportedDatasources: () => supportedDatasources,
24
25
  supportsDynamicDepTypesNote: () => supportsDynamicDepTypesNote,
@@ -31,6 +32,10 @@ const supersedesManagers = ["pep621"];
31
32
  const lockFileNames = ["poetry.lock"];
32
33
  const url = "https://python-poetry.org/docs";
33
34
  const categories = ["python"];
35
+ const minimumReleaseAgeSupport = { poetry: {
36
+ passesMinimumReleaseAge: ">=2.4.0",
37
+ note: "Sets `POETRY_SOLVER_MIN_RELEASE_AGE`, rounded up to whole days. Older Poetry versions ignore it."
38
+ } };
34
39
  const defaultConfig = { managerFilePatterns: ["/(^|/)pyproject\\.toml$/"] };
35
40
  const supportedDatasources = [
36
41
  PypiDatasource.id,
@@ -41,6 +46,6 @@ const supportedDatasources = [
41
46
  GitTagsDatasource.id
42
47
  ];
43
48
  //#endregion
44
- export { bumpPackageVersion, categories, defaultConfig, extractPackageFile, knownDepTypes, lockFileNames, poetry_exports, supersedesManagers, supportedDatasources, supportsDynamicDepTypesNote, updateArtifacts, updateLockedDependency, url };
49
+ export { bumpPackageVersion, categories, defaultConfig, extractPackageFile, knownDepTypes, lockFileNames, minimumReleaseAgeSupport, poetry_exports, supersedesManagers, supportedDatasources, supportsDynamicDepTypesNote, updateArtifacts, updateLockedDependency, url };
45
50
 
46
51
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/poetry/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\n\nexport { bumpPackageVersion } from '../pep621/update.ts';\nexport { updateArtifacts } from './artifacts.ts';\nexport { extractPackageFile } from './extract.ts';\nexport { updateLockedDependency } from './update-locked.ts';\n\nexport const supersedesManagers = ['pep621'];\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['poetry.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager = true;\n\nexport const url = 'https://python-poetry.org/docs';\nexport const categories: Category[] = ['python'];\n\nexport const defaultConfig = {\n managerFilePatterns: ['/(^|/)pyproject\\\\.toml$/'],\n};\n\nexport const supportedDatasources = [\n PypiDatasource.id,\n GithubTagsDatasource.id,\n GithubReleasesDatasource.id,\n GitlabTagsDatasource.id,\n GitRefsDatasource.id,\n GitTagsDatasource.id,\n];\n\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAa,qBAAqB,CAAC,QAAQ;AAE3C,MAAa,gBAAgB,CAAC,aAAa;AAG3C,MAAa,MAAM;AACnB,MAAa,aAAyB,CAAC,QAAQ;AAE/C,MAAa,gBAAgB,EAC3B,qBAAqB,CAAC,0BAA0B,EAClD;AAEA,MAAa,uBAAuB;CAClC,eAAe;CACf,qBAAqB;CACrB,yBAAyB;CACzB,qBAAqB;CACrB,kBAAkB;CAClB,kBAAkB;AACpB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/poetry/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport type { MinimumReleaseAgeSupport } from '../types.ts';\n\nexport { bumpPackageVersion } from '../pep621/update.ts';\nexport { updateArtifacts } from './artifacts.ts';\nexport { extractPackageFile } from './extract.ts';\nexport { updateLockedDependency } from './update-locked.ts';\n\nexport const supersedesManagers = ['pep621'];\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['poetry.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager = true;\n\nexport const url = 'https://python-poetry.org/docs';\nexport const categories: Category[] = ['python'];\n\nexport const minimumReleaseAgeSupport: MinimumReleaseAgeSupport = {\n poetry: {\n passesMinimumReleaseAge: '>=2.4.0',\n note: 'Sets `POETRY_SOLVER_MIN_RELEASE_AGE`, rounded up to whole days. Older Poetry versions ignore it.',\n },\n};\n\nexport const defaultConfig = {\n managerFilePatterns: ['/(^|/)pyproject\\\\.toml$/'],\n};\n\nexport const supportedDatasources = [\n PypiDatasource.id,\n GithubTagsDatasource.id,\n GithubReleasesDatasource.id,\n GitlabTagsDatasource.id,\n GitRefsDatasource.id,\n GitTagsDatasource.id,\n];\n\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,MAAa,qBAAqB,CAAC,QAAQ;AAE3C,MAAa,gBAAgB,CAAC,aAAa;AAG3C,MAAa,MAAM;AACnB,MAAa,aAAyB,CAAC,QAAQ;AAE/C,MAAa,2BAAqD,EAChE,QAAQ;CACN,yBAAyB;CACzB,MAAM;AACR,EACF;AAEA,MAAa,gBAAgB,EAC3B,qBAAqB,CAAC,0BAA0B,EAClD;AAEA,MAAa,uBAAuB;CAClC,eAAe;CACf,qBAAqB;CACrB,yBAAyB;CACzB,qBAAqB;CACrB,kBAAkB;CAClB,kBAAkB;AACpB"}
@@ -1,5 +1,5 @@
1
1
  import { Category } from "../../constants/category.js";
2
- import { AdditionalConstraintName, ConstraintName } from "../../util/exec/types.js";
2
+ import { AdditionalConstraintName, ConstraintName, ToolName } from "../../util/exec/types.js";
3
3
  import { Timestamp } from "../../util/timestamp.js";
4
4
  import { RegistryStrategy } from "../datasource/types.js";
5
5
  import { FileChange } from "../../util/git/types.js";
@@ -72,6 +72,7 @@ export interface UpdateArtifactsConfig extends ToolConstraintsConfig {
72
72
  lockFiles?: string[];
73
73
  toolSettings?: RepoToolSettingsOptions;
74
74
  minimumReleaseAge?: Nullish<string>;
75
+ minimumReleaseAgeExtracted?: Nullish<string>;
75
76
  }
76
77
  export interface RangeConfig<T = unknown> extends ManagerData<T> {
77
78
  currentValue?: string;
@@ -97,6 +98,12 @@ export interface PackageFileContent<T = unknown> extends ManagerData<T> {
97
98
  matchStrings?: string[];
98
99
  matchStringsStrategy?: MatchStringsStrategy;
99
100
  fileFormat?: string;
101
+ /**
102
+ * The minimum release age configured in the package manager's own configuration, as a duration like `3 days`.
103
+ *
104
+ * Renovate uses the larger of this and `minimumReleaseAge`.
105
+ */
106
+ minimumReleaseAgeExtracted?: string;
100
107
  }
101
108
  export interface PackageFile<T = unknown> extends PackageFileContent<T> {
102
109
  packageFile: string;
@@ -367,6 +374,22 @@ export interface DepTypeMetadata {
367
374
  /** Human-readable description of what this depType represents */
368
375
  description: string;
369
376
  }
377
+ /**
378
+ * `true` when supported, or the version range of the package manager that supports it, e.g. `>=11.10.0`.
379
+ */
380
+ export type MinimumReleaseAgeToolCapability = boolean | string;
381
+ export interface MinimumReleaseAgeToolSupport {
382
+ /** Renovate passes `minimumReleaseAge` to the package manager, e.g. npm `--before`, `POETRY_SOLVER_MIN_RELEASE_AGE` */
383
+ passesMinimumReleaseAge?: MinimumReleaseAgeToolCapability;
384
+ /** Renovate reads the package manager's own minimum release age setting */
385
+ readsConfiguredAge?: MinimumReleaseAgeToolCapability;
386
+ /** The package manager enforces the minimum release age during lock file maintenance */
387
+ enforcedInLockFile?: MinimumReleaseAgeToolCapability;
388
+ /** Markdown note */
389
+ note?: string;
390
+ }
391
+ /** How the package managers of a manager handle `minimumReleaseAge`, used for docs. A missing field means "not supported". */
392
+ export type MinimumReleaseAgeSupport = Partial<Record<ToolName, MinimumReleaseAgeToolSupport>>;
370
393
  export interface ManagerApiBase extends ModuleApi {
371
394
  defaultConfig: Record<string, unknown>;
372
395
  categories?: Category[];
@@ -374,6 +397,8 @@ export interface ManagerApiBase extends ModuleApi {
374
397
  /** Markdown note about dynamically generated depTypes not covered by `knownDepTypes` */
375
398
  supportsDynamicDepTypesNote?: string;
376
399
  supportsLockFileMaintenance?: boolean;
400
+ /** How the package managers used by this manager handle `minimumReleaseAge`, used for docs */
401
+ minimumReleaseAgeSupport?: MinimumReleaseAgeSupport;
377
402
  /** Whether the package files carry an `npmrc` resolved from the repository `.npmrc` and the config, see `NpmrcPackageFile` */
378
403
  supportsNpmrc?: boolean;
379
404
  /**
@@ -396,6 +421,10 @@ export interface ManagerApiBase extends ModuleApi {
396
421
  extractAllPackageFiles?(config: ExtractConfig, files: string[]): MaybePromise<PackageFile[] | null>;
397
422
  extractPackageFile?(content: string, packageFile?: string, config?: ExtractConfig): MaybePromise<PackageFileContent | null>;
398
423
  getRangeStrategy?(config: RangeConfig): RangeStrategy;
424
+ /**
425
+ * Whether the package manager enforces the minimum release age itself when regenerating the lock file for lock file maintenance.
426
+ */
427
+ enforcesMinimumReleaseAge?(config: UpdateArtifactsConfig): MaybePromise<boolean>;
399
428
  updateArtifacts?(updateArtifact: UpdateArtifact): MaybePromise<UpdateArtifactsResult[] | null>;
400
429
  updateDependency?(updateDependencyConfig: UpdateDependencyConfig): MaybePromise<string | null>;
401
430
  updateLockedDependency?(config: UpdateLockedConfig): MaybePromise<UpdateLockedResult>;
@@ -3,22 +3,27 @@ import { coerceNumber } from "./number.js";
3
3
  import { getElapsedMs } from "./date.js";
4
4
  import { isNonEmptyString } from "@sindresorhus/is";
5
5
  //#region lib/util/minimum-release-age.ts
6
+ function durationToMs(duration) {
7
+ return isNonEmptyString(duration) ? coerceNumber(toMs(duration), 0) : 0;
8
+ }
6
9
  /**
7
- * Calculates the effective minimum release age in milliseconds, extended by
8
- * the `minimumReleaseAgeBuffer` duration if configured.
10
+ * Calculates the effective minimum release age in milliseconds: the larger of
11
+ * `minimumReleaseAge` and `minimumReleaseAgeExtracted`, extended by the
12
+ * `minimumReleaseAgeBuffer` duration if configured.
9
13
  */
10
14
  function calculateMinimumReleaseAgeMs(config) {
11
- const minimumReleaseAgeMs = isNonEmptyString(config.minimumReleaseAge) ? coerceNumber(toMs(config.minimumReleaseAge), 0) : 0;
15
+ const minimumReleaseAgeMs = Math.max(durationToMs(config.minimumReleaseAge), durationToMs(config.minimumReleaseAgeExtracted));
12
16
  if (!minimumReleaseAgeMs) return 0;
13
- const bufferMs = isNonEmptyString(config.minimumReleaseAgeBuffer) ? coerceNumber(toMs(config.minimumReleaseAgeBuffer), 0) : 0;
17
+ const bufferMs = durationToMs(config.minimumReleaseAgeBuffer);
14
18
  return minimumReleaseAgeMs + Math.max(bufferMs, 0);
15
19
  }
16
20
  /**
17
- * Checks whether a release satisfies `minimumReleaseAge`, extended by
18
- * `minimumReleaseAgeBuffer` if configured.
21
+ * Checks whether a release satisfies the effective minimum release age.
19
22
  *
20
23
  * Separate from `internalChecksFilter` to allow reuse, and lives here so that
21
24
  * managers can import it without an import cycle.
25
+ *
26
+ * @see calculateMinimumReleaseAgeMs
22
27
  */
23
28
  function checkMinimumReleaseAge(config, releaseTimestamp) {
24
29
  const minimumReleaseAgeMs = calculateMinimumReleaseAgeMs(config);
@@ -1 +1 @@
1
- {"version":3,"file":"minimum-release-age.js","names":[],"sources":["../../lib/util/minimum-release-age.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport type { MinimumReleaseAgeBehaviour } from '../config/types.ts';\nimport { getElapsedMs } from './date.ts';\nimport { coerceNumber } from './number.ts';\nimport { toMs } from './pretty-time.ts';\nimport type { Timestamp } from './timestamp.ts';\n\nexport interface MinimumReleaseAgeCheckResult {\n isPending: boolean;\n /** Effective minimum release age, including `minimumReleaseAgeBuffer`. */\n minimumReleaseAgeMs: number;\n hasTimestamp: boolean;\n}\n\nexport interface MinimumReleaseAgeConfig {\n minimumReleaseAge?: string | null;\n minimumReleaseAgeBuffer?: string | null;\n}\n\n/**\n * Calculates the effective minimum release age in milliseconds, extended by\n * the `minimumReleaseAgeBuffer` duration if configured.\n */\nexport function calculateMinimumReleaseAgeMs(\n config: MinimumReleaseAgeConfig,\n): number {\n const minimumReleaseAgeMs = isNonEmptyString(config.minimumReleaseAge)\n ? coerceNumber(toMs(config.minimumReleaseAge), 0)\n : 0;\n\n if (!minimumReleaseAgeMs) {\n return 0;\n }\n\n const bufferMs = isNonEmptyString(config.minimumReleaseAgeBuffer)\n ? coerceNumber(toMs(config.minimumReleaseAgeBuffer), 0)\n : 0;\n\n return minimumReleaseAgeMs + Math.max(bufferMs, 0);\n}\n\n/**\n * Checks whether a release satisfies `minimumReleaseAge`, extended by\n * `minimumReleaseAgeBuffer` if configured.\n *\n * Separate from `internalChecksFilter` to allow reuse, and lives here so that\n * managers can import it without an import cycle.\n */\nexport function checkMinimumReleaseAge(\n config: MinimumReleaseAgeConfig & {\n minimumReleaseAgeBehaviour?: MinimumReleaseAgeBehaviour | null;\n },\n releaseTimestamp: Timestamp | null | undefined,\n): MinimumReleaseAgeCheckResult {\n const minimumReleaseAgeMs = calculateMinimumReleaseAgeMs(config);\n\n if (!minimumReleaseAgeMs) {\n return {\n isPending: false,\n minimumReleaseAgeMs,\n hasTimestamp: !!releaseTimestamp,\n };\n }\n\n if (releaseTimestamp) {\n return {\n isPending: getElapsedMs(releaseTimestamp) < minimumReleaseAgeMs,\n minimumReleaseAgeMs,\n hasTimestamp: true,\n };\n }\n\n return {\n isPending: config.minimumReleaseAgeBehaviour === 'timestamp-required',\n minimumReleaseAgeMs,\n hasTimestamp: false,\n };\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAgB,6BACd,QACQ;CACR,MAAM,sBAAsB,iBAAiB,OAAO,iBAAiB,IACjE,aAAa,KAAK,OAAO,iBAAiB,GAAG,CAAC,IAC9C;CAEJ,IAAI,CAAC,qBACH,OAAO;CAGT,MAAM,WAAW,iBAAiB,OAAO,uBAAuB,IAC5D,aAAa,KAAK,OAAO,uBAAuB,GAAG,CAAC,IACpD;CAEJ,OAAO,sBAAsB,KAAK,IAAI,UAAU,CAAC;AACnD;;;;;;;;AASA,SAAgB,uBACd,QAGA,kBAC8B;CAC9B,MAAM,sBAAsB,6BAA6B,MAAM;CAE/D,IAAI,CAAC,qBACH,OAAO;EACL,WAAW;EACX;EACA,cAAc,CAAC,CAAC;CAClB;CAGF,IAAI,kBACF,OAAO;EACL,WAAW,aAAa,gBAAgB,IAAI;EAC5C;EACA,cAAc;CAChB;CAGF,OAAO;EACL,WAAW,OAAO,+BAA+B;EACjD;EACA,cAAc;CAChB;AACF"}
1
+ {"version":3,"file":"minimum-release-age.js","names":[],"sources":["../../lib/util/minimum-release-age.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport type { MinimumReleaseAgeBehaviour } from '../config/types.ts';\nimport { getElapsedMs } from './date.ts';\nimport { coerceNumber } from './number.ts';\nimport { toMs } from './pretty-time.ts';\nimport type { Timestamp } from './timestamp.ts';\n\nexport interface MinimumReleaseAgeCheckResult {\n isPending: boolean;\n /** Effective minimum release age, including `minimumReleaseAgeBuffer`. */\n minimumReleaseAgeMs: number;\n hasTimestamp: boolean;\n}\n\nexport interface MinimumReleaseAgeConfig {\n minimumReleaseAge?: string | null;\n minimumReleaseAgeBuffer?: string | null;\n /** The minimum release age which a manager extracted from the package manager's own configuration. */\n minimumReleaseAgeExtracted?: string | null;\n}\n\nfunction durationToMs(duration: string | null | undefined): number {\n return isNonEmptyString(duration) ? coerceNumber(toMs(duration), 0) : 0;\n}\n\n/**\n * Calculates the effective minimum release age in milliseconds: the larger of\n * `minimumReleaseAge` and `minimumReleaseAgeExtracted`, extended by the\n * `minimumReleaseAgeBuffer` duration if configured.\n */\nexport function calculateMinimumReleaseAgeMs(\n config: MinimumReleaseAgeConfig,\n): number {\n const minimumReleaseAgeMs = Math.max(\n durationToMs(config.minimumReleaseAge),\n durationToMs(config.minimumReleaseAgeExtracted),\n );\n\n if (!minimumReleaseAgeMs) {\n return 0;\n }\n\n const bufferMs = durationToMs(config.minimumReleaseAgeBuffer);\n\n return minimumReleaseAgeMs + Math.max(bufferMs, 0);\n}\n\n/**\n * Checks whether a release satisfies the effective minimum release age.\n *\n * Separate from `internalChecksFilter` to allow reuse, and lives here so that\n * managers can import it without an import cycle.\n *\n * @see calculateMinimumReleaseAgeMs\n */\nexport function checkMinimumReleaseAge(\n config: MinimumReleaseAgeConfig & {\n minimumReleaseAgeBehaviour?: MinimumReleaseAgeBehaviour | null;\n },\n releaseTimestamp: Timestamp | null | undefined,\n): MinimumReleaseAgeCheckResult {\n const minimumReleaseAgeMs = calculateMinimumReleaseAgeMs(config);\n\n if (!minimumReleaseAgeMs) {\n return {\n isPending: false,\n minimumReleaseAgeMs,\n hasTimestamp: !!releaseTimestamp,\n };\n }\n\n if (releaseTimestamp) {\n return {\n isPending: getElapsedMs(releaseTimestamp) < minimumReleaseAgeMs,\n minimumReleaseAgeMs,\n hasTimestamp: true,\n };\n }\n\n return {\n isPending: config.minimumReleaseAgeBehaviour === 'timestamp-required',\n minimumReleaseAgeMs,\n hasTimestamp: false,\n };\n}\n"],"mappings":";;;;;AAqBA,SAAS,aAAa,UAA6C;CACjE,OAAO,iBAAiB,QAAQ,IAAI,aAAa,KAAK,QAAQ,GAAG,CAAC,IAAI;AACxE;;;;;;AAOA,SAAgB,6BACd,QACQ;CACR,MAAM,sBAAsB,KAAK,IAC/B,aAAa,OAAO,iBAAiB,GACrC,aAAa,OAAO,0BAA0B,CAChD;CAEA,IAAI,CAAC,qBACH,OAAO;CAGT,MAAM,WAAW,aAAa,OAAO,uBAAuB;CAE5D,OAAO,sBAAsB,KAAK,IAAI,UAAU,CAAC;AACnD;;;;;;;;;AAUA,SAAgB,uBACd,QAGA,kBAC8B;CAC9B,MAAM,sBAAsB,6BAA6B,MAAM;CAE/D,IAAI,CAAC,qBACH,OAAO;EACL,WAAW;EACX;EACA,cAAc,CAAC,CAAC;CAClB;CAGF,IAAI,kBACF,OAAO;EACL,WAAW,aAAa,gBAAgB,IAAI;EAC5C;EACA,cAAc;CAChB;CAGF,OAAO;EACL,WAAW,OAAO,+BAA+B;EACjD;EACA,cAAc;CAChB;AACF"}
@@ -16,8 +16,8 @@ import { clear as clear$1 } from "../../util/http/queue.js";
16
16
  import { clear as clear$2 } from "../../util/http/throttle.js";
17
17
  import { isLimitReached } from "./limits.js";
18
18
  import { autodiscoverRepositories } from "./autodiscover.js";
19
- import { filterConfig } from "../../config/index.js";
20
19
  import { exportStats, finalizeReport } from "../../instrumentation/reporting.js";
20
+ import { filterConfig } from "../../config/index.js";
21
21
  import { renovateRepository } from "../repository/index.js";
22
22
  import { globalFinalize, globalInitialize } from "./initialize.js";
23
23
  import { isNonEmptyObject, isNonEmptyString, isNonEmptyStringAndNotWhitespace, isString } from "@sindresorhus/is";
@@ -1,8 +1,9 @@
1
1
  import { logger } from "../../../logger/index.js";
2
2
  import { getInheritedOrGlobal } from "../../../util/common.js";
3
- import { saveCache } from "../../../util/cache/repository/index.js";
3
+ import { getCache, saveCache } from "../../../util/cache/repository/index.js";
4
4
  import { clearRenovateRefs } from "../../../util/git/index.js";
5
5
  import { platform } from "../../../modules/platform/index.js";
6
+ import { addRepositoryMetadata } from "../../../instrumentation/reporting.js";
6
7
  import { PackageFiles } from "../package-files.js";
7
8
  import { checkReconfigureBranch } from "../reconfigure/index.js";
8
9
  import { pruneStaleBranches } from "./prune.js";
@@ -23,6 +24,7 @@ async function finalizeRepo(config, branchList, repoConfig) {
23
24
  }
24
25
  runBranchSummary(config);
25
26
  runRenovateRepoStats(config, prList);
27
+ addRepositoryMetadata(config, getCache().configFileName, prList);
26
28
  }
27
29
  // istanbul ignore next
28
30
  function ensureIssuesClosing() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["repositoryCache.saveCache"],"sources":["../../../../lib/workers/repository/finalize/index.ts"],"sourcesContent":["import type { AllConfig, RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport * as repositoryCache from '../../../util/cache/repository/index.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\nimport { clearRenovateRefs } from '../../../util/git/index.ts';\nimport { PackageFiles } from '../package-files.ts';\nimport { checkReconfigureBranch } from '../reconfigure/index.ts';\nimport { pruneStaleBranches } from './prune.ts';\nimport {\n runBranchSummary,\n runRenovateRepoStats,\n} from './repository-statistics.ts';\n\n// istanbul ignore next\nexport async function finalizeRepo(\n config: RenovateConfig,\n branchList: string[],\n repoConfig: AllConfig,\n): Promise<void> {\n await checkReconfigureBranch(config, repoConfig);\n await pruneStaleBranches(config, branchList);\n await repositoryCache.saveCache();\n await ensureIssuesClosing();\n await clearRenovateRefs();\n PackageFiles.clear();\n const prList = await platform.getPrList();\n if (\n prList?.some(\n (pr) =>\n pr.state === 'merged' &&\n pr.title !== 'Configure Renovate' &&\n pr.title !== getInheritedOrGlobal('onboardingPrTitle') &&\n pr.sourceBranch !== getInheritedOrGlobal('onboardingBranch'),\n )\n ) {\n logger.debug('Repo is activated');\n config.repoIsActivated = true;\n }\n runBranchSummary(config);\n runRenovateRepoStats(config, prList);\n}\n\n// istanbul ignore next\nfunction ensureIssuesClosing(): Promise<Awaited<void>[]> {\n return Promise.all([\n platform.ensureIssueClosing(`Action Required: Fix Renovate Configuration`),\n platform.ensureIssueClosing(`Action Required: Add missing credentials`),\n ]);\n}\n"],"mappings":";;;;;;;;;;;AAeA,eAAsB,aACpB,QACA,YACA,YACe;CACf,MAAM,uBAAuB,QAAQ,UAAU;CAC/C,MAAM,mBAAmB,QAAQ,UAAU;CAC3C,MAAMA,UAA0B;CAChC,MAAM,oBAAoB;CAC1B,MAAM,kBAAkB;CACxB,aAAa,MAAM;CACnB,MAAM,SAAS,MAAM,SAAS,UAAU;CACxC,IACE,QAAQ,MACL,OACC,GAAG,UAAU,YACb,GAAG,UAAU,wBACb,GAAG,UAAU,qBAAqB,mBAAmB,KACrD,GAAG,iBAAiB,qBAAqB,kBAAkB,CAC/D,GACA;EACA,OAAO,MAAM,mBAAmB;EAChC,OAAO,kBAAkB;CAC3B;CACA,iBAAiB,MAAM;CACvB,qBAAqB,QAAQ,MAAM;AACrC;;AAGA,SAAS,sBAAgD;CACvD,OAAO,QAAQ,IAAI,CACjB,SAAS,mBAAmB,6CAA6C,GACzE,SAAS,mBAAmB,0CAA0C,CACxE,CAAC;AACH"}
1
+ {"version":3,"file":"index.js","names":["repositoryCache.saveCache","repositoryCache.getCache"],"sources":["../../../../lib/workers/repository/finalize/index.ts"],"sourcesContent":["import type { AllConfig, RenovateConfig } from '../../../config/types.ts';\nimport { addRepositoryMetadata } from '../../../instrumentation/reporting.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport * as repositoryCache from '../../../util/cache/repository/index.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\nimport { clearRenovateRefs } from '../../../util/git/index.ts';\nimport { PackageFiles } from '../package-files.ts';\nimport { checkReconfigureBranch } from '../reconfigure/index.ts';\nimport { pruneStaleBranches } from './prune.ts';\nimport {\n runBranchSummary,\n runRenovateRepoStats,\n} from './repository-statistics.ts';\n\n// istanbul ignore next\nexport async function finalizeRepo(\n config: RenovateConfig,\n branchList: string[],\n repoConfig: AllConfig,\n): Promise<void> {\n await checkReconfigureBranch(config, repoConfig);\n await pruneStaleBranches(config, branchList);\n await repositoryCache.saveCache();\n await ensureIssuesClosing();\n await clearRenovateRefs();\n PackageFiles.clear();\n const prList = await platform.getPrList();\n if (\n prList?.some(\n (pr) =>\n pr.state === 'merged' &&\n pr.title !== 'Configure Renovate' &&\n pr.title !== getInheritedOrGlobal('onboardingPrTitle') &&\n pr.sourceBranch !== getInheritedOrGlobal('onboardingBranch'),\n )\n ) {\n logger.debug('Repo is activated');\n config.repoIsActivated = true;\n }\n runBranchSummary(config);\n runRenovateRepoStats(config, prList);\n addRepositoryMetadata(\n config,\n repositoryCache.getCache().configFileName,\n prList,\n );\n}\n\n// istanbul ignore next\nfunction ensureIssuesClosing(): Promise<Awaited<void>[]> {\n return Promise.all([\n platform.ensureIssueClosing(`Action Required: Fix Renovate Configuration`),\n platform.ensureIssueClosing(`Action Required: Add missing credentials`),\n ]);\n}\n"],"mappings":";;;;;;;;;;;;AAgBA,eAAsB,aACpB,QACA,YACA,YACe;CACf,MAAM,uBAAuB,QAAQ,UAAU;CAC/C,MAAM,mBAAmB,QAAQ,UAAU;CAC3C,MAAMA,UAA0B;CAChC,MAAM,oBAAoB;CAC1B,MAAM,kBAAkB;CACxB,aAAa,MAAM;CACnB,MAAM,SAAS,MAAM,SAAS,UAAU;CACxC,IACE,QAAQ,MACL,OACC,GAAG,UAAU,YACb,GAAG,UAAU,wBACb,GAAG,UAAU,qBAAqB,mBAAmB,KACrD,GAAG,iBAAiB,qBAAqB,kBAAkB,CAC/D,GACA;EACA,OAAO,MAAM,mBAAmB;EAChC,OAAO,kBAAkB;CAC3B;CACA,iBAAiB,MAAM;CACvB,qBAAqB,QAAQ,MAAM;CACnC,sBACE,QACAC,SAAyB,CAAC,CAAC,gBAC3B,MACF;AACF;;AAGA,SAAS,sBAAgD;CACvD,OAAO,QAAQ,IAAI,CACjB,SAAS,mBAAmB,6CAA6C,GACzE,SAAS,mBAAmB,0CAA0C,CACxE,CAAC;AACH"}
@@ -47,7 +47,7 @@ function filterDependencyDashboardData(branches) {
47
47
  const branchesFiltered = [];
48
48
  for (const branch of branches) {
49
49
  const upgradesFiltered = [];
50
- const { branchName, prNo, prTitle, result, upgrades, prBlockedBy } = branch;
50
+ const { baseBranch, branchName, prNo, prTitle, result, upgrades, prBlockedBy } = branch;
51
51
  for (const upgrade of coerceArray(upgrades)) {
52
52
  const { datasource, depName, displayPending, fixedVersion, currentVersion, currentValue, currentDigest, newValue, newVersion, newDigest, packageFile, updateType, packageName } = upgrade;
53
53
  const filteredUpgrade = {
@@ -68,6 +68,7 @@ function filterDependencyDashboardData(branches) {
68
68
  upgradesFiltered.push(filteredUpgrade);
69
69
  }
70
70
  const filteredBranch = {
71
+ baseBranch,
71
72
  branchName,
72
73
  prNo,
73
74
  prTitle,
@@ -1 +1 @@
1
- {"version":3,"file":"repository-statistics.js","names":[],"sources":["../../../../lib/workers/repository/finalize/repository-statistics.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../config/types.ts';\nimport { addBranchStats } from '../../../instrumentation/reporting.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { Pr } from '../../../modules/platform/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport {\n getCache,\n isCacheModified,\n} from '../../../util/cache/repository/index.ts';\nimport type {\n BranchCache,\n BranchUpgradeCache,\n} from '../../../util/cache/repository/types.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport type {\n BaseBranchMetadata,\n BaseBranchUpdateSummary,\n BranchMetadata,\n BranchSummary,\n ManagerUpdateSummary,\n UpdateSummary,\n} from '../../types.ts';\n\nexport function runRenovateRepoStats(\n config: RenovateConfig,\n prList: Pr[],\n): void {\n const prStats = { total: 0, open: 0, closed: 0, merged: 0 };\n let lastPRMergedAt: string | undefined;\n\n for (const pr of prList) {\n if (\n pr.title === 'Configure Renovate' ||\n pr.title === getInheritedOrGlobal('onboardingPrTitle')\n ) {\n continue;\n }\n prStats.total += 1;\n switch (pr.state) {\n case 'merged':\n prStats.merged += 1;\n if (pr.closedAt && (!lastPRMergedAt || pr.closedAt > lastPRMergedAt)) {\n lastPRMergedAt = pr.closedAt;\n }\n break;\n case 'closed':\n prStats.closed += 1;\n break;\n case 'open':\n prStats.open += 1;\n break;\n default:\n break;\n }\n }\n logger.debug(\n { stats: prStats, lastPRMergedAt },\n `Renovate repository PR statistics`,\n );\n}\n\nfunction branchCacheToMetadata({\n automerge,\n baseBranch,\n baseBranchSha,\n branchName,\n isModified,\n pristine: isPristine,\n sha: branchSha,\n}: BranchCache): BranchMetadata {\n return {\n automerge,\n baseBranch,\n baseBranchSha,\n branchName,\n branchSha,\n isModified,\n isPristine,\n };\n}\n\nfunction filterDependencyDashboardData(\n branches: BranchCache[],\n): Partial<BranchCache>[] {\n const branchesFiltered: Partial<BranchCache>[] = [];\n for (const branch of branches) {\n const upgradesFiltered: Partial<BranchUpgradeCache>[] = [];\n const { branchName, prNo, prTitle, result, upgrades, prBlockedBy } = branch;\n\n for (const upgrade of coerceArray(upgrades)) {\n const {\n datasource,\n depName,\n displayPending,\n fixedVersion,\n currentVersion,\n currentValue,\n currentDigest,\n newValue,\n newVersion,\n newDigest,\n packageFile,\n updateType,\n packageName,\n } = upgrade;\n\n const filteredUpgrade: Partial<BranchUpgradeCache> = {\n datasource,\n depName,\n displayPending,\n fixedVersion,\n currentVersion,\n currentValue,\n currentDigest,\n newValue,\n newVersion,\n newDigest,\n packageFile,\n updateType,\n packageName,\n };\n upgradesFiltered.push(filteredUpgrade);\n }\n\n const filteredBranch: Partial<BranchCache> = {\n branchName,\n prNo,\n prTitle,\n result,\n prBlockedBy,\n upgrades: upgradesFiltered,\n };\n branchesFiltered.push(filteredBranch);\n }\n\n return branchesFiltered;\n}\n\nexport function runBranchSummary(config: RenovateConfig): void {\n const defaultBranch = config.defaultBranch;\n const { scan, branches } = getCache();\n\n const baseMetadata: BaseBranchMetadata[] = [];\n for (const [branchName, cached] of Object.entries(coerceObject(scan))) {\n baseMetadata.push({ branchName, sha: cached.sha });\n }\n\n const branchMetadata: BranchMetadata[] = [];\n const inactiveBranches: string[] = [];\n\n for (const branch of coerceArray(branches)) {\n if (branch.sha) {\n branchMetadata.push(branchCacheToMetadata(branch));\n } else {\n inactiveBranches.push(branch.branchName);\n }\n }\n\n const res: BranchSummary = {\n cacheModified: isCacheModified(),\n baseBranches: baseMetadata,\n branches: branchMetadata,\n defaultBranch,\n inactiveBranches,\n };\n\n logger.debug(res, 'Branch summary');\n\n if (branches?.length) {\n const branchesInformation = filterDependencyDashboardData(branches);\n addBranchStats(config, branchesInformation);\n logger.debug({ branchesInformation }, 'branches info extended');\n\n const updateSummary = getUpdateSummary(branches);\n logger.debug({ updateSummary }, 'Updates summary');\n }\n}\n\nexport function getUpdateSummary(branches: BranchCache[]): UpdateSummary {\n const summaryByBase = new Map<string, BaseBranchUpdateSummary>();\n\n for (const branch of branches) {\n const baseBranch = branch.baseBranch ?? '';\n let entry = summaryByBase.get(baseBranch);\n if (!entry) {\n entry = {\n baseBranch,\n total: 0,\n vulnerabilityAlert: 0,\n updates: {},\n managers: {},\n };\n summaryByBase.set(baseBranch, entry);\n }\n for (const upgrade of coerceArray(branch.upgrades)) {\n const { updateType } = upgrade;\n if (updateType) {\n entry.total += 1;\n if (upgrade.isVulnerabilityAlert) {\n entry.vulnerabilityAlert += 1;\n }\n\n entry.updates[updateType] = (entry.updates[updateType] ?? 0) + 1;\n\n const manager = upgrade.manager ?? '';\n let managerEntry: ManagerUpdateSummary | undefined =\n entry.managers[manager];\n if (!managerEntry) {\n managerEntry = { total: 0, vulnerabilityAlert: 0, updates: {} };\n entry.managers[manager] = managerEntry;\n }\n managerEntry.total += 1;\n if (upgrade.isVulnerabilityAlert) {\n managerEntry.vulnerabilityAlert += 1;\n }\n managerEntry.updates[updateType] =\n (managerEntry.updates[updateType] ?? 0) + 1;\n } else {\n logger.debug(\n { upgrade },\n 'Found an upgrade without an updateType, which should not be possible',\n );\n }\n }\n }\n\n return Array.from(summaryByBase.values());\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"repository-statistics.js","names":[],"sources":["../../../../lib/workers/repository/finalize/repository-statistics.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../config/types.ts';\nimport { addBranchStats } from '../../../instrumentation/reporting.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { Pr } from '../../../modules/platform/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport {\n getCache,\n isCacheModified,\n} from '../../../util/cache/repository/index.ts';\nimport type {\n BranchCache,\n BranchUpgradeCache,\n} from '../../../util/cache/repository/types.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport type {\n BaseBranchMetadata,\n BaseBranchUpdateSummary,\n BranchMetadata,\n BranchSummary,\n ManagerUpdateSummary,\n UpdateSummary,\n} from '../../types.ts';\n\nexport function runRenovateRepoStats(\n config: RenovateConfig,\n prList: Pr[],\n): void {\n const prStats = { total: 0, open: 0, closed: 0, merged: 0 };\n let lastPRMergedAt: string | undefined;\n\n for (const pr of prList) {\n if (\n pr.title === 'Configure Renovate' ||\n pr.title === getInheritedOrGlobal('onboardingPrTitle')\n ) {\n continue;\n }\n prStats.total += 1;\n switch (pr.state) {\n case 'merged':\n prStats.merged += 1;\n if (pr.closedAt && (!lastPRMergedAt || pr.closedAt > lastPRMergedAt)) {\n lastPRMergedAt = pr.closedAt;\n }\n break;\n case 'closed':\n prStats.closed += 1;\n break;\n case 'open':\n prStats.open += 1;\n break;\n default:\n break;\n }\n }\n logger.debug(\n { stats: prStats, lastPRMergedAt },\n `Renovate repository PR statistics`,\n );\n}\n\nfunction branchCacheToMetadata({\n automerge,\n baseBranch,\n baseBranchSha,\n branchName,\n isModified,\n pristine: isPristine,\n sha: branchSha,\n}: BranchCache): BranchMetadata {\n return {\n automerge,\n baseBranch,\n baseBranchSha,\n branchName,\n branchSha,\n isModified,\n isPristine,\n };\n}\n\nfunction filterDependencyDashboardData(\n branches: BranchCache[],\n): Partial<BranchCache>[] {\n const branchesFiltered: Partial<BranchCache>[] = [];\n for (const branch of branches) {\n const upgradesFiltered: Partial<BranchUpgradeCache>[] = [];\n const {\n baseBranch,\n branchName,\n prNo,\n prTitle,\n result,\n upgrades,\n prBlockedBy,\n } = branch;\n\n for (const upgrade of coerceArray(upgrades)) {\n const {\n datasource,\n depName,\n displayPending,\n fixedVersion,\n currentVersion,\n currentValue,\n currentDigest,\n newValue,\n newVersion,\n newDigest,\n packageFile,\n updateType,\n packageName,\n } = upgrade;\n\n const filteredUpgrade: Partial<BranchUpgradeCache> = {\n datasource,\n depName,\n displayPending,\n fixedVersion,\n currentVersion,\n currentValue,\n currentDigest,\n newValue,\n newVersion,\n newDigest,\n packageFile,\n updateType,\n packageName,\n };\n upgradesFiltered.push(filteredUpgrade);\n }\n\n const filteredBranch: Partial<BranchCache> = {\n baseBranch,\n branchName,\n prNo,\n prTitle,\n result,\n prBlockedBy,\n upgrades: upgradesFiltered,\n };\n branchesFiltered.push(filteredBranch);\n }\n\n return branchesFiltered;\n}\n\nexport function runBranchSummary(config: RenovateConfig): void {\n const defaultBranch = config.defaultBranch;\n const { scan, branches } = getCache();\n\n const baseMetadata: BaseBranchMetadata[] = [];\n for (const [branchName, cached] of Object.entries(coerceObject(scan))) {\n baseMetadata.push({ branchName, sha: cached.sha });\n }\n\n const branchMetadata: BranchMetadata[] = [];\n const inactiveBranches: string[] = [];\n\n for (const branch of coerceArray(branches)) {\n if (branch.sha) {\n branchMetadata.push(branchCacheToMetadata(branch));\n } else {\n inactiveBranches.push(branch.branchName);\n }\n }\n\n const res: BranchSummary = {\n cacheModified: isCacheModified(),\n baseBranches: baseMetadata,\n branches: branchMetadata,\n defaultBranch,\n inactiveBranches,\n };\n\n logger.debug(res, 'Branch summary');\n\n if (branches?.length) {\n const branchesInformation = filterDependencyDashboardData(branches);\n addBranchStats(config, branchesInformation);\n logger.debug({ branchesInformation }, 'branches info extended');\n\n const updateSummary = getUpdateSummary(branches);\n logger.debug({ updateSummary }, 'Updates summary');\n }\n}\n\nexport function getUpdateSummary(branches: BranchCache[]): UpdateSummary {\n const summaryByBase = new Map<string, BaseBranchUpdateSummary>();\n\n for (const branch of branches) {\n const baseBranch = branch.baseBranch ?? '';\n let entry = summaryByBase.get(baseBranch);\n if (!entry) {\n entry = {\n baseBranch,\n total: 0,\n vulnerabilityAlert: 0,\n updates: {},\n managers: {},\n };\n summaryByBase.set(baseBranch, entry);\n }\n for (const upgrade of coerceArray(branch.upgrades)) {\n const { updateType } = upgrade;\n if (updateType) {\n entry.total += 1;\n if (upgrade.isVulnerabilityAlert) {\n entry.vulnerabilityAlert += 1;\n }\n\n entry.updates[updateType] = (entry.updates[updateType] ?? 0) + 1;\n\n const manager = upgrade.manager ?? '';\n let managerEntry: ManagerUpdateSummary | undefined =\n entry.managers[manager];\n if (!managerEntry) {\n managerEntry = { total: 0, vulnerabilityAlert: 0, updates: {} };\n entry.managers[manager] = managerEntry;\n }\n managerEntry.total += 1;\n if (upgrade.isVulnerabilityAlert) {\n managerEntry.vulnerabilityAlert += 1;\n }\n managerEntry.updates[updateType] =\n (managerEntry.updates[updateType] ?? 0) + 1;\n } else {\n logger.debug(\n { upgrade },\n 'Found an upgrade without an updateType, which should not be possible',\n );\n }\n }\n }\n\n return Array.from(summaryByBase.values());\n}\n"],"mappings":"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"}
@@ -13,8 +13,8 @@ import { clear } from "../../util/http/queue.js";
13
13
  import { clear as clear$1 } from "../../util/http/throttle.js";
14
14
  import { removeDanglingContainers } from "../../util/exec/docker/index.js";
15
15
  import { isCloned } from "../../util/git/index.js";
16
- import { processResult } from "./result.js";
17
16
  import { addExtractionStats } from "../../instrumentation/reporting.js";
17
+ import { processResult } from "./result.js";
18
18
  import { detectSemanticCommits } from "../../util/git/semantic.js";
19
19
  import { addSplit, getSplits, splitInit } from "../../util/split.js";
20
20
  import { setBranchCache } from "./cache.js";
@@ -1,5 +1,6 @@
1
1
  import { CONFIG_SECRETS_EXPOSED, CONFIG_VALIDATION, ConfigErrors, EXTERNAL_HOST_ERROR, MANAGER_LOCKFILE_ERROR, MISSING_API_CREDENTIALS, PlatformErrors, RepositoryErrors, SystemErrors, TemporaryErrors, UNKNOWN_ERROR } from "../../constants/error-messages.js";
2
2
  import { logger } from "../../logger/index.js";
3
+ import { addRepositoryStatus } from "../../instrumentation/reporting.js";
3
4
  //#region lib/workers/repository/result.ts
4
5
  /**
5
6
  * Exit code per known error group, used when `exitCodeForErrors` is enabled.
@@ -51,6 +52,7 @@ function processResult(config, res) {
51
52
  status = "unknown";
52
53
  }
53
54
  logger.debug(`Repository result: ${res}, status: ${status}, enabled: ${enabled}, onboarded: ${onboarded}`);
55
+ addRepositoryStatus(config, status);
54
56
  return {
55
57
  res,
56
58
  status,
@@ -1 +1 @@
1
- {"version":3,"file":"result.js","names":[],"sources":["../../../lib/workers/repository/result.ts"],"sourcesContent":["import type { RenovateConfig } from '../../config/types.ts';\n\nimport {\n CONFIG_SECRETS_EXPOSED,\n CONFIG_VALIDATION,\n ConfigErrors,\n EXTERNAL_HOST_ERROR,\n MANAGER_LOCKFILE_ERROR,\n MISSING_API_CREDENTIALS,\n PlatformErrors,\n RepositoryErrors,\n SystemErrors,\n TemporaryErrors,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\n\nimport { logger } from '../../logger/index.ts';\n\nexport type ProcessStatus =\n /**\n * The repository has been disabled, and will not be processed.\n *\n * See {@link RepositoryErrors} for information on which statuses lead to this.\n */\n | 'disabled'\n /**\n * The repository has onboarded to Renovate, so will see PRs and/or branches raised by Renovate.\n *\n * The repository has not yet merged any PRs, or the repository performs branch-based automerge and those have not been detected (TODO #40635).\n */\n | 'onboarded'\n /**\n * The repository has onboarded to Renovate, and has merged at least 1 Renovate PR.\n *\n * The repository may also perform branch-based automerge which has not been detected (TODO #40635).\n */\n | 'activated'\n /**\n * The repository has an onboarding PR from Renovate that has not yet been reviewed and merged.\n */\n | 'onboarding'\n | 'unknown';\n\nexport interface ProcessResult {\n res: RepositoryResult;\n status: ProcessStatus;\n enabled: boolean | undefined;\n onboarded: boolean | undefined;\n /** the process exit code this result maps to, used when `exitCodeForErrors` is enabled */\n exitCode: number;\n}\n\n/** a strong type for any repository result status that Renovate may report */\nexport type RepositoryResult =\n /** repository was processed successfully */\n | 'done'\n /** Renovate performed branch-based automerge on one branch during its run */\n | 'automerged'\n /** the repository is not yet onboarded, and its onboarding PR was processed during this run */\n | 'onboarding'\n // common set of errors\n | (typeof SystemErrors)[number]\n | (typeof RepositoryErrors)[number]\n | (typeof TemporaryErrors)[number]\n | (typeof ConfigErrors)[number]\n | (typeof PlatformErrors)[number]\n // other errors\n | typeof EXTERNAL_HOST_ERROR\n | typeof MISSING_API_CREDENTIALS\n | typeof MANAGER_LOCKFILE_ERROR\n | typeof UNKNOWN_ERROR;\n\n/**\n * Exit code per known error group, used when `exitCodeForErrors` is enabled.\n *\n * `RepositoryErrors` are deliberately absent: they mean the repository is disabled, not that the run failed.\n */\nconst exitCodes: [readonly string[], number][] = [\n [SystemErrors, 3],\n [PlatformErrors, 4],\n [ConfigErrors, 5],\n [TemporaryErrors, 6],\n [[EXTERNAL_HOST_ERROR, MANAGER_LOCKFILE_ERROR, MISSING_API_CREDENTIALS], 7],\n [[UNKNOWN_ERROR], 8],\n];\n\nfunction getExitCode(res: RepositoryResult): number {\n return exitCodes.find(([errors]) => errors.includes(res))?.[1] ?? 0;\n}\n\nexport function processResult(\n config: RenovateConfig,\n res: RepositoryResult,\n): ProcessResult {\n const enabledStatuses = [\n CONFIG_SECRETS_EXPOSED,\n CONFIG_VALIDATION,\n MISSING_API_CREDENTIALS,\n ];\n let status: ProcessStatus;\n let enabled: boolean | undefined;\n let onboarded: boolean | undefined;\n // istanbul ignore next\n if (RepositoryErrors.includes(res as (typeof RepositoryErrors)[number])) {\n status = 'disabled';\n enabled = false;\n } else if (config.repoIsActivated) {\n status = 'activated';\n enabled = true;\n onboarded = true;\n } else if (enabledStatuses.includes(res) || config.repoIsOnboarded) {\n status = 'onboarded';\n enabled = true;\n onboarded = true;\n } else if (config.repoIsOnboarded === false) {\n status = 'onboarding';\n enabled = true;\n onboarded = false;\n } else {\n logger.debug(`Unknown res: ${res}`);\n status = 'unknown';\n }\n logger.debug(\n // TODO: types (#22198)\n `Repository result: ${res}, status: ${status}, enabled: ${enabled!}, onboarded: ${onboarded!}`,\n );\n return { res, status, enabled, onboarded, exitCode: getExitCode(res) };\n}\n"],"mappings":";;;;;;;;AA6EA,MAAM,YAA2C;CAC/C,CAAC,cAAc,CAAC;CAChB,CAAC,gBAAgB,CAAC;CAClB,CAAC,cAAc,CAAC;CAChB,CAAC,iBAAiB,CAAC;CACnB,CAAC;EAAC;EAAqB;EAAwB;CAAuB,GAAG,CAAC;CAC1E,CAAC,CAAC,aAAa,GAAG,CAAC;AACrB;AAEA,SAAS,YAAY,KAA+B;CAClD,OAAO,UAAU,MAAM,CAAC,YAAY,OAAO,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM;AACpE;AAEA,SAAgB,cACd,QACA,KACe;CACf,MAAM,kBAAkB;EACtB;EACA;EACA;CACF;CACA,IAAI;CACJ,IAAI;CACJ,IAAI;;CAEJ,IAAI,iBAAiB,SAAS,GAAwC,GAAG;EACvE,SAAS;EACT,UAAU;CACZ,OAAO,IAAI,OAAO,iBAAiB;EACjC,SAAS;EACT,UAAU;EACV,YAAY;CACd,OAAO,IAAI,gBAAgB,SAAS,GAAG,KAAK,OAAO,iBAAiB;EAClE,SAAS;EACT,UAAU;EACV,YAAY;CACd,OAAO,IAAI,OAAO,oBAAoB,OAAO;EAC3C,SAAS;EACT,UAAU;EACV,YAAY;CACd,OAAO;EACL,OAAO,MAAM,gBAAgB,KAAK;EAClC,SAAS;CACX;CACA,OAAO,MAEL,sBAAsB,IAAI,YAAY,OAAO,aAAa,QAAS,eAAe,WACpF;CACA,OAAO;EAAE;EAAK;EAAQ;EAAS;EAAW,UAAU,YAAY,GAAG;CAAE;AACvE"}
1
+ {"version":3,"file":"result.js","names":[],"sources":["../../../lib/workers/repository/result.ts"],"sourcesContent":["import type { RenovateConfig } from '../../config/types.ts';\n\nimport {\n CONFIG_SECRETS_EXPOSED,\n CONFIG_VALIDATION,\n ConfigErrors,\n EXTERNAL_HOST_ERROR,\n MANAGER_LOCKFILE_ERROR,\n MISSING_API_CREDENTIALS,\n PlatformErrors,\n RepositoryErrors,\n SystemErrors,\n TemporaryErrors,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\n\nimport { addRepositoryStatus } from '../../instrumentation/reporting.ts';\nimport { logger } from '../../logger/index.ts';\n\nexport type ProcessStatus =\n /**\n * The repository has been disabled, and will not be processed.\n *\n * See {@link RepositoryErrors} for information on which statuses lead to this.\n */\n | 'disabled'\n /**\n * The repository has onboarded to Renovate, so will see PRs and/or branches raised by Renovate.\n *\n * The repository has not yet merged any PRs, or the repository performs branch-based automerge and those have not been detected (TODO #40635).\n */\n | 'onboarded'\n /**\n * The repository has onboarded to Renovate, and has merged at least 1 Renovate PR.\n *\n * The repository may also perform branch-based automerge which has not been detected (TODO #40635).\n */\n | 'activated'\n /**\n * The repository has an onboarding PR from Renovate that has not yet been reviewed and merged.\n */\n | 'onboarding'\n | 'unknown';\n\nexport interface ProcessResult {\n res: RepositoryResult;\n status: ProcessStatus;\n enabled: boolean | undefined;\n onboarded: boolean | undefined;\n /** the process exit code this result maps to, used when `exitCodeForErrors` is enabled */\n exitCode: number;\n}\n\n/** a strong type for any repository result status that Renovate may report */\nexport type RepositoryResult =\n /** repository was processed successfully */\n | 'done'\n /** Renovate performed branch-based automerge on one branch during its run */\n | 'automerged'\n /** the repository is not yet onboarded, and its onboarding PR was processed during this run */\n | 'onboarding'\n // common set of errors\n | (typeof SystemErrors)[number]\n | (typeof RepositoryErrors)[number]\n | (typeof TemporaryErrors)[number]\n | (typeof ConfigErrors)[number]\n | (typeof PlatformErrors)[number]\n // other errors\n | typeof EXTERNAL_HOST_ERROR\n | typeof MISSING_API_CREDENTIALS\n | typeof MANAGER_LOCKFILE_ERROR\n | typeof UNKNOWN_ERROR;\n\n/**\n * Exit code per known error group, used when `exitCodeForErrors` is enabled.\n *\n * `RepositoryErrors` are deliberately absent: they mean the repository is disabled, not that the run failed.\n */\nconst exitCodes: [readonly string[], number][] = [\n [SystemErrors, 3],\n [PlatformErrors, 4],\n [ConfigErrors, 5],\n [TemporaryErrors, 6],\n [[EXTERNAL_HOST_ERROR, MANAGER_LOCKFILE_ERROR, MISSING_API_CREDENTIALS], 7],\n [[UNKNOWN_ERROR], 8],\n];\n\nfunction getExitCode(res: RepositoryResult): number {\n return exitCodes.find(([errors]) => errors.includes(res))?.[1] ?? 0;\n}\n\nexport function processResult(\n config: RenovateConfig,\n res: RepositoryResult,\n): ProcessResult {\n const enabledStatuses = [\n CONFIG_SECRETS_EXPOSED,\n CONFIG_VALIDATION,\n MISSING_API_CREDENTIALS,\n ];\n let status: ProcessStatus;\n let enabled: boolean | undefined;\n let onboarded: boolean | undefined;\n // istanbul ignore next\n if (RepositoryErrors.includes(res as (typeof RepositoryErrors)[number])) {\n status = 'disabled';\n enabled = false;\n } else if (config.repoIsActivated) {\n status = 'activated';\n enabled = true;\n onboarded = true;\n } else if (enabledStatuses.includes(res) || config.repoIsOnboarded) {\n status = 'onboarded';\n enabled = true;\n onboarded = true;\n } else if (config.repoIsOnboarded === false) {\n status = 'onboarding';\n enabled = true;\n onboarded = false;\n } else {\n logger.debug(`Unknown res: ${res}`);\n status = 'unknown';\n }\n logger.debug(\n // TODO: types (#22198)\n `Repository result: ${res}, status: ${status}, enabled: ${enabled!}, onboarded: ${onboarded!}`,\n );\n addRepositoryStatus(config, status);\n return { res, status, enabled, onboarded, exitCode: getExitCode(res) };\n}\n"],"mappings":";;;;;;;;;AA8EA,MAAM,YAA2C;CAC/C,CAAC,cAAc,CAAC;CAChB,CAAC,gBAAgB,CAAC;CAClB,CAAC,cAAc,CAAC;CAChB,CAAC,iBAAiB,CAAC;CACnB,CAAC;EAAC;EAAqB;EAAwB;CAAuB,GAAG,CAAC;CAC1E,CAAC,CAAC,aAAa,GAAG,CAAC;AACrB;AAEA,SAAS,YAAY,KAA+B;CAClD,OAAO,UAAU,MAAM,CAAC,YAAY,OAAO,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM;AACpE;AAEA,SAAgB,cACd,QACA,KACe;CACf,MAAM,kBAAkB;EACtB;EACA;EACA;CACF;CACA,IAAI;CACJ,IAAI;CACJ,IAAI;;CAEJ,IAAI,iBAAiB,SAAS,GAAwC,GAAG;EACvE,SAAS;EACT,UAAU;CACZ,OAAO,IAAI,OAAO,iBAAiB;EACjC,SAAS;EACT,UAAU;EACV,YAAY;CACd,OAAO,IAAI,gBAAgB,SAAS,GAAG,KAAK,OAAO,iBAAiB;EAClE,SAAS;EACT,UAAU;EACV,YAAY;CACd,OAAO,IAAI,OAAO,oBAAoB,OAAO;EAC3C,SAAS;EACT,UAAU;EACV,YAAY;CACd,OAAO;EACL,OAAO,MAAM,gBAAgB,KAAK;EAClC,SAAS;CACX;CACA,OAAO,MAEL,sBAAsB,IAAI,YAAY,OAAO,aAAa,QAAS,eAAe,WACpF;CACA,oBAAoB,QAAQ,MAAM;CAClC,OAAO;EAAE;EAAK;EAAQ;EAAS;EAAW,UAAU,YAAY,GAAG;CAAE;AACvE"}
@@ -11,6 +11,7 @@ import { getCount, isLimitReached } from "../../../global/limits.js";
11
11
  import { getElapsedMs } from "../../../../util/date.js";
12
12
  import { emojify } from "../../../../util/emoji.js";
13
13
  import { scm } from "../../../../modules/platform/scm.js";
14
+ import { enforcesMinimumReleaseAge } from "../../../../modules/manager/index.js";
14
15
  import { platform } from "../../../../modules/platform/index.js";
15
16
  import { ensureComment, ensureCommentRemoval } from "../../../../modules/platform/comment.js";
16
17
  import { embedChangelogs } from "../../changelog/index.js";
@@ -66,6 +67,17 @@ async function deleteBranchSilently(branchName) {
66
67
  }, "Branch auto-remove failed");
67
68
  }
68
69
  }
70
+ /**
71
+ * The minimum release age which Renovate has to check for `upgrade`, which is
72
+ * `0` for lock file maintenance if the package manager enforces it itself.
73
+ */
74
+ async function getMinimumReleaseAgeMsToCheck(upgrade) {
75
+ const minimumReleaseAgeMs = calculateMinimumReleaseAgeMs(upgrade);
76
+ if (!minimumReleaseAgeMs || !upgrade.isLockFileMaintenance) return minimumReleaseAgeMs;
77
+ if (!await enforcesMinimumReleaseAge(upgrade.manager, upgrade)) return minimumReleaseAgeMs;
78
+ logger.debug(`Lock file maintenance of ${upgrade.packageFile}: the package manager enforces the minimum release age`);
79
+ return 0;
80
+ }
69
81
  function userChangedTargetBranch(pr) {
70
82
  const oldTargetBranch = pr.bodyStruct?.debugData?.targetBranch;
71
83
  if (oldTargetBranch && pr.targetBranch) return pr.targetBranch !== oldTargetBranch;
@@ -277,14 +289,14 @@ async function processBranch(branchConfig, forceRebase = false) {
277
289
  }
278
290
  logger.debug("Branch + PR exists but is not scheduled -- will update if necessary");
279
291
  }
280
- if (config.upgrades.some((upgrade) => isNonEmptyString(upgrade.minimumReleaseAge) || isActiveConfidenceLevel(upgrade.minimumConfidence))) {
292
+ if (config.upgrades.some((upgrade) => isNonEmptyString(upgrade.minimumReleaseAge) || isNonEmptyString(upgrade.minimumReleaseAgeExtracted) || isActiveConfidenceLevel(upgrade.minimumConfidence))) {
281
293
  const depNamesWithoutReleaseTimestamp = {
282
294
  "timestamp-required": [],
283
295
  "timestamp-optional": []
284
296
  };
285
297
  config.stabilityStatus = "green";
286
298
  for (const upgrade of config.upgrades) {
287
- const minimumReleaseAgeMs = calculateMinimumReleaseAgeMs(upgrade);
299
+ const minimumReleaseAgeMs = await getMinimumReleaseAgeMsToCheck(upgrade);
288
300
  if (minimumReleaseAgeMs) {
289
301
  const minimumReleaseAgeBehaviour = upgrade.minimumReleaseAgeBehaviour ?? "timestamp-required";
290
302
  if (upgrade.releaseTimestamp) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["template.compile"],"sources":["../../../../../lib/workers/repository/update/branch/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type MinimumReleaseAgeBehaviour,\n type RenovateConfig,\n type UpdateType,\n} from '../../../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n MANAGER_LOCKFILE_ERROR,\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n PR_ALREADY_IN_MERGE_QUEUE,\n REPOSITORY_CHANGED,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n WORKER_FILE_UPDATE_FAILED,\n} from '../../../../constants/error-messages.ts';\nimport { logger, removeMeta } from '../../../../logger/index.ts';\nimport { updateActionsLockfile } from '../../../../modules/manager/github-actions/artifacts.ts';\nimport { getAdditionalFiles } from '../../../../modules/manager/npm/post-update/index.ts';\nimport {\n ensureComment,\n ensureCommentRemoval,\n} from '../../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { getElapsedMs } from '../../../../util/date.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { filterValidCommitTrailers } from '../../../../util/git/commit-trailers.ts';\nimport {\n getMergeConfidenceLevel,\n isActiveConfidenceLevel,\n satisfiesConfidenceLevel,\n} from '../../../../util/merge-confidence/index.ts';\nimport { calculateMinimumReleaseAgeMs } from '../../../../util/minimum-release-age.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport { withoutUrlCredentials } from '../../../../util/url.ts';\nimport { getCount, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchResult,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { checkAutoMerge } from '../pr/automerge.ts';\nimport { ensurePr, getPlatformPrOptions } from '../pr/index.ts';\nimport { setArtifactErrorStatus } from './artifacts.ts';\nimport { tryBranchAutomerge } from './automerge.ts';\nimport { bumpVersions } from './bump-versions.ts';\nimport { prAlreadyExisted } from './check-existing.ts';\nimport { commitFilesToBranch } from './commit.ts';\nimport executePostUpgradeCommands from './execute-post-upgrade-commands.ts';\nimport { getUpdatedPackageFiles } from './get-updated.ts';\nimport { handleClosedPr, handleModifiedPr } from './handle-existing.ts';\nimport { shouldReuseExistingBranch } from './reuse.ts';\nimport { isScheduledNow } from './schedule.ts';\nimport { setConfidence, setStability } from './status-checks.ts';\n\nasync function setBranchStatusChecks(config: BranchConfig): Promise<void> {\n await setStability(config);\n await setConfidence(config);\n}\n\nasync function rebaseCheck(\n config: RenovateConfig,\n branchPr: Pr,\n): Promise<boolean> {\n const titleRebase = branchPr.title?.startsWith('rebase!');\n if (titleRebase) {\n logger.debug(\n `Manual rebase requested via PR title for #${branchPr.number}`,\n );\n return true;\n }\n const labelRebase = !!branchPr.labels?.includes(config.rebaseLabel!);\n if (labelRebase) {\n logger.debug(\n `Manual rebase requested via PR labels for #${branchPr.number}`,\n );\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would delete label ${config.rebaseLabel!} from #${\n branchPr.number\n }`,\n );\n } else {\n await platform.deleteLabel(branchPr.number, config.rebaseLabel!);\n }\n return true;\n }\n const prRebaseChecked = !!branchPr.bodyStruct?.rebaseRequested;\n if (prRebaseChecked) {\n logger.debug(\n `Manual rebase requested via PR checkbox for #${branchPr.number}`,\n );\n return true;\n }\n\n return false;\n}\n\nasync function deleteBranchSilently(branchName: string): Promise<void> {\n try {\n await scm.deleteBranch(branchName);\n } catch (err) {\n /* v8 ignore next -- needs test */\n logger.debug({ branchName, err }, 'Branch auto-remove failed');\n }\n}\n\nfunction userChangedTargetBranch(pr: Pr): boolean {\n const oldTargetBranch = pr.bodyStruct?.debugData?.targetBranch;\n if (oldTargetBranch && pr.targetBranch) {\n return pr.targetBranch !== oldTargetBranch;\n }\n return false;\n}\n\nexport interface ProcessBranchResult {\n branchExists: boolean;\n updatesVerified?: boolean;\n prBlockedBy?: PrBlockedBy;\n prNo?: number;\n result: BranchResult;\n commitSha?: string | null;\n}\n\nexport async function processBranch(\n branchConfig: BranchConfig,\n forceRebase = false,\n): Promise<ProcessBranchResult> {\n let commitSha: string | null = null;\n let config: BranchConfig = { ...branchConfig };\n logger.trace({ config }, 'processBranch()');\n let branchExists = await scm.branchExists(config.branchName);\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n // Only allow a branch to be recreated with updates that are `pending` if we've explicitly constented with an `unpend` on the Dependency Dashboard, or when using `checkedBranches`\n const unpendRequested =\n dependencyDashboardCheck === 'unpend' ||\n dependencyDashboardCheck === 'global-config';\n let updatesVerified = false;\n if (!branchExists && config.branchPrefix !== config.branchPrefixOld) {\n const branchName = config.branchName.replace(\n config.branchPrefix!,\n config.branchPrefixOld!,\n );\n branchExists = await scm.branchExists(branchName);\n // v8 ignore else -- TODO: add test #40625\n if (branchExists) {\n config.branchName = branchName;\n logger.debug('Found existing branch with branchPrefixOld');\n }\n }\n\n if (\n !branchExists &&\n branchConfig.minimumGroupSize &&\n branchConfig.minimumGroupSize > branchConfig.upgrades.length &&\n !dependencyDashboardCheck\n ) {\n logger.debug(\n `Skipping branch creation as minimumGroupSize: ${branchConfig.minimumGroupSize} is not met`,\n );\n return {\n branchExists: false,\n result: 'minimum-group-size-not-met',\n };\n }\n\n let branchPr = await platform.getBranchPr(\n config.branchName,\n config.baseBranch,\n );\n logger.debug(`branchExists=${branchExists}`);\n logger.debug(`dependencyDashboardCheck=${dependencyDashboardCheck!}`);\n if (branchPr) {\n config.rebaseRequested = await rebaseCheck(config, branchPr);\n logger.debug(`PR rebase requested=${config.rebaseRequested}`);\n }\n const keepUpdatedLabel = config.keepUpdatedLabel;\n const pendingRebaseTopic = emojify(':warning: Rebase not applied');\n const artifactErrorTopic = emojify(':warning: Artifact update problem');\n const artifactNoticeTopic = emojify(\n ':information_source: Artifact update notice',\n );\n try {\n // Check if branch already existed\n const existingPr =\n !branchPr || config.automerge\n ? await prAlreadyExisted(config)\n : undefined;\n if (existingPr?.state === 'merged') {\n logger.debug(`Matching PR #${existingPr.number} was merged previously`);\n if (config.automerge) {\n logger.debug('Disabling automerge because PR was merged previously');\n config.automerge = false;\n config.automergedPreviously = true;\n }\n } else if (!branchPr && existingPr && !dependencyDashboardCheck) {\n logger.debug(\n { prTitle: config.prTitle },\n `Closed PR #${existingPr.number} already exists. Skipping branch.`,\n );\n await handleClosedPr(config, existingPr);\n return {\n branchExists: false,\n prNo: existingPr.number,\n result: 'already-existed',\n };\n }\n if (!branchExists && branchConfig.pendingChecks && !unpendRequested) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because internalChecksFilter was not met`,\n );\n return {\n branchExists: false,\n result: 'pending',\n };\n }\n if (!branchExists) {\n if (config.mode === 'silent' && !dependencyDashboardCheck) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because mode=silent`,\n );\n return {\n branchExists,\n result: 'needs-approval',\n };\n }\n if (config.dependencyDashboardApproval && !dependencyDashboardCheck) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because dependencyDashboardApproval=true`,\n );\n return {\n branchExists,\n result: 'needs-approval',\n };\n }\n }\n\n logger.debug(\n `Open PR Count: ${getCount('ConcurrentPRs')}, Existing Branch Count: ${getCount('Branches')}, Hourly PR Count: ${getCount('HourlyPRs')}, Hourly Commit Count: ${getCount('HourlyCommits')}`,\n );\n\n // for a vulnerability alert this checks the VulnerabilityBranches count\n if (\n !branchExists &&\n isLimitReached('Branches', branchConfig) &&\n !dependencyDashboardCheck\n ) {\n logger.debug('Reached branch limit - skipping branch creation');\n return {\n branchExists,\n result: 'branch-limit-reached',\n };\n }\n if (\n !config.rebaseRequested &&\n isLimitReached('Commits') &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached commits per run limit - skipping branch');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'commit-per-run-limit-reached',\n };\n }\n if (\n !config.rebaseRequested &&\n isLimitReached('HourlyCommits', branchConfig) &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached hourly commits limit - skipping branch');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'commit-hourly-limit-reached',\n };\n }\n if (branchExists) {\n // check if branch is labelled to stop\n config.stopUpdating = branchPr?.labels?.includes(\n config.stopUpdatingLabel!,\n );\n\n const prRebaseChecked = !!branchPr?.bodyStruct?.rebaseRequested;\n\n if (\n !dependencyDashboardCheck &&\n !prRebaseChecked &&\n config.stopUpdating\n ) {\n logger.info(\n 'Branch updating is skipped because stopUpdatingLabel is present in config',\n );\n return {\n branchExists: true,\n prNo: branchPr?.number,\n result: 'no-work',\n };\n }\n\n // A rebase or retry request is not consent to add an upgrade which has not met its internal checks, so only an unpend of this branch may override this\n if (!unpendRequested && config.pendingChecks) {\n if (config.rebaseRequested) {\n logger.info(\n 'Branch updating is skipped because internalChecksFilter was not met, despite the requested rebase',\n );\n if (branchPr) {\n const content =\n 'This branch has not been rebased, as its update has not yet met the internal checks configured for it, such as `minimumReleaseAge`. Rebasing it now would add a dependency version which is still within its configured observation period.\\n\\nRenovate will rebase this branch once its update has met those checks.';\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure pending rebase comment in PR #${branchPr.number}`,\n );\n } else {\n await ensureComment({\n number: branchPr.number,\n topic: pendingRebaseTopic,\n content,\n });\n }\n }\n } else {\n logger.info(\n 'Branch updating is skipped because internalChecksFilter was not met',\n );\n }\n return {\n branchExists: true,\n prNo: branchPr?.number,\n result: 'pending',\n };\n }\n\n logger.debug('Checking if PR has been edited');\n const branchIsModified = await scm.isBranchModified(\n config.branchName,\n config.baseBranch,\n );\n if (branchPr) {\n logger.debug(`Found existing branch PR #${branchPr.number}`);\n if (branchPr.state !== 'open') {\n logger.debug(\n 'PR has been closed or merged since this run started - aborting',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n if (branchIsModified || userChangedTargetBranch(branchPr)) {\n logger.debug(`PR has been edited, PrNo:${branchPr.number}`);\n await handleModifiedPr(config, branchPr);\n if (!(!!dependencyDashboardCheck || config.rebaseRequested)) {\n return {\n branchExists,\n prNo: branchPr.number,\n result: 'pr-edited',\n };\n }\n }\n } else if (branchIsModified && !dependencyDashboardCheck) {\n const oldPr = await platform.findPr({\n branchName: config.branchName,\n state: '!open',\n targetBranch: config.baseBranch,\n });\n if (!oldPr) {\n logger.debug('Branch has been edited but found no PR - skipping');\n return {\n branchExists,\n result: 'pr-edited',\n };\n }\n const branchSha = await scm.getBranchCommit(config.branchName);\n const oldPrSha = oldPr?.sha;\n if (!oldPrSha || oldPrSha === branchSha) {\n logger.debug(\n { oldPrNumber: oldPr.number, oldPrSha, branchSha },\n 'Found old PR matching this branch - will override it',\n );\n } else {\n logger.debug(\n { oldPrNumber: oldPr.number, oldPrSha, branchSha },\n 'Found old PR but the SHA is different',\n );\n return {\n branchExists,\n result: 'pr-edited',\n };\n }\n }\n }\n\n // Check schedule\n config.isScheduledNow = isScheduledNow(config, 'schedule');\n if (!config.isScheduledNow && !dependencyDashboardCheck) {\n if (!branchExists) {\n logger.debug('Skipping branch creation as not within schedule');\n return {\n branchExists,\n result: 'not-scheduled',\n };\n }\n if (config.updateNotScheduled === false && !config.rebaseRequested) {\n logger.debug('Skipping branch update as not within schedule');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'update-not-scheduled',\n };\n }\n if (\n !branchPr &&\n !(config.automerge && config.automergeType === 'branch') // if branch is configured for automerge there's no need for a PR\n ) {\n logger.debug('Skipping PR creation out of schedule');\n return {\n branchExists,\n result: 'not-scheduled',\n };\n }\n logger.debug(\n 'Branch + PR exists but is not scheduled -- will update if necessary',\n );\n }\n //stability checks\n if (\n config.upgrades.some(\n (upgrade) =>\n isNonEmptyString(upgrade.minimumReleaseAge) ||\n isActiveConfidenceLevel(upgrade.minimumConfidence!),\n )\n ) {\n const depNamesWithoutReleaseTimestamp: Record<\n MinimumReleaseAgeBehaviour,\n {\n depName: string;\n updateType: UpdateType;\n }[]\n > = {\n 'timestamp-required': [],\n 'timestamp-optional': [],\n };\n\n // Only set a stability status check if one or more of the updates contain\n // both a minimumReleaseAge setting and a releaseTimestamp\n config.stabilityStatus = 'green';\n // Default to 'success' but set 'pending' if any update is pending\n for (const upgrade of config.upgrades) {\n const minimumReleaseAgeMs = calculateMinimumReleaseAgeMs(upgrade);\n\n if (minimumReleaseAgeMs) {\n const minimumReleaseAgeBehaviour: MinimumReleaseAgeBehaviour =\n upgrade.minimumReleaseAgeBehaviour ?? 'timestamp-required';\n\n // regardless of the value of `minimumReleaseAgeBehaviour`, if there is a timestamp, we will process it according to `minimumReleaseAge`\n if (upgrade.releaseTimestamp) {\n const timeElapsed = getElapsedMs(upgrade.releaseTimestamp);\n if (timeElapsed < minimumReleaseAgeMs) {\n logger.debug(\n {\n depName: upgrade.depName,\n timeElapsed,\n minimumReleaseAge: upgrade.minimumReleaseAge,\n },\n 'Update has not passed minimum release age',\n );\n config.stabilityStatus = 'yellow';\n continue;\n }\n } else {\n // if we're set to `minimumReleaseAgeBehaviour=timestamp-required`, and there isn't a timestamp, always mark the update as pending\n if (minimumReleaseAgeBehaviour === 'timestamp-required') {\n depNamesWithoutReleaseTimestamp['timestamp-required'].push({\n depName: upgrade.depName!,\n updateType: upgrade.updateType!,\n });\n config.stabilityStatus = 'yellow';\n continue;\n } else {\n // if there is no timestamp, and we're running in `optional` mode, we can allow it, but make sure to warn the user\n depNamesWithoutReleaseTimestamp['timestamp-optional'].push({\n depName: upgrade.depName!,\n updateType: upgrade.updateType!,\n });\n }\n }\n }\n const datasource = upgrade.datasource!;\n const depName = upgrade.depName!;\n const packageName = upgrade.packageName!;\n const minimumConfidence = upgrade.minimumConfidence!;\n const updateType = upgrade.updateType!;\n const currentVersion = upgrade.currentVersion!;\n const newVersion = upgrade.newVersion!;\n if (isActiveConfidenceLevel(minimumConfidence)) {\n const confidence =\n (await getMergeConfidenceLevel(\n datasource,\n packageName,\n currentVersion,\n newVersion,\n updateType,\n )) ?? 'neutral';\n if (satisfiesConfidenceLevel(confidence, minimumConfidence)) {\n config.confidenceStatus = 'green';\n } else {\n logger.debug(\n { depName, confidence, minimumConfidence },\n 'Update does not meet minimum confidence scores',\n );\n config.confidenceStatus = 'yellow';\n continue;\n }\n }\n }\n\n if (depNamesWithoutReleaseTimestamp['timestamp-required'].length) {\n logger.once.debug(\n { updates: depNamesWithoutReleaseTimestamp['timestamp-required'] },\n `Marking ${depNamesWithoutReleaseTimestamp['timestamp-required'].length} release(s) as pending, as they do not have a releaseTimestamp and we're running with minimumReleaseAgeBehaviour=timestamp-required`,\n );\n }\n if (depNamesWithoutReleaseTimestamp['timestamp-optional'].length) {\n logger.once.warn(\n \"Some upgrade(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding. See debug logs for more information\",\n );\n logger.once.debug(\n { updates: depNamesWithoutReleaseTimestamp['timestamp-optional'] },\n `${depNamesWithoutReleaseTimestamp['timestamp-optional'].length} upgrade(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding`,\n );\n }\n\n // Don't create a branch if we know it will be status 'pending'\n if (\n !dependencyDashboardCheck &&\n !branchExists &&\n config.stabilityStatus === 'yellow' &&\n ['not-pending', 'status-success'].includes(config.prCreation!)\n ) {\n logger.debug(\n 'Skipping branch creation due to internal status checks not met',\n );\n return {\n branchExists,\n result: 'pending',\n };\n }\n }\n\n let userRebaseRequested =\n dependencyDashboardCheck === 'rebase' ||\n !!config.dependencyDashboardRebaseAllOpen ||\n !!config.rebaseRequested;\n const userApproveAllPendingPR = !!config.dependencyDashboardAllPending;\n const userOpenAllRateLimtedPR = !!config.dependencyDashboardAllRateLimited;\n const userOpenAllSchedulePendingPR =\n !!config.dependencyDashboardAllAwaitingSchedule;\n\n if (forceRebase) {\n logger.debug('Force rebase because branch needs updating');\n config.reuseExistingBranch = false;\n } else if (userRebaseRequested) {\n logger.debug('User has requested rebase');\n config.reuseExistingBranch = false;\n } else if (dependencyDashboardCheck === 'global-config') {\n logger.debug(`Manual create/rebase requested via checkedBranches`);\n config.reuseExistingBranch = false;\n userRebaseRequested = true;\n } else if (userApproveAllPendingPR) {\n logger.debug(\n 'A user manually approved all pending PRs via the Dependency Dashboard.',\n );\n } else if (userOpenAllRateLimtedPR) {\n logger.debug(\n 'A user manually approved all rate-limited PRs via the Dependency Dashboard.',\n );\n } else if (userOpenAllSchedulePendingPR) {\n logger.debug(\n 'A user manually requested all awaiting schedule PRs via the Dependency Dashboard.',\n );\n } else if (\n branchExists &&\n config.rebaseWhen === 'never' &&\n !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel)) &&\n !dependencyDashboardCheck\n ) {\n logger.debug('rebaseWhen=never so skipping branch update check');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'no-work',\n };\n }\n // if the base branch has been changed by user in renovate config, rebase onto the new baseBranch\n // we have already confirmed earlier that branch isn't modified, so its safe to use targetBranch here\n else if (\n branchPr?.targetBranch &&\n branchPr.targetBranch !== config.baseBranch\n ) {\n logger.debug(\n 'Base branch changed by user, rebasing the branch onto new base',\n );\n config.reuseExistingBranch = false;\n } else if (config.cacheFingerprintMatch === 'no-match') {\n logger.debug(\n 'Cache fingerprint does not match, cannot reuse existing branch',\n );\n config.reuseExistingBranch = false;\n } else {\n config = await shouldReuseExistingBranch(config);\n }\n // TODO: types (#22198)\n logger.debug(`Using reuseExistingBranch: ${config.reuseExistingBranch!}`);\n if (!(\n config.reuseExistingBranch && config.cacheFingerprintMatch === 'matched'\n )) {\n await scm.checkoutBranch(config.baseBranch);\n const res = await getUpdatedPackageFiles(config);\n if (res.artifactErrors && config.artifactErrors) {\n res.artifactErrors = config.artifactErrors.concat(res.artifactErrors);\n }\n config = { ...config, ...res };\n if (config.updatedPackageFiles?.length) {\n logger.debug(\n `Updated ${config.updatedPackageFiles.length} package files`,\n );\n if (config.reuseExistingBranch && !forceRebase) {\n logger.debug(\n 'Existing branch needs updating. Restarting processBranch() with a clean branch',\n );\n return processBranch(branchConfig, true);\n }\n } else {\n logger.debug('No package files need updating');\n }\n const additionalFiles = await getAdditionalFiles(\n config,\n branchConfig.packageFiles!,\n );\n config.artifactErrors = coerceArray(config.artifactErrors).concat(\n additionalFiles.artifactErrors,\n );\n config.artifactNotices = coerceArray(config.artifactNotices).concat(\n coerceArray(additionalFiles.artifactNotices),\n );\n config.updatedArtifacts = coerceArray(config.updatedArtifacts).concat(\n additionalFiles.updatedArtifacts,\n );\n // `gh actions-lock` rewrites the whole lockfile from the workflows on disk, so like the lock files above it runs once here, after every updated package file has been written, rather than per package file.\n const actionsLockfile = await updateActionsLockfile(\n config,\n branchConfig.packageFiles,\n );\n config.artifactErrors = config.artifactErrors.concat(\n actionsLockfile.artifactErrors,\n );\n config.updatedArtifacts = config.updatedArtifacts.concat(\n actionsLockfile.updatedArtifacts,\n );\n if (config.updatedArtifacts?.length) {\n logger.debug(\n {\n updatedArtifacts: config.updatedArtifacts.map((f) =>\n f.type === 'deletion' ? `${f.path} (delete)` : f.path,\n ),\n },\n `Updated ${config.updatedArtifacts.length} lock files`,\n );\n if (config.reuseExistingBranch && !forceRebase) {\n logger.debug(\n 'Existing branch needs updating. Restarting processBranch() with a clean branch',\n );\n return processBranch(branchConfig, true);\n }\n } else {\n logger.debug('No updated lock files in branch');\n }\n\n await embedChangelogs({\n upgrades: config.upgrades,\n stage: 'branch',\n });\n\n const postUpgradeCommandResults =\n await executePostUpgradeCommands(config);\n\n if (postUpgradeCommandResults !== null) {\n const { updatedArtifacts, artifactErrors } = postUpgradeCommandResults;\n config.updatedArtifacts = updatedArtifacts;\n config.artifactErrors = artifactErrors;\n }\n\n // modifies the file changes in place to allow having a version bump in a packageFile or artifact\n await bumpVersions(config);\n\n removeMeta(['dep']);\n\n if (config.artifactErrors?.length) {\n if (config.releaseTimestamp) {\n logger.debug(`Branch timestamp: ${config.releaseTimestamp}`);\n const releaseTimestamp = DateTime.fromISO(config.releaseTimestamp);\n if (releaseTimestamp.plus({ hours: 2 }) < DateTime.local()) {\n logger.debug(\n 'PR is older than 2 hours, raise PR with lock file errors',\n );\n } else if (branchExists) {\n logger.debug(\n 'PR is less than 2 hours old but branchExists so updating anyway',\n );\n } else {\n logger.debug(\n 'PR is less than 2 hours old - raise error instead of PR',\n );\n throw new Error(MANAGER_LOCKFILE_ERROR);\n }\n } else {\n logger.debug('PR has no releaseTimestamp');\n }\n } else if (config.updatedArtifacts?.length && branchPr) {\n // If there are artifacts, no errors, and an existing PR then ensure any artifacts error comment is removed\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure comment removal in PR #${branchPr.number}`,\n );\n } else {\n // Remove artifacts error comment only if this run has successfully updated artifacts\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: artifactErrorTopic,\n });\n\n // v8 ignore else -- TODO: add test #40625\n if (!config.artifactNotices?.length) {\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: artifactNoticeTopic,\n });\n }\n }\n }\n const forcedManually = userRebaseRequested || !branchExists;\n\n config.isConflicted ??=\n branchExists &&\n (await scm.isBranchConflicted(config.baseBranch, config.branchName));\n config.forceCommit = forcedManually || config.isConflicted;\n\n // compile commit message with body, which maybe needs changelogs\n if (config.commitBody) {\n // changelog is on first upgrade\n const commitBody = template.compile(config.commitBody, {\n ...config,\n logJSON: config.upgrades[0].logJSON,\n releases: config.upgrades[0].releases,\n });\n config.commitMessage = `${config.commitMessage!}\\n\\n${withoutUrlCredentials(commitBody)}`;\n\n logger.trace(`commitMessage: ${JSON.stringify(config.commitMessage)}`);\n }\n\n if (config.commitTrailers) {\n // Template expansions can produce broken trailers\n config.commitTrailers = filterValidCommitTrailers(\n config.commitTrailers.map((trailer) =>\n withoutUrlCredentials(template.compile(trailer, config)),\n ),\n );\n logger.trace(\n `commitTrailers: ${JSON.stringify(config.commitTrailers)}`,\n );\n }\n\n commitSha = await commitFilesToBranch(config);\n // Checkout to base branch to ensure that the next branch processing always starts with git being on the baseBranch\n // baseBranch is not checked out at the start of processBranch() due to pull/16246\n await scm.checkoutBranch(config.baseBranch);\n updatesVerified = true;\n\n // only update artifact status if branch was updated\n // also do before platform automerge reattempt\n if (commitSha) {\n await setArtifactErrorStatus(config);\n }\n\n // a requested rebase has now been applied, so any comment explaining why we'd skipped it no longer applies\n if (commitSha && branchPr && config.rebaseRequested) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure pending rebase comment removal in PR #${branchPr.number}`,\n );\n } else {\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: pendingRebaseTopic,\n });\n }\n }\n }\n\n if (branchPr) {\n const platformPrOptions = getPlatformPrOptions(config);\n if (\n commitSha &&\n platformPrOptions.usePlatformAutomerge &&\n platform.reattemptPlatformAutomerge\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would reattempt platform automerge for PR #${branchPr.number}`,\n );\n } else {\n await platform.reattemptPlatformAutomerge({\n number: branchPr.number,\n platformPrOptions,\n });\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (platform.refreshPr) {\n await platform.refreshPr(branchPr.number);\n }\n }\n if (!commitSha && !branchExists) {\n return {\n branchExists,\n result: 'no-work',\n };\n }\n if (commitSha) {\n const action = branchExists ? 'updated' : 'created';\n logger.info({ commitSha }, `Branch ${action}`);\n }\n await setBranchStatusChecks(config);\n // new commit means status check are pretty sure pending but maybe not reported yet\n // if PR has not been created + new commit + prCreation !== immediate skip\n // but do not break when there are artifact errors\n if (\n !branchPr &&\n !config.artifactErrors?.length &&\n !userRebaseRequested &&\n commitSha &&\n config.prCreation !== 'immediate'\n ) {\n logger.debug(`Branch status pending, current sha: ${commitSha}`);\n return {\n branchExists: true,\n updatesVerified,\n result: 'pending',\n commitSha,\n };\n }\n\n // Try to automerge branch and finish if successful, but only if branch already existed before this run\n // skip if we have a non-immediate pr and there is an existing PR,\n // we want to update the PR and skip the Auto merge since status checks aren't done yet\n if (!config.artifactErrors?.length && (!commitSha || config.ignoreTests)) {\n const mergeStatus = await tryBranchAutomerge(config);\n logger.debug(`mergeStatus=${mergeStatus}`);\n if (mergeStatus === 'automerged') {\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would delete branch${config.branchName}`);\n } else {\n await deleteBranchSilently(config.branchName);\n }\n logger.debug('Branch is automerged - returning');\n return { branchExists: false, result: 'automerged' };\n }\n if (mergeStatus === 'off schedule') {\n if (userRebaseRequested) {\n config.forcePr = true;\n } else {\n logger.debug(\n 'Branch cannot automerge now because automergeSchedule is off schedule - skipping',\n );\n return {\n branchExists,\n result: 'not-scheduled',\n commitSha,\n };\n }\n }\n if (\n mergeStatus === 'stale' &&\n ['conflicted', 'never'].includes(config.rebaseWhen!) &&\n /* v8 ignore next -- needs test */\n !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel))\n ) {\n logger.warn(\n 'Branch cannot automerge because it is behind base branch and rebaseWhen setting disallows rebasing - raising a PR instead',\n );\n config.forcePr = true;\n config.branchAutomergeFailureMessage = mergeStatus;\n }\n if (\n mergeStatus === 'automerge aborted - merge queue' ||\n mergeStatus === 'automerge aborted - PR exists' ||\n mergeStatus === 'branch status error' ||\n mergeStatus === 'failed'\n ) {\n logger.debug(\n `Branch automerge not possible, mergeStatus:${mergeStatus}`,\n );\n config.forcePr = true;\n config.branchAutomergeFailureMessage = mergeStatus;\n }\n }\n } catch (err) {\n /* v8 ignore if -- needs test */\n if (err.statusCode === 404) {\n logger.debug({ err }, 'Received a 404 error - aborting run');\n throw new Error(REPOSITORY_CHANGED);\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n logger.debug('Passing rate-limit-exceeded error up');\n throw err;\n }\n if (err.message === REPOSITORY_CHANGED) {\n logger.debug('Passing repository-changed error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message?.startsWith('remote: Invalid username or password')) {\n logger.debug('Throwing bad credentials');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n /* v8 ignore if -- needs test */\n if (\n err.message?.startsWith(\n 'ssh_exchange_identification: Connection closed by remote host',\n )\n ) {\n logger.debug('Throwing bad credentials');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_BAD_CREDENTIALS) {\n logger.debug('Passing bad-credentials error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_INTEGRATION_UNAUTHORIZED) {\n logger.debug('Passing integration-unauthorized error up');\n throw err;\n }\n if (err.message === MANAGER_LOCKFILE_ERROR) {\n logger.debug('Passing lockfile-error up');\n throw err;\n }\n if (err.message === PR_ALREADY_IN_MERGE_QUEUE) {\n logger.debug('Branch PR is in the merge queue - skipping branch update');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'done',\n commitSha,\n };\n }\n /* v8 ignore if -- needs test */\n if (err.message?.includes('space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n /* v8 ignore if -- needs test */\n if (err.message === SYSTEM_INSUFFICIENT_DISK_SPACE) {\n logger.debug('Passing disk-space error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message.startsWith('Resource not accessible by integration')) {\n logger.debug('Passing 403 error up');\n throw err;\n }\n /* v8 ignore next -- needs test */\n if (err.message === WORKER_FILE_UPDATE_FAILED) {\n logger.warn('Error updating branch: update failure');\n } else if (err.message.startsWith('bundler-')) {\n // we have already warned inside the bundler artifacts error handling, so just return\n return {\n branchExists: true,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'error',\n commitSha,\n };\n } else if (err.message?.includes('fatal: Authentication failed')) {\n throw new Error(PLATFORM_AUTHENTICATION_ERROR);\n } else if (err.message?.includes('fatal: bad revision')) {\n logger.debug({ err }, 'Aborting job due to bad revision error');\n throw new Error(REPOSITORY_CHANGED);\n } else if (err.message === CONFIG_VALIDATION) {\n logger.debug('Passing config validation error up');\n throw err;\n } else if (err.message === TEMPORARY_ERROR) {\n logger.debug('Passing TEMPORARY_ERROR error up');\n throw err;\n } else if (!(err instanceof ExternalHostError)) {\n logger.warn({ err }, `Error updating branch`);\n }\n // Don't throw here - we don't want to stop the other renovations\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'error',\n commitSha,\n };\n }\n try {\n logger.debug('Ensuring PR');\n logger.debug(\n `There are ${config.errors!.length} errors and ${\n config.warnings!.length\n } warnings`,\n );\n const ensurePrResult = await ensurePr(config);\n if (ensurePrResult.type === 'without-pr') {\n const { prBlockedBy } = ensurePrResult;\n branchPr = null;\n if (prBlockedBy === 'RateLimited' && !config.isVulnerabilityAlert) {\n logger.debug('Reached PR limit - skipping PR creation');\n return {\n branchExists,\n prBlockedBy,\n result: 'pr-limit-reached',\n commitSha,\n };\n }\n // TODO: ensurePr should check for automerge itself (#9719)\n if (prBlockedBy === 'NeedsApproval') {\n return {\n branchExists,\n prBlockedBy,\n result: 'needs-pr-approval',\n commitSha,\n };\n }\n if (prBlockedBy === 'AwaitingTests') {\n return {\n branchExists,\n prBlockedBy,\n result: 'pending',\n commitSha,\n };\n }\n if (prBlockedBy === 'BranchAutomerge') {\n return {\n branchExists,\n prBlockedBy,\n result: 'done',\n commitSha,\n };\n }\n if (prBlockedBy === 'Error') {\n return {\n branchExists,\n prBlockedBy,\n result: 'error',\n commitSha,\n };\n }\n logger.warn({ prBlockedBy }, 'Unknown PrBlockedBy result');\n return {\n branchExists,\n prBlockedBy,\n result: 'error',\n commitSha,\n };\n }\n // v8 ignore else -- TODO: add test #40625\n if (ensurePrResult.type === 'with-pr') {\n const { pr } = ensurePrResult;\n branchPr = pr;\n // Retry setting branch statuses after PR/MR creation so that\n // platforms using MR pipelines (e.g. GitLab) have a pipeline to\n // associate the status with. The earlier call may have been\n // skipped if no pipeline existed yet.\n await setBranchStatusChecks(config);\n\n // only update artifact status if branch was updated\n if (commitSha) {\n await setArtifactErrorStatus(config);\n }\n if (config.artifactErrors?.length) {\n logger.warn(\n { artifactErrors: config.artifactErrors },\n 'artifactErrors',\n );\n let content = `Renovate failed to update `;\n content +=\n config.artifactErrors.length > 1 ? 'artifacts' : 'an artifact';\n content += ' related to this branch. ';\n content += template.compile(\n config.userStrings!.artifactErrorWarning,\n config,\n );\n content += emojify(\n `\\n\\n:recycle: Renovate will retry this branch, including artifacts, only when one of the following happens:\\n\\n`,\n );\n content +=\n ' - any of the package files in this branch needs updating, or \\n';\n content += ' - the branch becomes conflicted, or\\n';\n content +=\n ' - you click the rebase/retry checkbox if found above, or\\n';\n content +=\n ' - you rename this PR\\'s title to start with \"rebase!\" to trigger it manually';\n content += '\\n\\nThe artifact failure details are included below:\\n\\n';\n // TODO: types (#22198)\n config.artifactErrors.forEach((error) => {\n content += `##### File name: ${error.fileName!}\\n\\n`;\n content += `\\`\\`\\`\\n${error.stderr!}\\n\\`\\`\\`\\n\\n`;\n });\n content = platform.massageMarkdown(content, config.rebaseLabel);\n // v8 ignore else -- TODO: add test #40625\n if (!(\n config.suppressNotifications!.includes('artifactErrors') ||\n config.suppressNotifications!.includes('lockFileErrors')\n )) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure lock file error comment in PR #${pr.number}`,\n );\n } else {\n await ensureComment({\n number: pr.number,\n topic: artifactErrorTopic,\n content,\n });\n }\n }\n } else {\n if (config.artifactNotices?.length) {\n const contentLines: string[] = [];\n for (const notice of config.artifactNotices) {\n contentLines.push(`##### File name: ${notice.file}`);\n contentLines.push(notice.message);\n }\n const content = contentLines.join('\\n\\n');\n await ensureComment({\n number: pr.number,\n topic: artifactNoticeTopic,\n content,\n });\n }\n\n if (config.automerge) {\n logger.debug('PR is configured for automerge');\n // skip automerge if there is a new commit since status checks aren't done yet\n // v8 ignore else -- TODO: add test #40625\n if (config.ignoreTests === true || !commitSha) {\n logger.debug('checking auto-merge');\n const prAutomergeResult = await checkAutoMerge(pr, config);\n if (prAutomergeResult?.automerged) {\n return {\n branchExists,\n result: 'automerged',\n commitSha,\n };\n }\n }\n } else {\n logger.debug('PR is not configured for automerge');\n }\n }\n }\n } catch (err) {\n /* v8 ignore if -- needs test */\n if (\n err instanceof ExternalHostError ||\n [PLATFORM_RATE_LIMIT_EXCEEDED, REPOSITORY_CHANGED].includes(err.message)\n ) {\n logger.debug('Passing PR error up');\n throw err;\n }\n // Otherwise don't throw here - we don't want to stop the other renovations\n logger.error({ err }, `Error ensuring PR`);\n }\n if (!branchExists) {\n return {\n branchExists: true,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'pr-created',\n commitSha,\n };\n }\n return {\n branchExists,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'done',\n commitSha,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["template.compile"],"sources":["../../../../../lib/workers/repository/update/branch/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type MinimumReleaseAgeBehaviour,\n type RenovateConfig,\n type UpdateType,\n} from '../../../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n MANAGER_LOCKFILE_ERROR,\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n PR_ALREADY_IN_MERGE_QUEUE,\n REPOSITORY_CHANGED,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n WORKER_FILE_UPDATE_FAILED,\n} from '../../../../constants/error-messages.ts';\nimport { logger, removeMeta } from '../../../../logger/index.ts';\nimport { updateActionsLockfile } from '../../../../modules/manager/github-actions/artifacts.ts';\nimport { enforcesMinimumReleaseAge } from '../../../../modules/manager/index.ts';\nimport { getAdditionalFiles } from '../../../../modules/manager/npm/post-update/index.ts';\nimport {\n ensureComment,\n ensureCommentRemoval,\n} from '../../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { getElapsedMs } from '../../../../util/date.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { filterValidCommitTrailers } from '../../../../util/git/commit-trailers.ts';\nimport {\n getMergeConfidenceLevel,\n isActiveConfidenceLevel,\n satisfiesConfidenceLevel,\n} from '../../../../util/merge-confidence/index.ts';\nimport { calculateMinimumReleaseAgeMs } from '../../../../util/minimum-release-age.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport { withoutUrlCredentials } from '../../../../util/url.ts';\nimport { getCount, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchResult,\n BranchUpgradeConfig,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { checkAutoMerge } from '../pr/automerge.ts';\nimport { ensurePr, getPlatformPrOptions } from '../pr/index.ts';\nimport { setArtifactErrorStatus } from './artifacts.ts';\nimport { tryBranchAutomerge } from './automerge.ts';\nimport { bumpVersions } from './bump-versions.ts';\nimport { prAlreadyExisted } from './check-existing.ts';\nimport { commitFilesToBranch } from './commit.ts';\nimport executePostUpgradeCommands from './execute-post-upgrade-commands.ts';\nimport { getUpdatedPackageFiles } from './get-updated.ts';\nimport { handleClosedPr, handleModifiedPr } from './handle-existing.ts';\nimport { shouldReuseExistingBranch } from './reuse.ts';\nimport { isScheduledNow } from './schedule.ts';\nimport { setConfidence, setStability } from './status-checks.ts';\n\nasync function setBranchStatusChecks(config: BranchConfig): Promise<void> {\n await setStability(config);\n await setConfidence(config);\n}\n\nasync function rebaseCheck(\n config: RenovateConfig,\n branchPr: Pr,\n): Promise<boolean> {\n const titleRebase = branchPr.title?.startsWith('rebase!');\n if (titleRebase) {\n logger.debug(\n `Manual rebase requested via PR title for #${branchPr.number}`,\n );\n return true;\n }\n const labelRebase = !!branchPr.labels?.includes(config.rebaseLabel!);\n if (labelRebase) {\n logger.debug(\n `Manual rebase requested via PR labels for #${branchPr.number}`,\n );\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would delete label ${config.rebaseLabel!} from #${\n branchPr.number\n }`,\n );\n } else {\n await platform.deleteLabel(branchPr.number, config.rebaseLabel!);\n }\n return true;\n }\n const prRebaseChecked = !!branchPr.bodyStruct?.rebaseRequested;\n if (prRebaseChecked) {\n logger.debug(\n `Manual rebase requested via PR checkbox for #${branchPr.number}`,\n );\n return true;\n }\n\n return false;\n}\n\nasync function deleteBranchSilently(branchName: string): Promise<void> {\n try {\n await scm.deleteBranch(branchName);\n } catch (err) {\n /* v8 ignore next -- needs test */\n logger.debug({ branchName, err }, 'Branch auto-remove failed');\n }\n}\n\n/**\n * The minimum release age which Renovate has to check for `upgrade`, which is\n * `0` for lock file maintenance if the package manager enforces it itself.\n */\nasync function getMinimumReleaseAgeMsToCheck(\n upgrade: BranchUpgradeConfig,\n): Promise<number> {\n const minimumReleaseAgeMs = calculateMinimumReleaseAgeMs(upgrade);\n if (!minimumReleaseAgeMs || !upgrade.isLockFileMaintenance) {\n return minimumReleaseAgeMs;\n }\n if (!(await enforcesMinimumReleaseAge(upgrade.manager, upgrade))) {\n return minimumReleaseAgeMs;\n }\n logger.debug(\n `Lock file maintenance of ${upgrade.packageFile}: the package manager enforces the minimum release age`,\n );\n return 0;\n}\n\nfunction userChangedTargetBranch(pr: Pr): boolean {\n const oldTargetBranch = pr.bodyStruct?.debugData?.targetBranch;\n if (oldTargetBranch && pr.targetBranch) {\n return pr.targetBranch !== oldTargetBranch;\n }\n return false;\n}\n\nexport interface ProcessBranchResult {\n branchExists: boolean;\n updatesVerified?: boolean;\n prBlockedBy?: PrBlockedBy;\n prNo?: number;\n result: BranchResult;\n commitSha?: string | null;\n}\n\nexport async function processBranch(\n branchConfig: BranchConfig,\n forceRebase = false,\n): Promise<ProcessBranchResult> {\n let commitSha: string | null = null;\n let config: BranchConfig = { ...branchConfig };\n logger.trace({ config }, 'processBranch()');\n let branchExists = await scm.branchExists(config.branchName);\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n // Only allow a branch to be recreated with updates that are `pending` if we've explicitly constented with an `unpend` on the Dependency Dashboard, or when using `checkedBranches`\n const unpendRequested =\n dependencyDashboardCheck === 'unpend' ||\n dependencyDashboardCheck === 'global-config';\n let updatesVerified = false;\n if (!branchExists && config.branchPrefix !== config.branchPrefixOld) {\n const branchName = config.branchName.replace(\n config.branchPrefix!,\n config.branchPrefixOld!,\n );\n branchExists = await scm.branchExists(branchName);\n // v8 ignore else -- TODO: add test #40625\n if (branchExists) {\n config.branchName = branchName;\n logger.debug('Found existing branch with branchPrefixOld');\n }\n }\n\n if (\n !branchExists &&\n branchConfig.minimumGroupSize &&\n branchConfig.minimumGroupSize > branchConfig.upgrades.length &&\n !dependencyDashboardCheck\n ) {\n logger.debug(\n `Skipping branch creation as minimumGroupSize: ${branchConfig.minimumGroupSize} is not met`,\n );\n return {\n branchExists: false,\n result: 'minimum-group-size-not-met',\n };\n }\n\n let branchPr = await platform.getBranchPr(\n config.branchName,\n config.baseBranch,\n );\n logger.debug(`branchExists=${branchExists}`);\n logger.debug(`dependencyDashboardCheck=${dependencyDashboardCheck!}`);\n if (branchPr) {\n config.rebaseRequested = await rebaseCheck(config, branchPr);\n logger.debug(`PR rebase requested=${config.rebaseRequested}`);\n }\n const keepUpdatedLabel = config.keepUpdatedLabel;\n const pendingRebaseTopic = emojify(':warning: Rebase not applied');\n const artifactErrorTopic = emojify(':warning: Artifact update problem');\n const artifactNoticeTopic = emojify(\n ':information_source: Artifact update notice',\n );\n try {\n // Check if branch already existed\n const existingPr =\n !branchPr || config.automerge\n ? await prAlreadyExisted(config)\n : undefined;\n if (existingPr?.state === 'merged') {\n logger.debug(`Matching PR #${existingPr.number} was merged previously`);\n if (config.automerge) {\n logger.debug('Disabling automerge because PR was merged previously');\n config.automerge = false;\n config.automergedPreviously = true;\n }\n } else if (!branchPr && existingPr && !dependencyDashboardCheck) {\n logger.debug(\n { prTitle: config.prTitle },\n `Closed PR #${existingPr.number} already exists. Skipping branch.`,\n );\n await handleClosedPr(config, existingPr);\n return {\n branchExists: false,\n prNo: existingPr.number,\n result: 'already-existed',\n };\n }\n if (!branchExists && branchConfig.pendingChecks && !unpendRequested) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because internalChecksFilter was not met`,\n );\n return {\n branchExists: false,\n result: 'pending',\n };\n }\n if (!branchExists) {\n if (config.mode === 'silent' && !dependencyDashboardCheck) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because mode=silent`,\n );\n return {\n branchExists,\n result: 'needs-approval',\n };\n }\n if (config.dependencyDashboardApproval && !dependencyDashboardCheck) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because dependencyDashboardApproval=true`,\n );\n return {\n branchExists,\n result: 'needs-approval',\n };\n }\n }\n\n logger.debug(\n `Open PR Count: ${getCount('ConcurrentPRs')}, Existing Branch Count: ${getCount('Branches')}, Hourly PR Count: ${getCount('HourlyPRs')}, Hourly Commit Count: ${getCount('HourlyCommits')}`,\n );\n\n // for a vulnerability alert this checks the VulnerabilityBranches count\n if (\n !branchExists &&\n isLimitReached('Branches', branchConfig) &&\n !dependencyDashboardCheck\n ) {\n logger.debug('Reached branch limit - skipping branch creation');\n return {\n branchExists,\n result: 'branch-limit-reached',\n };\n }\n if (\n !config.rebaseRequested &&\n isLimitReached('Commits') &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached commits per run limit - skipping branch');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'commit-per-run-limit-reached',\n };\n }\n if (\n !config.rebaseRequested &&\n isLimitReached('HourlyCommits', branchConfig) &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached hourly commits limit - skipping branch');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'commit-hourly-limit-reached',\n };\n }\n if (branchExists) {\n // check if branch is labelled to stop\n config.stopUpdating = branchPr?.labels?.includes(\n config.stopUpdatingLabel!,\n );\n\n const prRebaseChecked = !!branchPr?.bodyStruct?.rebaseRequested;\n\n if (\n !dependencyDashboardCheck &&\n !prRebaseChecked &&\n config.stopUpdating\n ) {\n logger.info(\n 'Branch updating is skipped because stopUpdatingLabel is present in config',\n );\n return {\n branchExists: true,\n prNo: branchPr?.number,\n result: 'no-work',\n };\n }\n\n // A rebase or retry request is not consent to add an upgrade which has not met its internal checks, so only an unpend of this branch may override this\n if (!unpendRequested && config.pendingChecks) {\n if (config.rebaseRequested) {\n logger.info(\n 'Branch updating is skipped because internalChecksFilter was not met, despite the requested rebase',\n );\n if (branchPr) {\n const content =\n 'This branch has not been rebased, as its update has not yet met the internal checks configured for it, such as `minimumReleaseAge`. Rebasing it now would add a dependency version which is still within its configured observation period.\\n\\nRenovate will rebase this branch once its update has met those checks.';\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure pending rebase comment in PR #${branchPr.number}`,\n );\n } else {\n await ensureComment({\n number: branchPr.number,\n topic: pendingRebaseTopic,\n content,\n });\n }\n }\n } else {\n logger.info(\n 'Branch updating is skipped because internalChecksFilter was not met',\n );\n }\n return {\n branchExists: true,\n prNo: branchPr?.number,\n result: 'pending',\n };\n }\n\n logger.debug('Checking if PR has been edited');\n const branchIsModified = await scm.isBranchModified(\n config.branchName,\n config.baseBranch,\n );\n if (branchPr) {\n logger.debug(`Found existing branch PR #${branchPr.number}`);\n if (branchPr.state !== 'open') {\n logger.debug(\n 'PR has been closed or merged since this run started - aborting',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n if (branchIsModified || userChangedTargetBranch(branchPr)) {\n logger.debug(`PR has been edited, PrNo:${branchPr.number}`);\n await handleModifiedPr(config, branchPr);\n if (!(!!dependencyDashboardCheck || config.rebaseRequested)) {\n return {\n branchExists,\n prNo: branchPr.number,\n result: 'pr-edited',\n };\n }\n }\n } else if (branchIsModified && !dependencyDashboardCheck) {\n const oldPr = await platform.findPr({\n branchName: config.branchName,\n state: '!open',\n targetBranch: config.baseBranch,\n });\n if (!oldPr) {\n logger.debug('Branch has been edited but found no PR - skipping');\n return {\n branchExists,\n result: 'pr-edited',\n };\n }\n const branchSha = await scm.getBranchCommit(config.branchName);\n const oldPrSha = oldPr?.sha;\n if (!oldPrSha || oldPrSha === branchSha) {\n logger.debug(\n { oldPrNumber: oldPr.number, oldPrSha, branchSha },\n 'Found old PR matching this branch - will override it',\n );\n } else {\n logger.debug(\n { oldPrNumber: oldPr.number, oldPrSha, branchSha },\n 'Found old PR but the SHA is different',\n );\n return {\n branchExists,\n result: 'pr-edited',\n };\n }\n }\n }\n\n // Check schedule\n config.isScheduledNow = isScheduledNow(config, 'schedule');\n if (!config.isScheduledNow && !dependencyDashboardCheck) {\n if (!branchExists) {\n logger.debug('Skipping branch creation as not within schedule');\n return {\n branchExists,\n result: 'not-scheduled',\n };\n }\n if (config.updateNotScheduled === false && !config.rebaseRequested) {\n logger.debug('Skipping branch update as not within schedule');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'update-not-scheduled',\n };\n }\n if (\n !branchPr &&\n !(config.automerge && config.automergeType === 'branch') // if branch is configured for automerge there's no need for a PR\n ) {\n logger.debug('Skipping PR creation out of schedule');\n return {\n branchExists,\n result: 'not-scheduled',\n };\n }\n logger.debug(\n 'Branch + PR exists but is not scheduled -- will update if necessary',\n );\n }\n //stability checks\n if (\n config.upgrades.some(\n (upgrade) =>\n isNonEmptyString(upgrade.minimumReleaseAge) ||\n isNonEmptyString(upgrade.minimumReleaseAgeExtracted) ||\n isActiveConfidenceLevel(upgrade.minimumConfidence!),\n )\n ) {\n const depNamesWithoutReleaseTimestamp: Record<\n MinimumReleaseAgeBehaviour,\n {\n depName: string;\n updateType: UpdateType;\n }[]\n > = {\n 'timestamp-required': [],\n 'timestamp-optional': [],\n };\n\n // Only set a stability status check if one or more of the updates contain\n // both a minimumReleaseAge setting and a releaseTimestamp\n config.stabilityStatus = 'green';\n // Default to 'success' but set 'pending' if any update is pending\n for (const upgrade of config.upgrades) {\n const minimumReleaseAgeMs =\n await getMinimumReleaseAgeMsToCheck(upgrade);\n\n if (minimumReleaseAgeMs) {\n const minimumReleaseAgeBehaviour: MinimumReleaseAgeBehaviour =\n upgrade.minimumReleaseAgeBehaviour ?? 'timestamp-required';\n\n // regardless of the value of `minimumReleaseAgeBehaviour`, if there is a timestamp, we will process it according to `minimumReleaseAge`\n if (upgrade.releaseTimestamp) {\n const timeElapsed = getElapsedMs(upgrade.releaseTimestamp);\n if (timeElapsed < minimumReleaseAgeMs) {\n logger.debug(\n {\n depName: upgrade.depName,\n timeElapsed,\n minimumReleaseAge: upgrade.minimumReleaseAge,\n },\n 'Update has not passed minimum release age',\n );\n config.stabilityStatus = 'yellow';\n continue;\n }\n } else {\n // if we're set to `minimumReleaseAgeBehaviour=timestamp-required`, and there isn't a timestamp, always mark the update as pending\n if (minimumReleaseAgeBehaviour === 'timestamp-required') {\n depNamesWithoutReleaseTimestamp['timestamp-required'].push({\n depName: upgrade.depName!,\n updateType: upgrade.updateType!,\n });\n config.stabilityStatus = 'yellow';\n continue;\n } else {\n // if there is no timestamp, and we're running in `optional` mode, we can allow it, but make sure to warn the user\n depNamesWithoutReleaseTimestamp['timestamp-optional'].push({\n depName: upgrade.depName!,\n updateType: upgrade.updateType!,\n });\n }\n }\n }\n const datasource = upgrade.datasource!;\n const depName = upgrade.depName!;\n const packageName = upgrade.packageName!;\n const minimumConfidence = upgrade.minimumConfidence!;\n const updateType = upgrade.updateType!;\n const currentVersion = upgrade.currentVersion!;\n const newVersion = upgrade.newVersion!;\n if (isActiveConfidenceLevel(minimumConfidence)) {\n const confidence =\n (await getMergeConfidenceLevel(\n datasource,\n packageName,\n currentVersion,\n newVersion,\n updateType,\n )) ?? 'neutral';\n if (satisfiesConfidenceLevel(confidence, minimumConfidence)) {\n config.confidenceStatus = 'green';\n } else {\n logger.debug(\n { depName, confidence, minimumConfidence },\n 'Update does not meet minimum confidence scores',\n );\n config.confidenceStatus = 'yellow';\n continue;\n }\n }\n }\n\n if (depNamesWithoutReleaseTimestamp['timestamp-required'].length) {\n logger.once.debug(\n { updates: depNamesWithoutReleaseTimestamp['timestamp-required'] },\n `Marking ${depNamesWithoutReleaseTimestamp['timestamp-required'].length} release(s) as pending, as they do not have a releaseTimestamp and we're running with minimumReleaseAgeBehaviour=timestamp-required`,\n );\n }\n if (depNamesWithoutReleaseTimestamp['timestamp-optional'].length) {\n logger.once.warn(\n \"Some upgrade(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding. See debug logs for more information\",\n );\n logger.once.debug(\n { updates: depNamesWithoutReleaseTimestamp['timestamp-optional'] },\n `${depNamesWithoutReleaseTimestamp['timestamp-optional'].length} upgrade(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding`,\n );\n }\n\n // Don't create a branch if we know it will be status 'pending'\n if (\n !dependencyDashboardCheck &&\n !branchExists &&\n config.stabilityStatus === 'yellow' &&\n ['not-pending', 'status-success'].includes(config.prCreation!)\n ) {\n logger.debug(\n 'Skipping branch creation due to internal status checks not met',\n );\n return {\n branchExists,\n result: 'pending',\n };\n }\n }\n\n let userRebaseRequested =\n dependencyDashboardCheck === 'rebase' ||\n !!config.dependencyDashboardRebaseAllOpen ||\n !!config.rebaseRequested;\n const userApproveAllPendingPR = !!config.dependencyDashboardAllPending;\n const userOpenAllRateLimtedPR = !!config.dependencyDashboardAllRateLimited;\n const userOpenAllSchedulePendingPR =\n !!config.dependencyDashboardAllAwaitingSchedule;\n\n if (forceRebase) {\n logger.debug('Force rebase because branch needs updating');\n config.reuseExistingBranch = false;\n } else if (userRebaseRequested) {\n logger.debug('User has requested rebase');\n config.reuseExistingBranch = false;\n } else if (dependencyDashboardCheck === 'global-config') {\n logger.debug(`Manual create/rebase requested via checkedBranches`);\n config.reuseExistingBranch = false;\n userRebaseRequested = true;\n } else if (userApproveAllPendingPR) {\n logger.debug(\n 'A user manually approved all pending PRs via the Dependency Dashboard.',\n );\n } else if (userOpenAllRateLimtedPR) {\n logger.debug(\n 'A user manually approved all rate-limited PRs via the Dependency Dashboard.',\n );\n } else if (userOpenAllSchedulePendingPR) {\n logger.debug(\n 'A user manually requested all awaiting schedule PRs via the Dependency Dashboard.',\n );\n } else if (\n branchExists &&\n config.rebaseWhen === 'never' &&\n !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel)) &&\n !dependencyDashboardCheck\n ) {\n logger.debug('rebaseWhen=never so skipping branch update check');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'no-work',\n };\n }\n // if the base branch has been changed by user in renovate config, rebase onto the new baseBranch\n // we have already confirmed earlier that branch isn't modified, so its safe to use targetBranch here\n else if (\n branchPr?.targetBranch &&\n branchPr.targetBranch !== config.baseBranch\n ) {\n logger.debug(\n 'Base branch changed by user, rebasing the branch onto new base',\n );\n config.reuseExistingBranch = false;\n } else if (config.cacheFingerprintMatch === 'no-match') {\n logger.debug(\n 'Cache fingerprint does not match, cannot reuse existing branch',\n );\n config.reuseExistingBranch = false;\n } else {\n config = await shouldReuseExistingBranch(config);\n }\n // TODO: types (#22198)\n logger.debug(`Using reuseExistingBranch: ${config.reuseExistingBranch!}`);\n if (!(\n config.reuseExistingBranch && config.cacheFingerprintMatch === 'matched'\n )) {\n await scm.checkoutBranch(config.baseBranch);\n const res = await getUpdatedPackageFiles(config);\n if (res.artifactErrors && config.artifactErrors) {\n res.artifactErrors = config.artifactErrors.concat(res.artifactErrors);\n }\n config = { ...config, ...res };\n if (config.updatedPackageFiles?.length) {\n logger.debug(\n `Updated ${config.updatedPackageFiles.length} package files`,\n );\n if (config.reuseExistingBranch && !forceRebase) {\n logger.debug(\n 'Existing branch needs updating. Restarting processBranch() with a clean branch',\n );\n return processBranch(branchConfig, true);\n }\n } else {\n logger.debug('No package files need updating');\n }\n const additionalFiles = await getAdditionalFiles(\n config,\n branchConfig.packageFiles!,\n );\n config.artifactErrors = coerceArray(config.artifactErrors).concat(\n additionalFiles.artifactErrors,\n );\n config.artifactNotices = coerceArray(config.artifactNotices).concat(\n coerceArray(additionalFiles.artifactNotices),\n );\n config.updatedArtifacts = coerceArray(config.updatedArtifacts).concat(\n additionalFiles.updatedArtifacts,\n );\n // `gh actions-lock` rewrites the whole lockfile from the workflows on disk, so like the lock files above it runs once here, after every updated package file has been written, rather than per package file.\n const actionsLockfile = await updateActionsLockfile(\n config,\n branchConfig.packageFiles,\n );\n config.artifactErrors = config.artifactErrors.concat(\n actionsLockfile.artifactErrors,\n );\n config.updatedArtifacts = config.updatedArtifacts.concat(\n actionsLockfile.updatedArtifacts,\n );\n if (config.updatedArtifacts?.length) {\n logger.debug(\n {\n updatedArtifacts: config.updatedArtifacts.map((f) =>\n f.type === 'deletion' ? `${f.path} (delete)` : f.path,\n ),\n },\n `Updated ${config.updatedArtifacts.length} lock files`,\n );\n if (config.reuseExistingBranch && !forceRebase) {\n logger.debug(\n 'Existing branch needs updating. Restarting processBranch() with a clean branch',\n );\n return processBranch(branchConfig, true);\n }\n } else {\n logger.debug('No updated lock files in branch');\n }\n\n await embedChangelogs({\n upgrades: config.upgrades,\n stage: 'branch',\n });\n\n const postUpgradeCommandResults =\n await executePostUpgradeCommands(config);\n\n if (postUpgradeCommandResults !== null) {\n const { updatedArtifacts, artifactErrors } = postUpgradeCommandResults;\n config.updatedArtifacts = updatedArtifacts;\n config.artifactErrors = artifactErrors;\n }\n\n // modifies the file changes in place to allow having a version bump in a packageFile or artifact\n await bumpVersions(config);\n\n removeMeta(['dep']);\n\n if (config.artifactErrors?.length) {\n if (config.releaseTimestamp) {\n logger.debug(`Branch timestamp: ${config.releaseTimestamp}`);\n const releaseTimestamp = DateTime.fromISO(config.releaseTimestamp);\n if (releaseTimestamp.plus({ hours: 2 }) < DateTime.local()) {\n logger.debug(\n 'PR is older than 2 hours, raise PR with lock file errors',\n );\n } else if (branchExists) {\n logger.debug(\n 'PR is less than 2 hours old but branchExists so updating anyway',\n );\n } else {\n logger.debug(\n 'PR is less than 2 hours old - raise error instead of PR',\n );\n throw new Error(MANAGER_LOCKFILE_ERROR);\n }\n } else {\n logger.debug('PR has no releaseTimestamp');\n }\n } else if (config.updatedArtifacts?.length && branchPr) {\n // If there are artifacts, no errors, and an existing PR then ensure any artifacts error comment is removed\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure comment removal in PR #${branchPr.number}`,\n );\n } else {\n // Remove artifacts error comment only if this run has successfully updated artifacts\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: artifactErrorTopic,\n });\n\n // v8 ignore else -- TODO: add test #40625\n if (!config.artifactNotices?.length) {\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: artifactNoticeTopic,\n });\n }\n }\n }\n const forcedManually = userRebaseRequested || !branchExists;\n\n config.isConflicted ??=\n branchExists &&\n (await scm.isBranchConflicted(config.baseBranch, config.branchName));\n config.forceCommit = forcedManually || config.isConflicted;\n\n // compile commit message with body, which maybe needs changelogs\n if (config.commitBody) {\n // changelog is on first upgrade\n const commitBody = template.compile(config.commitBody, {\n ...config,\n logJSON: config.upgrades[0].logJSON,\n releases: config.upgrades[0].releases,\n });\n config.commitMessage = `${config.commitMessage!}\\n\\n${withoutUrlCredentials(commitBody)}`;\n\n logger.trace(`commitMessage: ${JSON.stringify(config.commitMessage)}`);\n }\n\n if (config.commitTrailers) {\n // Template expansions can produce broken trailers\n config.commitTrailers = filterValidCommitTrailers(\n config.commitTrailers.map((trailer) =>\n withoutUrlCredentials(template.compile(trailer, config)),\n ),\n );\n logger.trace(\n `commitTrailers: ${JSON.stringify(config.commitTrailers)}`,\n );\n }\n\n commitSha = await commitFilesToBranch(config);\n // Checkout to base branch to ensure that the next branch processing always starts with git being on the baseBranch\n // baseBranch is not checked out at the start of processBranch() due to pull/16246\n await scm.checkoutBranch(config.baseBranch);\n updatesVerified = true;\n\n // only update artifact status if branch was updated\n // also do before platform automerge reattempt\n if (commitSha) {\n await setArtifactErrorStatus(config);\n }\n\n // a requested rebase has now been applied, so any comment explaining why we'd skipped it no longer applies\n if (commitSha && branchPr && config.rebaseRequested) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure pending rebase comment removal in PR #${branchPr.number}`,\n );\n } else {\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: pendingRebaseTopic,\n });\n }\n }\n }\n\n if (branchPr) {\n const platformPrOptions = getPlatformPrOptions(config);\n if (\n commitSha &&\n platformPrOptions.usePlatformAutomerge &&\n platform.reattemptPlatformAutomerge\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would reattempt platform automerge for PR #${branchPr.number}`,\n );\n } else {\n await platform.reattemptPlatformAutomerge({\n number: branchPr.number,\n platformPrOptions,\n });\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (platform.refreshPr) {\n await platform.refreshPr(branchPr.number);\n }\n }\n if (!commitSha && !branchExists) {\n return {\n branchExists,\n result: 'no-work',\n };\n }\n if (commitSha) {\n const action = branchExists ? 'updated' : 'created';\n logger.info({ commitSha }, `Branch ${action}`);\n }\n await setBranchStatusChecks(config);\n // new commit means status check are pretty sure pending but maybe not reported yet\n // if PR has not been created + new commit + prCreation !== immediate skip\n // but do not break when there are artifact errors\n if (\n !branchPr &&\n !config.artifactErrors?.length &&\n !userRebaseRequested &&\n commitSha &&\n config.prCreation !== 'immediate'\n ) {\n logger.debug(`Branch status pending, current sha: ${commitSha}`);\n return {\n branchExists: true,\n updatesVerified,\n result: 'pending',\n commitSha,\n };\n }\n\n // Try to automerge branch and finish if successful, but only if branch already existed before this run\n // skip if we have a non-immediate pr and there is an existing PR,\n // we want to update the PR and skip the Auto merge since status checks aren't done yet\n if (!config.artifactErrors?.length && (!commitSha || config.ignoreTests)) {\n const mergeStatus = await tryBranchAutomerge(config);\n logger.debug(`mergeStatus=${mergeStatus}`);\n if (mergeStatus === 'automerged') {\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would delete branch${config.branchName}`);\n } else {\n await deleteBranchSilently(config.branchName);\n }\n logger.debug('Branch is automerged - returning');\n return { branchExists: false, result: 'automerged' };\n }\n if (mergeStatus === 'off schedule') {\n if (userRebaseRequested) {\n config.forcePr = true;\n } else {\n logger.debug(\n 'Branch cannot automerge now because automergeSchedule is off schedule - skipping',\n );\n return {\n branchExists,\n result: 'not-scheduled',\n commitSha,\n };\n }\n }\n if (\n mergeStatus === 'stale' &&\n ['conflicted', 'never'].includes(config.rebaseWhen!) &&\n /* v8 ignore next -- needs test */\n !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel))\n ) {\n logger.warn(\n 'Branch cannot automerge because it is behind base branch and rebaseWhen setting disallows rebasing - raising a PR instead',\n );\n config.forcePr = true;\n config.branchAutomergeFailureMessage = mergeStatus;\n }\n if (\n mergeStatus === 'automerge aborted - merge queue' ||\n mergeStatus === 'automerge aborted - PR exists' ||\n mergeStatus === 'branch status error' ||\n mergeStatus === 'failed'\n ) {\n logger.debug(\n `Branch automerge not possible, mergeStatus:${mergeStatus}`,\n );\n config.forcePr = true;\n config.branchAutomergeFailureMessage = mergeStatus;\n }\n }\n } catch (err) {\n /* v8 ignore if -- needs test */\n if (err.statusCode === 404) {\n logger.debug({ err }, 'Received a 404 error - aborting run');\n throw new Error(REPOSITORY_CHANGED);\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n logger.debug('Passing rate-limit-exceeded error up');\n throw err;\n }\n if (err.message === REPOSITORY_CHANGED) {\n logger.debug('Passing repository-changed error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message?.startsWith('remote: Invalid username or password')) {\n logger.debug('Throwing bad credentials');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n /* v8 ignore if -- needs test */\n if (\n err.message?.startsWith(\n 'ssh_exchange_identification: Connection closed by remote host',\n )\n ) {\n logger.debug('Throwing bad credentials');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_BAD_CREDENTIALS) {\n logger.debug('Passing bad-credentials error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_INTEGRATION_UNAUTHORIZED) {\n logger.debug('Passing integration-unauthorized error up');\n throw err;\n }\n if (err.message === MANAGER_LOCKFILE_ERROR) {\n logger.debug('Passing lockfile-error up');\n throw err;\n }\n if (err.message === PR_ALREADY_IN_MERGE_QUEUE) {\n logger.debug('Branch PR is in the merge queue - skipping branch update');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'done',\n commitSha,\n };\n }\n /* v8 ignore if -- needs test */\n if (err.message?.includes('space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n /* v8 ignore if -- needs test */\n if (err.message === SYSTEM_INSUFFICIENT_DISK_SPACE) {\n logger.debug('Passing disk-space error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message.startsWith('Resource not accessible by integration')) {\n logger.debug('Passing 403 error up');\n throw err;\n }\n /* v8 ignore next -- needs test */\n if (err.message === WORKER_FILE_UPDATE_FAILED) {\n logger.warn('Error updating branch: update failure');\n } else if (err.message.startsWith('bundler-')) {\n // we have already warned inside the bundler artifacts error handling, so just return\n return {\n branchExists: true,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'error',\n commitSha,\n };\n } else if (err.message?.includes('fatal: Authentication failed')) {\n throw new Error(PLATFORM_AUTHENTICATION_ERROR);\n } else if (err.message?.includes('fatal: bad revision')) {\n logger.debug({ err }, 'Aborting job due to bad revision error');\n throw new Error(REPOSITORY_CHANGED);\n } else if (err.message === CONFIG_VALIDATION) {\n logger.debug('Passing config validation error up');\n throw err;\n } else if (err.message === TEMPORARY_ERROR) {\n logger.debug('Passing TEMPORARY_ERROR error up');\n throw err;\n } else if (!(err instanceof ExternalHostError)) {\n logger.warn({ err }, `Error updating branch`);\n }\n // Don't throw here - we don't want to stop the other renovations\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'error',\n commitSha,\n };\n }\n try {\n logger.debug('Ensuring PR');\n logger.debug(\n `There are ${config.errors!.length} errors and ${\n config.warnings!.length\n } warnings`,\n );\n const ensurePrResult = await ensurePr(config);\n if (ensurePrResult.type === 'without-pr') {\n const { prBlockedBy } = ensurePrResult;\n branchPr = null;\n if (prBlockedBy === 'RateLimited' && !config.isVulnerabilityAlert) {\n logger.debug('Reached PR limit - skipping PR creation');\n return {\n branchExists,\n prBlockedBy,\n result: 'pr-limit-reached',\n commitSha,\n };\n }\n // TODO: ensurePr should check for automerge itself (#9719)\n if (prBlockedBy === 'NeedsApproval') {\n return {\n branchExists,\n prBlockedBy,\n result: 'needs-pr-approval',\n commitSha,\n };\n }\n if (prBlockedBy === 'AwaitingTests') {\n return {\n branchExists,\n prBlockedBy,\n result: 'pending',\n commitSha,\n };\n }\n if (prBlockedBy === 'BranchAutomerge') {\n return {\n branchExists,\n prBlockedBy,\n result: 'done',\n commitSha,\n };\n }\n if (prBlockedBy === 'Error') {\n return {\n branchExists,\n prBlockedBy,\n result: 'error',\n commitSha,\n };\n }\n logger.warn({ prBlockedBy }, 'Unknown PrBlockedBy result');\n return {\n branchExists,\n prBlockedBy,\n result: 'error',\n commitSha,\n };\n }\n // v8 ignore else -- TODO: add test #40625\n if (ensurePrResult.type === 'with-pr') {\n const { pr } = ensurePrResult;\n branchPr = pr;\n // Retry setting branch statuses after PR/MR creation so that\n // platforms using MR pipelines (e.g. GitLab) have a pipeline to\n // associate the status with. The earlier call may have been\n // skipped if no pipeline existed yet.\n await setBranchStatusChecks(config);\n\n // only update artifact status if branch was updated\n if (commitSha) {\n await setArtifactErrorStatus(config);\n }\n if (config.artifactErrors?.length) {\n logger.warn(\n { artifactErrors: config.artifactErrors },\n 'artifactErrors',\n );\n let content = `Renovate failed to update `;\n content +=\n config.artifactErrors.length > 1 ? 'artifacts' : 'an artifact';\n content += ' related to this branch. ';\n content += template.compile(\n config.userStrings!.artifactErrorWarning,\n config,\n );\n content += emojify(\n `\\n\\n:recycle: Renovate will retry this branch, including artifacts, only when one of the following happens:\\n\\n`,\n );\n content +=\n ' - any of the package files in this branch needs updating, or \\n';\n content += ' - the branch becomes conflicted, or\\n';\n content +=\n ' - you click the rebase/retry checkbox if found above, or\\n';\n content +=\n ' - you rename this PR\\'s title to start with \"rebase!\" to trigger it manually';\n content += '\\n\\nThe artifact failure details are included below:\\n\\n';\n // TODO: types (#22198)\n config.artifactErrors.forEach((error) => {\n content += `##### File name: ${error.fileName!}\\n\\n`;\n content += `\\`\\`\\`\\n${error.stderr!}\\n\\`\\`\\`\\n\\n`;\n });\n content = platform.massageMarkdown(content, config.rebaseLabel);\n // v8 ignore else -- TODO: add test #40625\n if (!(\n config.suppressNotifications!.includes('artifactErrors') ||\n config.suppressNotifications!.includes('lockFileErrors')\n )) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure lock file error comment in PR #${pr.number}`,\n );\n } else {\n await ensureComment({\n number: pr.number,\n topic: artifactErrorTopic,\n content,\n });\n }\n }\n } else {\n if (config.artifactNotices?.length) {\n const contentLines: string[] = [];\n for (const notice of config.artifactNotices) {\n contentLines.push(`##### File name: ${notice.file}`);\n contentLines.push(notice.message);\n }\n const content = contentLines.join('\\n\\n');\n await ensureComment({\n number: pr.number,\n topic: artifactNoticeTopic,\n content,\n });\n }\n\n if (config.automerge) {\n logger.debug('PR is configured for automerge');\n // skip automerge if there is a new commit since status checks aren't done yet\n // v8 ignore else -- TODO: add test #40625\n if (config.ignoreTests === true || !commitSha) {\n logger.debug('checking auto-merge');\n const prAutomergeResult = await checkAutoMerge(pr, config);\n if (prAutomergeResult?.automerged) {\n return {\n branchExists,\n result: 'automerged',\n commitSha,\n };\n }\n }\n } else {\n logger.debug('PR is not configured for automerge');\n }\n }\n }\n } catch (err) {\n /* v8 ignore if -- needs test */\n if (\n err instanceof ExternalHostError ||\n [PLATFORM_RATE_LIMIT_EXCEEDED, REPOSITORY_CHANGED].includes(err.message)\n ) {\n logger.debug('Passing PR error up');\n throw err;\n }\n // Otherwise don't throw here - we don't want to stop the other renovations\n logger.error({ err }, `Error ensuring PR`);\n }\n if (!branchExists) {\n return {\n branchExists: true,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'pr-created',\n commitSha,\n };\n }\n return {\n branchExists,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'done',\n commitSha,\n };\n}\n"],"mappings":"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"}
@@ -72,6 +72,7 @@ export interface BranchUpgradeConfig extends Merge<RenovateConfig, PackageDepend
72
72
  remediationNotPossible?: boolean;
73
73
  repoName?: string;
74
74
  minimumConfidence?: MergeConfidence | undefined;
75
+ minimumReleaseAgeExtracted?: string;
75
76
  sourceDirectory?: string;
76
77
  sourceRepoSlug?: string;
77
78
  toLowerCase?: boolean;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "44.196.0",
4
+ "version": "44.197.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -215,15 +215,14 @@
215
215
  "re2": "1.27.0"
216
216
  },
217
217
  "devDependencies": {
218
- "@biomejs/biome": "2.5.15",
218
+ "@biomejs/biome": "2.6.2",
219
219
  "@commander-js/extra-typings": "15.0.0",
220
220
  "@containerbase/istanbul-reports-html": "2.0.23",
221
221
  "@containerbase/semantic-release-pnpm": "1.4.3",
222
222
  "@hyrious/marshal": "0.3.4",
223
223
  "@ls-lint/ls-lint": "2.3.2",
224
224
  "@openpgp/web-stream-tools": "0.3.1",
225
- "@oxlint/plugins": "1.88.0",
226
- "@semantic-release/exec": "7.1.0",
225
+ "@oxlint/plugins": "1.89.0",
227
226
  "@smithy/util-stream": "4.8.2",
228
227
  "@types/aws4": "1.11.6",
229
228
  "@types/breejs__later": "4.1.5",
@@ -272,7 +271,7 @@
272
271
  "nock": "14.0.17",
273
272
  "npm-run-all2": "9.0.3",
274
273
  "nyc": "18.0.0",
275
- "oxlint": "1.88.0",
274
+ "oxlint": "1.89.0",
276
275
  "oxlint-tsgolint": "7.0.2004",
277
276
  "rimraf": "6.1.3",
278
277
  "semantic-release": "25.0.9",
@@ -332,8 +331,6 @@
332
331
  "prettier-fix": "PRETTIER_EXPERIMENTAL_CLI=1 prettier --write --cache '**/*.{ts,js,mjs,json,md,yml}'",
333
332
  "labels:check": "node tools/sync-module-labels.ts && node tools/sync-org-issue-fields.ts",
334
333
  "labels:show-commands": "node tools/sync-module-labels.ts --show-commands",
335
- "release:prepare": "node tools/prepare-release.ts",
336
- "release:publish": "node tools/publish-release.ts",
337
334
  "start": "node lib/renovate.ts",
338
335
  "test": "run-s lint test-schema jest",
339
336
  "test-dirty": "git diff --exit-code",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.196.0 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.197.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.196.0",
5
+ "x-renovate-version": "44.197.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {